提交 c1a25330 编写于 作者: aaronchen2k2k's avatar aaronchen2k2k

init 3.0

上级 e0141439
Version = 2.2
Version = 2.2
Language = zh
......@@ -34,19 +34,19 @@ build_ui:
compile_win64:
@echo 'start compile win64'
@CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build -x -v -ldflags "-s -w" -o ${BIN_WIN64}${BINARY}.exe src/zd.go
@CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build -x -v -ldflags "-s -w" -o ${BIN_WIN64}${BINARY}.exe cmd/command/main.go
compile_win32:
@echo 'start compile win32'
@CGO_ENABLED=1 CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++ GOOS=windows GOARCH=386 go build -x -v -ldflags "-s -w" -o ${BIN_WIN32}${BINARY}.exe src/zd.go
@CGO_ENABLED=1 CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++ GOOS=windows GOARCH=386 go build -x -v -ldflags "-s -w" -o ${BIN_WIN32}${BINARY}.exe cmd/command/main.go
compile_linux:
@echo 'start compile linux'
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc CXX=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-g++ go build -o ${BIN_LINUX}${BINARY} src/zd.go
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc CXX=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-g++ go build -o ${BIN_LINUX}${BINARY} cmd/command/main.go
compile_mac:
@echo 'start compile mac'
@CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -o ${BIN_MAC}${BINARY} src/zd.go
@CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -o ${BIN_MAC}${BINARY} cmd/command/main.go
copy_files:
@echo 'start copy files'
......
......@@ -9,24 +9,16 @@ import (
constant "github.com/easysoft/zendata/internal/pkg/const"
"github.com/easysoft/zendata/internal/pkg/gen"
"github.com/easysoft/zendata/internal/pkg/helper"
"github.com/easysoft/zendata/internal/server"
serverConfig "github.com/easysoft/zendata/internal/server/config"
serverUtils "github.com/easysoft/zendata/internal/server/utils"
commonUtils "github.com/easysoft/zendata/pkg/utils/common"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
i118Utils "github.com/easysoft/zendata/pkg/utils/i118"
logUtils "github.com/easysoft/zendata/pkg/utils/log"
stringUtils "github.com/easysoft/zendata/pkg/utils/string"
"github.com/easysoft/zendata/pkg/utils/vari"
"github.com/easysoft/zendata/res"
assetfs "github.com/elazarl/go-bindata-assetfs"
"github.com/fatih/color"
"io/ioutil"
"net/http"
"os"
"os/signal"
"path/filepath"
"strconv"
"strings"
"syscall"
"time"
......@@ -36,10 +28,10 @@ var (
configs []string
defaultFile string
configFile string
// content
defaultDefContent []byte
configDefContent []byte
//count int
fields string
root string
......@@ -253,77 +245,6 @@ func toGen(files []string) {
}
}
func startServer() {
if vari.Ip == "" {
vari.Ip = commonUtils.GetIp()
}
if vari.Port == 0 {
vari.Port = constant.DefaultPort
}
port := strconv.Itoa(vari.Port)
logUtils.PrintToWithColor(i118Utils.I118Prt.Sprintf("start_server",
vari.Ip, port, vari.Ip, port, vari.Ip, port), color.FgCyan)
// start admin server
config := serverConfig.NewConfig()
server, err := server.InitServer(config)
if err != nil {
logUtils.PrintToWithColor(i118Utils.I118Prt.Sprintf("start_server_fail", port), color.FgRed)
}
httpServer := &http.Server{
Addr: fmt.Sprintf(":%d", server.Config.ServerPort),
Handler: Handler(server),
}
httpServer.ListenAndServe()
}
func Handler(s *server.Server) http.Handler {
mux := http.NewServeMux()
mux.Handle("/", http.FileServer( // client static
&assetfs.AssetFS{Asset: res.Asset, AssetDir: res.AssetDir, AssetInfo: res.AssetInfo, Prefix: "ui/dist"}))
mux.HandleFunc("/admin", s.Admin) // data admin
mux.HandleFunc("/data", DataHandler) // data gen
return mux
}
func DataHandler(writer http.ResponseWriter, req *http.Request) {
logUtils.HttpWriter = writer
if req.Method == http.MethodGet {
defaultFile, configFile, fields, vari.Total,
vari.Format, vari.Trim, vari.Table, decode, input, vari.Out = serverUtils.ParseGenParams(req)
} else if req.Method == http.MethodPost {
defaultDefContent, configDefContent, fields, vari.Total,
vari.Format, vari.Trim, vari.Table, decode, input, vari.Out = serverUtils.ParseGenParamsToByte(req)
}
if decode {
files := []string{defaultFile, configFile}
gen.Decode(files, fields, input)
} else if defaultDefContent != nil || configDefContent != nil {
vari.RunMode = constant.RunModeServerRequest
logUtils.PrintToWithoutNewLine(i118Utils.I118Prt.Sprintf("server_request", req.Method, req.URL))
toGen(nil)
// Avoid variable affecting the results of request.
defaultDefContent = nil
configDefContent = nil
} else if defaultFile != "" || configFile != "" {
vari.RunMode = constant.RunModeServerRequest
logUtils.PrintToWithoutNewLine(i118Utils.I118Prt.Sprintf("server_request", req.Method, req.URL))
toGen(nil)
// Avoid variable affecting the results of request.
defaultFile = ""
configFile = ""
}
}
func init() {
cleanup()
}
......
......@@ -3,13 +3,11 @@ package main
import (
"flag"
"fmt"
"github.com/easysoft/zendata/internal/pkg/action"
"github.com/easysoft/zendata/internal/agent"
configUtils "github.com/easysoft/zendata/internal/pkg/config"
constant "github.com/easysoft/zendata/internal/pkg/const"
"github.com/easysoft/zendata/internal/pkg/gen"
"github.com/easysoft/zendata/internal/server"
serverConfig "github.com/easysoft/zendata/internal/server/config"
serverUtils "github.com/easysoft/zendata/internal/server/utils"
serverConst "github.com/easysoft/zendata/internal/server/utils/const"
commonUtils "github.com/easysoft/zendata/pkg/utils/common"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
......@@ -24,24 +22,11 @@ import (
"os/signal"
"strconv"
"syscall"
"time"
)
var (
configs []string
defaultFile string
configFile string
// content
defaultDefContent []byte
configDefContent []byte
//count int
fields string
root string
input string
decode bool
flagSet *flag.FlagSet
root string
)
func main() {
......@@ -100,74 +85,16 @@ func startServer() {
httpServer.ListenAndServe()
}
func handler(s *server.Server) http.Handler {
func handler(server *server.Server) http.Handler {
mux := http.NewServeMux()
mux.Handle("/", http.FileServer( // client static
mux.Handle("/", http.FileServer(
&assetfs.AssetFS{Asset: res.Asset, AssetDir: res.AssetDir, AssetInfo: res.AssetInfo, Prefix: "ui/dist"}))
mux.HandleFunc("/admin", s.Admin) // data admin
mux.HandleFunc("/data", dataHandler) // data gen
return mux
}
func dataHandler(writer http.ResponseWriter, req *http.Request) {
logUtils.HttpWriter = writer
if req.Method == http.MethodGet {
defaultFile, configFile, fields, vari.Total,
vari.Format, vari.Trim, vari.Table, decode, input, vari.Out = serverUtils.ParseGenParams(req)
} else if req.Method == http.MethodPost {
defaultDefContent, configDefContent, fields, vari.Total,
vari.Format, vari.Trim, vari.Table, decode, input, vari.Out = serverUtils.ParseGenParamsToByte(req)
}
if decode {
files := []string{defaultFile, configFile}
gen.Decode(files, fields, input)
} else if defaultDefContent != nil || configDefContent != nil {
vari.RunMode = constant.RunModeServerRequest
logUtils.PrintToWithoutNewLine(i118Utils.I118Prt.Sprintf("server_request", req.Method, req.URL))
genData()
// Avoid variable affecting the results of request.
defaultDefContent = nil
configDefContent = nil
mux.HandleFunc("/admin", server.AdminHandler)
mux.HandleFunc("/data", agent.DataHandler)
} else if defaultFile != "" || configFile != "" {
vari.RunMode = constant.RunModeServerRequest
logUtils.PrintToWithoutNewLine(i118Utils.I118Prt.Sprintf("server_request", req.Method, req.URL))
genData()
// Avoid variable affecting the results of request.
defaultFile = ""
configFile = ""
}
}
func genData() {
tmStart := time.Now()
if vari.Verbose {
logUtils.PrintTo(fmt.Sprintf("Start at %s.", tmStart.Format("2006-01-02 15:04:05")))
}
vari.Format = constant.FormatJson
if defaultFile != "" || configFile != "" {
files := []string{defaultFile, configFile}
action.Generate(files, fields, vari.Format, vari.Table)
} else {
contents := [][]byte{defaultDefContent, configDefContent}
action.GenerateByContent(contents, fields, vari.Format, vari.Table)
}
tmEnd := time.Now()
if vari.Verbose {
logUtils.PrintTo(fmt.Sprintf("End at %s.", tmEnd.Format("2006-01-02 15:04:05")))
dur := tmEnd.Unix() - tmStart.Unix()
logUtils.PrintTo(fmt.Sprintf("Duriation %d sec.", dur))
}
return mux
}
func init() {
......
......@@ -19,7 +19,7 @@ fields:
postfix: "\t"
- field: field_use_excel # 从excel数据源里面取数据。
from: address.cn.v1.china2 # 从data/address/v1.xlsx文件中读取名为china的工作簿。
from: address.cn.v1.china # 从data/address/v1.xlsx文件中读取名为china的工作簿。
select: city # 查询city字段。
where: state like '%山东%' # 条件是省份包含山东。
rand: true # 随机取数据
......
......@@ -22,6 +22,7 @@ require (
github.com/golang/snappy v0.0.3 // indirect
github.com/gopherjs/gopherjs v0.0.0-20210202160940-bed99a852dfe // indirect
github.com/jinzhu/copier v0.2.5
github.com/kataras/iris/v12 v12.1.8 // indirect
github.com/klauspost/compress v1.11.12 // indirect
github.com/klauspost/pgzip v1.2.5 // indirect
github.com/kr/text v0.2.0 // indirect
......@@ -33,6 +34,7 @@ require (
github.com/rivo/uniseg v0.2.0 // indirect
github.com/robfig/cron/v3 v3.0.1
github.com/satori/go.uuid v1.2.0
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
github.com/smartystreets/assertions v1.2.0 // indirect
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/ulikunitz/xz v0.5.10 // indirect
......
此差异已折叠。
package agent
import (
"fmt"
"github.com/easysoft/zendata/internal/pkg/action"
constant "github.com/easysoft/zendata/internal/pkg/const"
"github.com/easysoft/zendata/internal/pkg/gen"
serverUtils "github.com/easysoft/zendata/internal/server/utils"
i118Utils "github.com/easysoft/zendata/pkg/utils/i118"
logUtils "github.com/easysoft/zendata/pkg/utils/log"
"github.com/easysoft/zendata/pkg/utils/vari"
"net/http"
"time"
)
var (
configs []string
defaultFile string
configFile string
defaultDefContent []byte
configDefContent []byte
fields string
input string
decode bool
)
func DataHandler(writer http.ResponseWriter, req *http.Request) {
logUtils.HttpWriter = writer
if req.Method == http.MethodGet {
defaultFile, configFile, fields, vari.Total,
vari.Format, vari.Trim, vari.Table, decode, input, vari.Out = serverUtils.ParseGenParams(req)
} else if req.Method == http.MethodPost {
defaultDefContent, configDefContent, fields, vari.Total,
vari.Format, vari.Trim, vari.Table, decode, input, vari.Out = serverUtils.ParseGenParamsToByte(req)
}
if decode {
files := []string{defaultFile, configFile}
gen.Decode(files, fields, input)
return
}
if defaultDefContent != nil || configDefContent != nil {
vari.RunMode = constant.RunModeServerRequest
logUtils.PrintToWithoutNewLine(i118Utils.I118Prt.Sprintf("server_request", req.Method, req.URL))
genData()
// Avoid variable affecting the results of request.
defaultDefContent = nil
configDefContent = nil
} else if defaultFile != "" || configFile != "" {
vari.RunMode = constant.RunModeServerRequest
logUtils.PrintToWithoutNewLine(i118Utils.I118Prt.Sprintf("server_request", req.Method, req.URL))
genData()
// Avoid variable affecting the results of request.
defaultFile = ""
configFile = ""
}
}
func genData() {
tmStart := time.Now()
if vari.Verbose {
logUtils.PrintTo(fmt.Sprintf("Start at %s.", tmStart.Format("2006-01-02 15:04:05")))
}
vari.Format = constant.FormatJson
if defaultFile != "" || configFile != "" {
files := []string{defaultFile, configFile}
action.Generate(files, fields, vari.Format, vari.Table)
} else {
contents := [][]byte{defaultDefContent, configDefContent}
action.GenerateByContent(contents, fields, vari.Format, vari.Table)
}
tmEnd := time.Now()
if vari.Verbose {
logUtils.PrintTo(fmt.Sprintf("End at %s.", tmEnd.Format("2006-01-02 15:04:05")))
dur := tmEnd.Unix() - tmStart.Unix()
logUtils.PrintTo(fmt.Sprintf("Duriation %d sec.", dur))
}
}
\ No newline at end of file
......@@ -62,3 +62,14 @@ func (c ResultStatus) String() string {
return "UNKNOWN"
}
type ResponseCode struct {
Code int64 `json:"code"`
Message string `json:"message"`
}
var (
Success = ResponseCode{0, "Request Successfully"}
CommErr = ResponseCode{100, "Common Error"}
ParamErr = ResponseCode{200, "Parameter Error"}
)
\ No newline at end of file
package domain
// Response
type Response struct {
Code int64 `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
type BizError struct {
Code int64
Msg string
}
package controller
import (
constant "github.com/easysoft/zendata/internal/pkg/const"
"github.com/easysoft/zendata/internal/pkg/domain"
)
type BaseCtrl struct {
}
func NewBaseCtrl() *BaseCtrl {
return &BaseCtrl{}
}
func (c *BaseCtrl) SuccessResp(data interface{}) (ret domain.Response) {
ret = domain.Response{Code: constant.Success.Code, Data: data}
return
}
func (c *BaseCtrl) ErrResp(respCode constant.ResponseCode, msg string) (ret domain.Response) {
ret = domain.Response{Code: respCode.Code, Msg: c.ErrMsg(respCode, msg)}
return
}
func (c *BaseCtrl) BizErrResp(err *domain.BizError, msg string) (ret domain.Response) {
ret = domain.Response{Code: err.Code, Msg: msg}
return
}
func (c *BaseCtrl) ErrMsg(err constant.ResponseCode, msg string) (ret string) {
ret += msg
return
}
package controller
import (
constant "github.com/easysoft/zendata/internal/pkg/const"
"github.com/easysoft/zendata/internal/pkg/model"
serverService "github.com/easysoft/zendata/internal/server/service"
"github.com/kataras/iris/v12"
)
type DefCtrl struct {
DefService *serverService.DefService `inject:""`
BaseCtrl
}
func NewDefCtrl() *DefCtrl {
return &DefCtrl{}
}
func (c *DefCtrl) List(ctx iris.Context) {
req := model.ReqData{}
if err := ctx.ReadQuery(&req); err != nil {
ctx.JSON(c.ErrResp(constant.CommErr, err.Error()))
return
}
data, total := c.DefService.List(req.Keywords, req.Page)
ctx.JSON(c.SuccessResp(iris.Map{"data": data, "total": total}))
}
func (c *DefCtrl) Get(ctx iris.Context) {
//id, err := ctx.Params().GetInt("id")
//if err != nil {
// ctx.JSON(c.ErrResp(commConsts.CommErr, err.Error()))
// return
//}
//
//po, err := c.DefService.Get(uint(id))
//if err != nil {
// ctx.JSON(c.ErrResp(commConsts.CommErr, err.Error()))
// return
//}
//ctx.JSON(c.SuccessResp(po))
}
func (c *DefCtrl) Create(ctx iris.Context) {
//req := model.Def{}
//if err := ctx.ReadJSON(&req); err != nil {
// ctx.JSON(c.ErrResp(commConsts.ParamErr, err.Error()))
//}
//
//id, err := c.DefService.Create(req)
//if err != nil {
// ctx.JSON(c.ErrResp(commConsts.ErrZentaoConfig, err.Error()))
// return
//}
//
//ctx.JSON(c.SuccessResp(iris.Map{"id": id}))
}
func (c *DefCtrl) Update(ctx iris.Context) {
//req := model.Def{}
//if err := ctx.ReadJSON(&req); err != nil {
// ctx.JSON(c.ErrResp(commConsts.ParamErr, err.Error()))
//}
//
//err := c.DefService.Update(req)
//if err != nil {
// ctx.JSON(c.ErrResp(commConsts.ErrZentaoConfig, err.Error()))
// return
//}
//
//ctx.JSON(c.SuccessResp(iris.Map{"id": req.ID}))
}
func (c *DefCtrl) Delete(ctx iris.Context) {
//id, err := ctx.Params().GetInt("id")
//if err != nil {
// ctx.JSON(c.ErrResp(commConsts.CommErr, err.Error()))
// return
//}
//
//err = c.DefService.Delete(uint(id))
//if err != nil {
// ctx.JSON(c.ErrResp(commConsts.CommErr, err.Error()))
// return
//}
//
//ctx.JSON(c.SuccessResp(nil))
}
package module
import (
"github.com/kataras/iris/v12"
)
// InitDBFunc 数据化初始化接口
type InitDBFunc interface {
Init() (err error)
}
// WebModule web 模块结构
// - RelativePath 关联路径
// - Handler 模块 Handler
// - Modules 子模块
type WebModule struct {
RelativePath string
Handler func(p iris.Party)
Modules []WebModule
}
// NewModule 添加新的模块
func NewModule(relativePath string, handler func(index iris.Party), modules ...WebModule) WebModule {
return WebModule{
RelativePath: relativePath,
Handler: handler,
Modules: modules,
}
}
// GetModules 获取模块列表
func (wm *WebModule) GetModules() []WebModule {
return wm.Modules
}
package index
import (
"github.com/easysoft/zendata/internal/server/controller"
"github.com/easysoft/zendata/internal/server/core/module"
"github.com/kataras/iris/v12"
)
type DefModule struct {
DefCtrl *controller.DefCtrl `inject:""`
}
func NewDefModule() *DefModule {
return &DefModule{}
}
// Party 执行
func (m *DefModule) Party() module.WebModule {
handler := func(index iris.Party) {
index.Get("/", m.DefCtrl.List).Name = "列表"
index.Get("/{id:int}", m.DefCtrl.Get).Name = "详情"
index.Post("/", m.DefCtrl.Create).Name = "新建"
index.Put("/{id:int}", m.DefCtrl.Update).Name = "更新"
index.Delete("/{id:int}", m.DefCtrl.Delete).Name = "删除"
index.Post("/sync", m.DefCtrl.Create).Name = "同步"
}
return module.NewModule("/sites", handler)
}
......@@ -56,7 +56,7 @@ func InitServer(config *serverConfig.Config) (server *Server, err error) {
return
}
func (s *Server) Admin(writer http.ResponseWriter, req *http.Request) {
func (s *Server) AdminHandler(writer http.ResponseWriter, req *http.Request) {
serverUtils.SetupCORS(&writer, req)
bytes, err := ioutil.ReadAll(req.Body)
......@@ -259,6 +259,7 @@ func (s *Server) Admin(writer http.ResponseWriter, req *http.Request) {
ret.Code = 0
ret.Msg = "api not found"
}
if err != nil {
ret.Code = 0
ret.Msg = "api error: " + err.Error()
......
import notification from 'ant-design-vue/es/notification'
import axios from 'axios'
import axios, {AxiosInstance} from 'axios'
import { VueAxios } from './axios'
const request = axios.create({
baseURL: getUrl(),
timeout: 100000,
})
let request = null
initRequest()
// used to switch to another remote service
function initRequest(remoteUrl) {
const url = remoteUrl ? remoteUrl : getUrl()
request = axios.create({
baseURL: url,
timeout: 100000,
})
}
function getUrl() {
let url = ''
......
测试环境:
型号名称: MacBook Pro
处理器名称: 八核Intel Core i9
处理器速度: 2.3 GHz
处理器数目: 1
核总数: 8
内存: 16 GB
1. 基本区间和随机生成耗时
配置:demo/04_rand.yaml
数量:10000
命令:./zd demo/04_rand.yaml -n 100000 --verbose
耗时:2 sec
2. 引用实例ip.v1.yaml生成耗时
配置:demo/16_from_instance.yaml
数量: 10000
命令:./zd demo/16_from_instance.yaml -F field_use_instance -n 100000 --verbose
耗时: 5 sec
3. 引用Excel数据生成耗时
配置:demo/19_from_excel.yaml
数量: 10000
命令:./zd demo/19_from_excel.yaml -F field_use_excel -n 100000 --verbose
耗时:2 sec
4. 综合例子生成耗时
配置:demo/19_from_excel.yaml
数量: 10000
命令:./zd demo/default.yaml -n 100000 --verbose
耗时:12 sec
5. 综合例子百万级生成耗时
配置:demo/19_from_excel.yaml
数量: 10000
命令:./zd demo/default.yaml -n 1000000 --verbose
耗时:123 sec
6. 综合例子百万级内存占用
配置:demo/19_from_excel.yaml
数量: 10000
命令:./zd demo/default.yaml -n 1000000 --verbose
耗时:119 sec
内存占用:1008.4兆
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册