小黄
4 years ago
15 changed files with 530 additions and 0 deletions
-
3.gitignore
-
32go.mod
-
15main.go
-
1modelgen/cmd.go
-
29modelgen/gen.go
-
25servicegen/cmd.go
-
183servicegen/gen.go
-
26servicegen/tmpl.go
-
18servicegen/tmpl/api.tmpl
-
54servicegen/tmpl/api_pre.tmpl
-
18servicegen/tmpl/api_task.tmpl
-
31servicegen/tmpl/api_test.tmpl
-
91servicegen/tmpl/db_model.tmpl
-
1servicegen/tmpl/external.tmpl
-
3servicegen/tmpl/options.tmpl
@ -0,0 +1,3 @@ |
|||||
|
.idea |
||||
|
*.log |
||||
|
*.exe |
@ -0,0 +1,32 @@ |
|||||
|
module demo |
||||
|
|
||||
|
go 1.14 |
||||
|
|
||||
|
require ( |
||||
|
git.ouxuan.net/hasaki-service/hasaki-sdk v0.0.0-20210302071131-cb2b8d8c4800 |
||||
|
github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.2 // indirect |
||||
|
github.com/apache/thrift v0.12.0 // indirect |
||||
|
github.com/davecgh/go-spew v1.1.1 // indirect |
||||
|
github.com/fsnotify/fsnotify v1.4.9 // indirect |
||||
|
github.com/golang/protobuf v1.4.3 // indirect |
||||
|
github.com/golang/snappy v0.0.3 // indirect |
||||
|
github.com/jinzhu/gorm v1.9.16 // indirect |
||||
|
github.com/magiconair/properties v1.8.5 // indirect |
||||
|
github.com/mitchellh/mapstructure v1.4.1 // indirect |
||||
|
github.com/openzipkin/zipkin-go v0.1.6 // indirect |
||||
|
github.com/pelletier/go-toml v1.9.0 // indirect |
||||
|
github.com/spf13/afero v1.6.0 // indirect |
||||
|
github.com/spf13/cast v1.3.1 // indirect |
||||
|
github.com/spf13/cobra v1.1.3 // indirect |
||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect |
||||
|
github.com/spf13/viper v1.7.1 // indirect |
||||
|
github.com/tal-tech/go-zero v1.1.4 |
||||
|
github.com/xuri/efp v0.0.0-20210128032744-13be4fd5dcb5 // indirect |
||||
|
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect |
||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect |
||||
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect |
||||
|
golang.org/x/text v0.3.6 // indirect |
||||
|
gopkg.in/ini.v1 v1.62.0 // indirect |
||||
|
xorm.io/builder v0.3.9 // indirect |
||||
|
xorm.io/xorm v1.0.7 // indirect |
||||
|
) |
@ -0,0 +1,15 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"demo/servicegen" |
||||
|
"github.com/spf13/cobra" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
rootCmd := cobra.Command{Use: "hskctl"} |
||||
|
rootCmd.AddCommand(servicegen.Command()) |
||||
|
err := rootCmd.Execute() |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
package modelgen |
@ -0,0 +1,29 @@ |
|||||
|
package modelgen |
||||
|
|
||||
|
import ( |
||||
|
"git.ouxuan.net/hasaki-service/hasaki-sdk/hskdb" |
||||
|
"time" |
||||
|
"xorm.io/xorm" |
||||
|
) |
||||
|
|
||||
|
type Model struct { |
||||
|
Id int `json:"id"` |
||||
|
CreatedAt time.Time `json:"created_at"` |
||||
|
UpdatedAt time.Time `json:"updated_at"` |
||||
|
DeletedAt time.Time `json:"deleted_at"` |
||||
|
} |
||||
|
|
||||
|
type Context struct { |
||||
|
session *xorm.Session |
||||
|
instance interface{} |
||||
|
} |
||||
|
|
||||
|
type UserModel struct { |
||||
|
} |
||||
|
|
||||
|
func (u *UserModel) Objects() *Context { |
||||
|
return &Context{ |
||||
|
session: hskdb.GetXormAuto().NewSession(), |
||||
|
instance: u, |
||||
|
} |
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
package servicegen |
||||
|
|
||||
|
import ( |
||||
|
"github.com/spf13/cobra" |
||||
|
"log" |
||||
|
) |
||||
|
|
||||
|
func Command() *cobra.Command { |
||||
|
newCmd := &cobra.Command{ |
||||
|
Use: "new [string to new]", |
||||
|
Short: "create service for hasaki", |
||||
|
Args: cobra.MinimumNArgs(1), |
||||
|
Run: func(cmd *cobra.Command, args []string) { |
||||
|
err := Gen(args[0]) |
||||
|
if err != nil { |
||||
|
log.Printf("Error: %+v\n", err) |
||||
|
} |
||||
|
}, |
||||
|
} |
||||
|
serviceCmd := &cobra.Command{ |
||||
|
Use: "service", |
||||
|
Short: "service command"} |
||||
|
serviceCmd.AddCommand(newCmd) |
||||
|
return serviceCmd |
||||
|
} |
@ -0,0 +1,183 @@ |
|||||
|
package servicegen |
||||
|
|
||||
|
import ( |
||||
|
"os" |
||||
|
"path/filepath" |
||||
|
"text/template" |
||||
|
) |
||||
|
|
||||
|
/* 生成整个项目结构 |
||||
|
- hasaki-service-app |
||||
|
- hasaki-app |
||||
|
- api.go |
||||
|
- api_pre.go |
||||
|
- api_test.go |
||||
|
- api_task.go |
||||
|
- db_model.go |
||||
|
- handler.go |
||||
|
- initialize.go |
||||
|
- hasaki-app-options |
||||
|
- options.go |
||||
|
- hasaki-app-external |
||||
|
- external.go |
||||
|
*/ |
||||
|
func Gen(name string) error { |
||||
|
err := genService(name) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = genApp(name) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = genOptions(name) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = genExternal(name) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func genService(appName string) error { |
||||
|
rootDir, err := getRootDir(appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
err = os.Mkdir(rootDir, os.ModeDir) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func genApp(appName string) error { |
||||
|
appDir, err := getAppDir(appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
err = os.Mkdir(appDir, os.ModeDir) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
// api.go
|
||||
|
err = parseTmpl(apiTmpl, filepath.Join(appDir, "api.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
// api_pre.go
|
||||
|
err = parseTmpl(apiPreTmpl, filepath.Join(appDir, "api_pre.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
// api_task.go
|
||||
|
err = parseTmpl(apiTaskTmpl, filepath.Join(appDir, "api_task.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
// api_test.go
|
||||
|
err = parseTmpl(apiTestTmpl, filepath.Join(appDir, "api_test.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
err = parseTmpl(dbModelTmpl, filepath.Join(appDir, "db_model.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func genOptions(appName string) error { |
||||
|
optionsDir, err := getOptionsDir(appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = os.Mkdir(optionsDir, os.ModeDir) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = parseTmpl(optionsTmpl, filepath.Join(optionsDir, "options.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func genExternal(appName string) error { |
||||
|
externalDir, err := getExternal(appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = os.Mkdir(externalDir, os.ModeDir) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = parseTmpl(externalTmpl, filepath.Join(externalDir, "extenral.go"), appName) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func getRootDir(appName string) (string, error) { |
||||
|
rootDir := "hasaki-service-" + appName |
||||
|
pwd, err := os.Getwd() |
||||
|
if err != nil { |
||||
|
return "", err |
||||
|
} |
||||
|
path := filepath.Join(pwd, rootDir) |
||||
|
return path, nil |
||||
|
} |
||||
|
|
||||
|
func getAppDir(appName string) (string, error) { |
||||
|
appDir := "hasaki_" + appName |
||||
|
rootDir, err := getRootDir(appName) |
||||
|
if err != nil { |
||||
|
return "", err |
||||
|
} |
||||
|
path := filepath.Join(rootDir, appDir) |
||||
|
return path, nil |
||||
|
} |
||||
|
|
||||
|
func getOptionsDir(appName string) (string, error) { |
||||
|
optionsDir := "hasaki_" + appName + "_options" |
||||
|
rootDir, err := getRootDir(appName) |
||||
|
if err != nil { |
||||
|
return "", err |
||||
|
} |
||||
|
path := filepath.Join(rootDir, optionsDir) |
||||
|
return path, nil |
||||
|
} |
||||
|
|
||||
|
func getExternal(appName string) (string, error) { |
||||
|
externalDir := "hasaki_" + appName + "_external" |
||||
|
rootDir, err := getRootDir(appName) |
||||
|
if err != nil { |
||||
|
return "", err |
||||
|
} |
||||
|
path := filepath.Join(rootDir, externalDir) |
||||
|
return path, nil |
||||
|
} |
||||
|
|
||||
|
func parseTmpl(tmpl *template.Template, file string, appName string) error { |
||||
|
f, err := os.Create(file) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
err = tmpl.Execute(f, map[string]interface{}{"app_name": appName}) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
return nil |
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
package servicegen |
||||
|
|
||||
|
import ( |
||||
|
"path/filepath" |
||||
|
"text/template" |
||||
|
) |
||||
|
|
||||
|
var ( |
||||
|
apiTmpl *template.Template |
||||
|
apiPreTmpl *template.Template |
||||
|
apiTaskTmpl *template.Template |
||||
|
apiTestTmpl *template.Template |
||||
|
dbModelTmpl *template.Template |
||||
|
optionsTmpl *template.Template |
||||
|
externalTmpl *template.Template |
||||
|
) |
||||
|
|
||||
|
func init() { |
||||
|
apiTmpl = template.Must(template.ParseFiles(filepath.Join("servicegen/tmpl/api.tmpl"))) |
||||
|
apiPreTmpl = template.Must(template.ParseFiles("servicegen/tmpl/api_pre.tmpl")) |
||||
|
apiTaskTmpl = template.Must(template.ParseFiles("servicegen/tmpl/api_task.tmpl")) |
||||
|
apiTestTmpl = template.Must(template.ParseFiles("servicegen/tmpl/api_test.tmpl")) |
||||
|
dbModelTmpl = template.Must(template.ParseFiles("servicegen/tmpl/db_model.tmpl")) |
||||
|
optionsTmpl = template.Must(template.ParseFiles("servicegen/tmpl/external.tmpl")) |
||||
|
externalTmpl = template.Must(template.ParseFiles("servicegen/tmpl/options.tmpl")) |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
package hasaki_{{.app_name}} |
||||
|
|
||||
|
import "git.ouxuan.net/hasaki-service/hasaki-sdk/hskdb" |
||||
|
|
||||
|
func InitDb(config interface{}) (err error) { |
||||
|
if config == nil { |
||||
|
err = hskdb.XormSync2() |
||||
|
if err != nil { |
||||
|
return |
||||
|
} |
||||
|
} else { //分库 |
||||
|
err = hskdb.XormSync2(config) |
||||
|
if err != nil { |
||||
|
return |
||||
|
} |
||||
|
} |
||||
|
return |
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
package hasaki_{{.app_name}} |
||||
|
|
||||
|
import ( |
||||
|
"git.ouxuan.net/hasaki-service/hasaki-sdk/hskdb" |
||||
|
"git.ouxuan.net/hasaki-service/hasaki-service-{{.app_name}}/hasaki_{{.app_name}}_options" |
||||
|
"xorm.io/xorm" |
||||
|
) |
||||
|
|
||||
|
type Api struct { |
||||
|
db *xorm.Engine |
||||
|
config interface{} |
||||
|
session *xorm.Session |
||||
|
} |
||||
|
|
||||
|
func NewApi(dbs ...*xorm.Engine) *Api { |
||||
|
var db *xorm.Engine |
||||
|
if len(dbs) > 0 { |
||||
|
db = dbs[0] |
||||
|
} else { |
||||
|
db = hskdb.GetXormAuto() |
||||
|
} |
||||
|
return &Api{ |
||||
|
db: db, |
||||
|
session: db.NewSession(), |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (api *Api) SetSession(s *xorm.Session) { |
||||
|
api.session = s |
||||
|
} |
||||
|
|
||||
|
func (api *Api) NewSession() *xorm.Session { |
||||
|
return api.session |
||||
|
} |
||||
|
|
||||
|
func GetApi(ctx interface{}) *Api { |
||||
|
config := hasaki_value_card_options.GetMysqlConfig(ctx) |
||||
|
if config == nil { |
||||
|
api := NewApi(hskdb.GetXormAuto()) |
||||
|
return api |
||||
|
} else { |
||||
|
api := NewApi(hskdb.GetXormAuto(config)) |
||||
|
api.config = config |
||||
|
return api |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (api *Api) InitDb() (err error) { |
||||
|
return InitDb(api.config) |
||||
|
} |
||||
|
|
||||
|
func InitDbByConfig(config interface{}) (err error) { |
||||
|
return InitDb(config) |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
package hasaki_{{.app_name}} |
||||
|
|
||||
|
import ( |
||||
|
"errors" |
||||
|
"fmt" |
||||
|
"git.ouxuan.net/hasaki-service/hasaki-service-ticker-task/hasaki_ticker_task" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
const TestTaskType = "test_task_type" |
||||
|
|
||||
|
func TestTask(item *hasaki_ticker_task.TickerTaskItem) error { |
||||
|
if item == nil || item.Data == nil { |
||||
|
return errors.New("数据异常") |
||||
|
} |
||||
|
// TODO: do some task... |
||||
|
return nil |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
package hasaki_{{.app_name}} |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"log" |
||||
|
"testing" |
||||
|
|
||||
|
"git.ouxuan.net/hasaki-service/hasaki-sdk/hskconfig" |
||||
|
"git.ouxuan.net/hasaki-service/hasaki-sdk/hskdb" |
||||
|
) |
||||
|
|
||||
|
var branch interface{} = "branch_brand_63" |
||||
|
|
||||
|
var api *Api |
||||
|
|
||||
|
func init() { |
||||
|
|
||||
|
hskconfig.NotFlag() |
||||
|
hskconfig.SetGolbalConfigFileName("E:\test.json") |
||||
|
|
||||
|
hskdb.IsAsyncToXormSync2 = false |
||||
|
api = NewApi(hskdb.GetXormAuto(branch)) |
||||
|
err := InitDbByConfig(branch) |
||||
|
if err != nil { |
||||
|
log.Fatalln(err) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func TestNewApi(t *testing.T) { |
||||
|
// TODO: some test case... |
||||
|
} |
@ -0,0 +1,91 @@ |
|||||
|
package hasaki_{{.app_name}} |
||||
|
|
||||
|
import ( |
||||
|
"errors" |
||||
|
"git.ouxuan.net/hasaki-service/hasaki-sdk/hsktime" |
||||
|
"strconv" |
||||
|
"xorm.io/xorm" |
||||
|
) |
||||
|
|
||||
|
type Model struct { |
||||
|
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` |
||||
|
CreatedAt hsktime.Time `json:"created_at" xorm:"created comment('创建时间')"` |
||||
|
UpdatedAt hsktime.Time `json:"updated_at" xorm:"updated comment('更新时间')"` |
||||
|
DeletedAt hsktime.Time `json:"-" xorm:"deleted comment('是否删除') TIMESTAMP INDEX"` |
||||
|
session *xorm.Session `xorm:"-"` |
||||
|
instance interface{} `xorm:"-"` |
||||
|
} |
||||
|
|
||||
|
func (m *Model) checkInstance() error { |
||||
|
if m.instance == nil { |
||||
|
return errors.New("instance 未实例化") |
||||
|
} |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
func (m *Model) SetInstance(instance interface{}) { |
||||
|
m.instance = instance |
||||
|
} |
||||
|
|
||||
|
// 增删改查 |
||||
|
func (m *Model) Save(cols ...string) (int64, error) { |
||||
|
err := m.checkInstance() |
||||
|
if err != nil { |
||||
|
return 0, err |
||||
|
} |
||||
|
if m.Id > 0 { |
||||
|
if len(cols) > 0 { |
||||
|
return m.session.Cols(cols...).Update(m.instance) |
||||
|
} else { |
||||
|
return m.session.AllCols().Update(m.session) |
||||
|
} |
||||
|
} else { |
||||
|
return m.session.InsertOne(m.instance) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (m *Model) Del() (int64, error) { |
||||
|
err := m.checkInstance() |
||||
|
if err != nil { |
||||
|
return 0, err |
||||
|
} |
||||
|
return m.session.ID(m.Id).Delete(m.instance) |
||||
|
} |
||||
|
|
||||
|
func (m *Model) Get() (bool, error) { |
||||
|
err := m.checkInstance() |
||||
|
if err != nil { |
||||
|
return false, err |
||||
|
} |
||||
|
return m.session.Unscoped().Get(m.instance) |
||||
|
} |
||||
|
|
||||
|
//分页 cond["page"] 第几页 cond["page_size"] 多少条 |
||||
|
func Page(cond map[string]string, s *xorm.Session) *xorm.Session { |
||||
|
if cond["page_size"] != "" { |
||||
|
size, _ := strconv.Atoi(cond["page_size"]) |
||||
|
page, _ := strconv.Atoi(cond["page"]) |
||||
|
if page <= 0 { |
||||
|
page = 0 |
||||
|
} else { |
||||
|
page = page - 1 |
||||
|
} |
||||
|
s = s.Limit(size, page*size) |
||||
|
} |
||||
|
return s |
||||
|
} |
||||
|
|
||||
|
func Like(col, key string, s *xorm.Session) *xorm.Session { |
||||
|
if key != "" { |
||||
|
s = s.Where(col+" like ?", "%"+key+"%") |
||||
|
} |
||||
|
return s |
||||
|
} |
||||
|
|
||||
|
|
||||
|
func JsonContains(col, key string, s *xorm.Session) *xorm.Session { |
||||
|
if key != "" { |
||||
|
s = s.Where(`JSON_CONTAINS(` + col + `, '` + key + `', '$')`) |
||||
|
} |
||||
|
return s |
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
package hasaki_{{.app_name}}_external |
@ -0,0 +1,3 @@ |
|||||
|
package hasaki_{{.app_name}}_options |
||||
|
|
||||
|
var GetMysqlConfig = func(interface{}) interface{} { return nil } |
Write
Preview
Loading…
Cancel
Save
Reference in new issue