diff --git a/.gitignore b/.gitignore index cbb4e785..746a51a7 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,5 @@ env.*.sh xgen/v0.9/* xgen/v1.0/* !xgen/v0.9/index.html -!xgen/v1.0/index.html \ No newline at end of file +!xgen/v1.0/index.html +!xgen/v1.0/umi.js \ No newline at end of file diff --git a/Makefile b/Makefile index 7807abac..9a0c70ea 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ VETPACKAGES ?= $(shell $(GO) list ./... | grep -v /examples/) GOFILES := $(shell find . -name "*.go") VERSION := $(shell grep 'const VERSION =' share/const.go |awk '{print $$4}' |sed 's/\"//g') COMMIT := $(shell git log | head -n 1 | awk '{print substr($$2, 0, 12)}') +NOW := $(shell date +"%FT%T%z") # ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) TESTFOLDER := $(shell $(GO) list ./... | grep -vE 'examples|tests*|config|widgets') @@ -155,10 +156,9 @@ artifacts-linux: clean cd ../xgen-v0.9 && npm install && npm run build # Building XGEN v1.0 - export XGEN_BASE=yao - export BASE=yao export NODE_ENV=production rm -f ../xgen-v1.0/pnpm-lock.yaml + echo "BASE=__yao_admin_root" > ../xgen-v1.0/packages/xgen/.env cd ../xgen-v1.0 && pnpm install && pnpm run build # Packing @@ -171,7 +171,7 @@ artifacts-linux: clean rm -rf .tmp/data # Replace PRVERSION - sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}\"/g" share/const.go + sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}-${NOW}\"/g" share/const.go # Making artifacts mkdir -p dist @@ -199,10 +199,9 @@ artifacts-macos: clean cd ../xgen-v0.9 && npm install && npm run build # Building XGEN v1.0 - export XGEN_BASE=yao - export BASE=yao export NODE_ENV=production rm -f ../xgen-v1.0/pnpm-lock.yaml + echo "BASE=__yao_admin_root" > ../xgen-v1.0/packages/xgen/.env cd ../xgen-v1.0 && pnpm install && pnpm run build # Packing @@ -215,7 +214,7 @@ artifacts-macos: clean rm -rf .tmp/data # Replace PRVERSION - sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}\"/g" share/const.go + sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}-${NOW}\"/g" share/const.go # Making artifacts mkdir -p dist @@ -245,7 +244,7 @@ debug: clean # Replace PRVERSION - sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}-debug\"/g" share/const.go + sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}-${NOW}-debug\"/g" share/const.go # Making artifacts mkdir -p dist @@ -262,31 +261,27 @@ release: clean mkdir .tmp # Building XGEN v0.9 -# git clone https://github.com/YaoApp/xgen.git .tmp/xgen/v0.9 -# sed -ie "s/url('\/icon/url('\/xiang\/icon/g" .tmp/xgen/v0.9/public/icon/md_icon.css -# cd .tmp/xgen/v0.9 && npm install && npm run build - mkdir -p .tmp/xgen/v0.9 - cp -r xgen/v0.9 .tmp/xgen/v0.9/dist + mkdir -p .tmp/xgen/v0.9/dist + echo "XGEN v0.9" > .tmp/xgen/v0.9/dist/index.html # Building XGEN v1.0 - export XGEN_BASE=yao - export BASE=yao export NODE_ENV=production git clone https://github.com/YaoApp/xgen-next.git .tmp/xgen/v1.0 + echo "BASE=__yao_admin_root" > .tmp/xgen/v1.0/packages/xgen/.env cd .tmp/xgen/v1.0 && pnpm install && pnpm run build # Packing mkdir -p .tmp/data/xgen cp -r ./ui .tmp/data/ui + cp -r ./yao .tmp/data/yao cp -r .tmp/xgen/v0.9/dist .tmp/data/xgen/v0.9 cp -r .tmp/xgen/v1.0/packages/xgen/dist .tmp/data/xgen/v1.0 - cp -r yao .tmp/data/ go-bindata -fs -pkg data -o data/bindata.go -prefix ".tmp/data/" .tmp/data/... rm -rf .tmp/data rm -rf .tmp/xgen # Replace PRVERSION - sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}\"/g" share/const.go + sed -ie "s/const PRVERSION = \"DEV\"/const PRVERSION = \"${COMMIT}-${NOW}\"/g" share/const.go # Making artifacts mkdir -p dist @@ -310,19 +305,18 @@ linux-release: clean cp -r xgen/v0.9 .tmp/xgen/v0.9/dist # Building XGEN v1.0 - export XGEN_BASE=yao - export BASE=yao export NODE_ENV=production git clone https://github.com/YaoApp/xgen-next.git .tmp/xgen/v1.0 rm -f .tmp/xgen/v1.0/pnpm-lock.yaml + echo "BASE=__yao_admin_root" > .tmp/xgen/v1.0/packages/xgen/.env cd .tmp/xgen/v1.0 && pnpm install && pnpm run build # Packing mkdir -p .tmp/data/xgen cp -r ./ui .tmp/data/ui + cp -r ./yao .tmp/data/yao cp -r .tmp/xgen/v0.9/dist .tmp/data/xgen/v0.9 cp -r .tmp/xgen/v1.0/packages/xgen/dist .tmp/data/xgen/v1.0 - cp -r yao .tmp/data/ go-bindata -fs -pkg data -o data/bindata.go -prefix ".tmp/data/" .tmp/data/... rm -rf .tmp/data rm -rf .tmp/xgen diff --git a/cmd/start.go b/cmd/start.go index f3ccac1e..1de96fe4 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -69,9 +69,10 @@ var startCmd = &cobra.Command{ } if share.App.XGen == "1.0" { + root, _ := adminRoot() fmt.Println(color.WhiteString(L(" XGen")), color.GreenString(" 1.0")) fmt.Println(color.WhiteString(L("Frontend")), color.GreenString(" http://%s%s/", host, port)) - fmt.Println(color.WhiteString(L("Dashboard")), color.GreenString(" http://%s%s/yao/login/admin", host, port)) + fmt.Println(color.WhiteString(L("Dashboard")), color.GreenString(" http://%s%s%slogin/admin", host, port, root)) fmt.Println(color.WhiteString(L("API")), color.GreenString(" http://%s%s/api", host, port)) fmt.Println(color.WhiteString(L("Listening")), color.GreenString(" %s:%d", config.Conf.Host, config.Conf.Port)) @@ -125,6 +126,17 @@ var startCmd = &cobra.Command{ }, } +func adminRoot() (string, int) { + adminRoot := "/yao/" + if root, ok := share.App.Optional["adminRoot"].(string); ok && root != "" { + root = strings.TrimPrefix(root, "/") + root = strings.TrimSuffix(root, "/") + adminRoot = fmt.Sprintf("/%s/", root) + } + adminRootLen := len(adminRoot) + return adminRoot, adminRootLen +} + func printConnectors(silent bool) { if len(connector.Connectors) == 0 { diff --git a/data/bindata.go b/data/bindata.go index 0a29155c..2aa5914f 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -3,6 +3,7 @@ // .tmp/data/ui/index.html // .tmp/data/xgen/v0.9/index.html // .tmp/data/xgen/v1.0/index.html +// .tmp/data/xgen/v1.0/umi.js // .tmp/data/yao/apis/README.md // .tmp/data/yao/apis/chart.http.json // .tmp/data/yao/apis/import.http.json @@ -207,7 +208,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -227,12 +228,12 @@ func xgenV09IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "xgen/v0.9/index.html", size: 14, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "xgen/v0.9/index.html", size: 14, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _xgenV10IndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x52\x56\x88\x70\x77\xf5\x53\x28\x33\xd4\x33\xd0\x33\xe4\x02\x04\x00\x00\xff\xff\x13\xe4\x6e\x5b\x0e\x00\x00\x00") +var _xgenV10IndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x52\x56\x88\x70\x77\xf5\x53\x28\x33\xd4\x33\xd0\x33\xe4\xe2\xb2\x49\xb2\x53\x56\x56\x08\xf2\xf7\x0f\x51\xd0\x8f\x8f\xaf\x4c\xcc\x8f\x4f\x4c\xc9\xcd\xcc\x8b\x2f\xca\xcf\x2f\xd1\x57\xb0\xd1\x4f\xb2\xe3\x02\x04\x00\x00\xff\xff\xb5\x26\x94\x2e\x32\x00\x00\x00") func xgenV10IndexHtmlBytes() ([]byte, error) { return bindataRead( @@ -247,7 +248,27 @@ func xgenV10IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "xgen/v1.0/index.html", size: 14, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "xgen/v1.0/index.html", size: 50, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _xgenV10UmiJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb2\x81\x00\x05\x0f\x57\x47\x17\xae\xb2\xc4\x22\x85\x82\xc4\x92\x0c\x05\x5b\x05\x25\xfd\xf8\xf8\xca\xc4\xfc\xf8\xc4\x94\xdc\xcc\xbc\xf8\xa2\xfc\xfc\x12\x7d\x25\x6b\xb0\x82\xb4\xfc\x7c\x05\x5b\x85\xe4\xfc\xbc\xe4\xc4\x12\x0d\x25\x74\x55\x4a\x9a\xd6\x5c\xb6\x10\x80\xa4\x1a\xb7\x69\x49\x89\x45\x20\x79\x0c\x63\xac\xb9\xec\x20\x40\x21\x25\x25\xd1\x30\xcd\xd0\x52\x41\x23\x3a\x2d\xb3\x22\x56\x01\xac\x46\x01\xa4\x46\xa1\x28\xb5\x20\x27\x31\x39\x55\x21\xa9\x34\x5d\x93\x0b\x10\x00\x00\xff\xff\xcc\x4c\x1b\x91\xc9\x00\x00\x00") + +func xgenV10UmiJsBytes() ([]byte, error) { + return bindataRead( + _xgenV10UmiJs, + "xgen/v1.0/umi.js", + ) +} + +func xgenV10UmiJs() (*asset, error) { + bytes, err := xgenV10UmiJsBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "xgen/v1.0/umi.js", size: 201, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -267,7 +288,7 @@ func yaoApisReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/README.md", size: 13, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/README.md", size: 13, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -287,7 +308,7 @@ func yaoApisChartHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/chart.http.json", size: 624, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/chart.http.json", size: 624, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -307,7 +328,7 @@ func yaoApisImportHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/import.http.json", size: 1676, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/import.http.json", size: 1676, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -327,7 +348,7 @@ func yaoApisPageHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/page.http.json", size: 609, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/page.http.json", size: 609, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -347,7 +368,7 @@ func yaoApisStorageHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/storage.http.json", size: 1026, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/storage.http.json", size: 1026, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -367,7 +388,7 @@ func yaoApisTableHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/table.http.json", size: 3213, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/table.http.json", size: 3213, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -387,7 +408,7 @@ func yaoApisUserHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/user.http.json", size: 1453, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/user.http.json", size: 1453, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -407,7 +428,7 @@ func yaoApisXiangHttpJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/apis/xiang.http.json", size: 1239, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/apis/xiang.http.json", size: 1239, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -427,7 +448,7 @@ func yaoDataAppJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/app.json", size: 277, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/data/app.json", size: 277, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -447,7 +468,7 @@ func yaoDataIcons404Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -467,7 +488,7 @@ func yaoDataIconsIconIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -487,7 +508,7 @@ func yaoDataIconsIconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -507,7 +528,7 @@ func yaoDataIconsIconPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -527,7 +548,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -547,7 +568,7 @@ func yaoFlowsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/README.md", size: 12, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/flows/README.md", size: 12, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -567,7 +588,7 @@ func yaoFlowsAdminGuardFlowJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/admin/guard.flow.json", size: 559, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/flows/admin/guard.flow.json", size: 559, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -587,7 +608,7 @@ func yaoFlowsMenuFlowJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/menu.flow.json", size: 1045, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/flows/menu.flow.json", size: 1045, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -607,7 +628,7 @@ func yaoFlowsUserFindFlowJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/flows/user/find.flow.json", size: 328, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/flows/user/find.flow.json", size: 328, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -627,7 +648,7 @@ func yaoLangsEnUsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -647,7 +668,7 @@ func yaoModelsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/models/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -667,7 +688,7 @@ func yaoModelsMenuModJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/menu.mod.json", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/models/menu.mod.json", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -687,7 +708,7 @@ func yaoModelsUserModJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user.mod.json", size: 8826, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.json", size: 8826, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -707,7 +728,7 @@ func yaoModelsWorkflowModJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/workflow.mod.json", size: 3333, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/models/workflow.mod.json", size: 3333, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -727,7 +748,7 @@ func yaoTablesReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/tables/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/tables/README.md", size: 15, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -747,7 +768,7 @@ func yaoTablesMenuTabJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/tables/menu.tab.json", size: 10471, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/tables/menu.tab.json", size: 10471, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -767,7 +788,7 @@ func yaoTablesUserTabJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/tables/user.tab.json", size: 2357, mode: os.FileMode(420), modTime: time.Unix(1664292946, 0)} + info := bindataFileInfo{name: "yao/tables/user.tab.json", size: 2357, mode: os.FileMode(420), modTime: time.Unix(1664428475, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -827,6 +848,7 @@ var _bindata = map[string]func() (*asset, error){ "ui/index.html": uiIndexHtml, "xgen/v0.9/index.html": xgenV09IndexHtml, "xgen/v1.0/index.html": xgenV10IndexHtml, + "xgen/v1.0/umi.js": xgenV10UmiJs, "yao/apis/README.md": yaoApisReadmeMd, "yao/apis/chart.http.json": yaoApisChartHttpJson, "yao/apis/import.http.json": yaoApisImportHttpJson, @@ -905,6 +927,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, "v1.0": {nil, map[string]*bintree{ "index.html": {xgenV10IndexHtml, map[string]*bintree{}}, + "umi.js": {xgenV10UmiJs, map[string]*bintree{}}, }}, }}, "yao": {nil, map[string]*bintree{ diff --git a/data/data.go b/data/data.go index e0cd1d2a..24f76756 100644 --- a/data/data.go +++ b/data/data.go @@ -1,7 +1,10 @@ package data import ( + "bytes" + "compress/gzip" "os" + "strings" assetfs "github.com/elazarl/go-bindata-assetfs" ) @@ -29,3 +32,58 @@ func XgenV1() *assetfs.AssetFS { } panic("unreachable") } + +// ReplaceXGen bindata file +func ReplaceXGen(search, replace string) error { + err := replaceXGenIndex(search, replace) + if err != nil { + return err + } + return replaceXGenUmi(search, replace) +} + +// ReplaceXGenIndex bindata file +func replaceXGenIndex(search, replace string) error { + + content, err := bindataRead(_xgenV10IndexHtml, "xgen/v1.0/index.html") + if err != nil { + return err + } + + new := strings.ReplaceAll(string(content), search, replace) + var b bytes.Buffer + gz := gzip.NewWriter(&b) + if _, err := gz.Write([]byte(new)); err != nil { + return err + } + + if err := gz.Close(); err != nil { + return err + } + + _xgenV10IndexHtml = b.Bytes() + return nil +} + +// replaceXGenUmi bindata file +func replaceXGenUmi(search, replace string) error { + + content, err := bindataRead(_xgenV10UmiJs, "xgen/v1.0/umi.js") + if err != nil { + return err + } + + new := strings.ReplaceAll(string(content), search, replace) + var b bytes.Buffer + gz := gzip.NewWriter(&b) + if _, err := gz.Write([]byte(new)); err != nil { + return err + } + + if err := gz.Close(); err != nil { + return err + } + + _xgenV10UmiJs = b.Bytes() + return nil +} diff --git a/data/data_test.go b/data/data_test.go new file mode 100644 index 00000000..59dde1bf --- /dev/null +++ b/data/data_test.go @@ -0,0 +1,25 @@ +package data + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestReplaceXGenIndex(t *testing.T) { + err := ReplaceXGen("__yao_admin_root", "Admin-Replaced") + if err != nil { + t.Fatal(err) + } + + content, err := bindataRead(_xgenV10IndexHtml, "index.html") + if err != nil { + t.Fatal(err) + } + + content, err = bindataRead(_xgenV10UmiJs, "umi.js") + if err != nil { + t.Fatal(err) + } + assert.Contains(t, string(content), "Admin-Replaced") +} diff --git a/service/middleware.go b/service/middleware.go index beda6744..1c1294c1 100644 --- a/service/middleware.go +++ b/service/middleware.go @@ -1,6 +1,7 @@ package service import ( + "fmt" "net/http" "path/filepath" "strings" @@ -36,13 +37,18 @@ func BinStatic(c *gin.Context) { c.Next() return - } else if share.App.XGen == "1.0" && length >= 5 && c.Request.URL.Path[0:5] == "/yao/" { - c.Request.URL.Path = strings.TrimPrefix(c.Request.URL.Path, "/yao") - XGenFileServerV1.ServeHTTP(c.Writer, c.Request) - c.Abort() - return + } else if share.App.XGen == "1.0" { + // Xgen 1.0 + adminRoot, adminRootLen := adminRoot() + if length >= adminRootLen && c.Request.URL.Path[0:adminRootLen] == adminRoot { + c.Request.URL.Path = strings.TrimPrefix(c.Request.URL.Path, c.Request.URL.Path[0:adminRootLen-1]) + XGenFileServerV1.ServeHTTP(c.Writer, c.Request) + c.Abort() + return + } - } else if share.App.XGen == "" && length >= 7 && c.Request.URL.Path[0:7] == "/xiang/" { // 数据管理后台 + } else if share.App.XGen == "" && length >= 7 && c.Request.URL.Path[0:7] == "/xiang/" { + // Xgen 0.9 c.Request.URL.Path = strings.TrimPrefix(c.Request.URL.Path, "/xiang") XGenFileServerV0.ServeHTTP(c.Writer, c.Request) c.Abort() @@ -54,3 +60,14 @@ func BinStatic(c *gin.Context) { AppFileServer.ServeHTTP(c.Writer, c.Request) c.Abort() } + +func adminRoot() (string, int) { + adminRoot := "/yao/" + if root, ok := share.App.Optional["adminRoot"].(string); ok && root != "" { + root = strings.TrimPrefix(root, "/") + root = strings.TrimSuffix(root, "/") + adminRoot = fmt.Sprintf("/%s/", root) + } + adminRootLen := len(adminRoot) + return adminRoot, adminRootLen +} diff --git a/widgets/app/app.go b/widgets/app/app.go index 59c70a73..ebac7472 100644 --- a/widgets/app/app.go +++ b/widgets/app/app.go @@ -5,12 +5,14 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" jsoniter "github.com/json-iterator/go" "github.com/yaoapp/gou" "github.com/yaoapp/gou/lang" "github.com/yaoapp/kun/exception" "github.com/yaoapp/yao/config" + "github.com/yaoapp/yao/data" "github.com/yaoapp/yao/share" "github.com/yaoapp/yao/widgets/login" ) @@ -52,10 +54,16 @@ func Load(cfg config.Config) error { return err } - dsl := &DSL{} + dsl := &DSL{Optional: OptionalDSL{}} err = jsoniter.Unmarshal(data, dsl) if err != nil { - return nil + return err + } + + // Replace Admin Root + err = dsl.replaceAdminRoot() + if err != nil { + return err } // Apply a language pack @@ -200,3 +208,20 @@ func (dsl *DSL) Lang(trans func(widget string, inst string, value *string) bool) trans(widget, "app", &dsl.Short) trans(widget, "app", &dsl.Description) } + +// replaceAdminRoot +func (dsl *DSL) replaceAdminRoot() error { + + if dsl.Optional.AdminRoot == "" { + dsl.Optional.AdminRoot = "yao" + } + + root := strings.TrimPrefix(dsl.Optional.AdminRoot, "/") + root = strings.TrimSuffix(root, "/") + err := data.ReplaceXGen("/__yao_admin_root/", fmt.Sprintf("/%s/", root)) + if err != nil { + return err + } + + return data.ReplaceXGen("\"__yao_admin_root\"", fmt.Sprintf("\"%s\"", root)) +} diff --git a/widgets/app/types.go b/widgets/app/types.go index 8fe1997a..b87da763 100644 --- a/widgets/app/types.go +++ b/widgets/app/types.go @@ -21,5 +21,6 @@ type MenuDSL struct { type OptionalDSL struct { HideNotification bool `json:"hideNotification,omitempty"` HideSetting bool `json:"hideSetting,omitempty"` + AdminRoot string `json:"adminRoot,omitempty"` Setting string `json:"setting,omitempty"` // custom setting process } diff --git a/xgen/v1.0/index.html b/xgen/v1.0/index.html index 32e6d208..0ff2cf02 100644 --- a/xgen/v1.0/index.html +++ b/xgen/v1.0/index.html @@ -1 +1,3 @@ # XGEN v1.0.1 + +## ROOT /__yao_admin_root/ diff --git a/xgen/v1.0/umi.js b/xgen/v1.0/umi.js new file mode 100644 index 00000000..7a3d8b57 --- /dev/null +++ b/xgen/v1.0/umi.js @@ -0,0 +1,2 @@ +var path = "/__yao_admin_root/"; +var foo = concat("__yao_admin_root");