[add] app custom admin route support

This commit is contained in:
Max 2022-09-29 12:41:31 +08:00
parent 7aa198e962
commit db55eb24a2
9 changed files with 255 additions and 102 deletions

View file

@ -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

View file

@ -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 {

View file

@ -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
@ -35,9 +36,9 @@ import (
"bytes"
"compress/gzip"
"fmt"
"net/http"
"io"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strings"
@ -106,6 +107,7 @@ func (fi bindataFileInfo) Sys() interface{} {
return nil
}
type assetFile struct {
*bytes.Reader
name string
@ -207,7 +209,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -227,12 +229,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(1664426417, 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 +249,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _xgenV10UmiJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2a\x4b\x2c\x52\x28\x48\x2c\xc9\x50\xb0\x55\x50\xd2\x8f\x8f\xaf\x4c\xcc\x8f\x4f\x4c\xc9\xcd\xcc\x8b\x2f\xca\xcf\x2f\xd1\x57\xb2\xe6\x02\x04\x00\x00\xff\xff\x2b\x83\xe5\x7a\x21\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: 33, mode: os.FileMode(420), modTime: time.Unix(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -267,7 +289,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -287,7 +309,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -307,7 +329,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -327,7 +349,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -347,7 +369,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -367,7 +389,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -387,7 +409,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -407,7 +429,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -427,7 +449,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -447,7 +469,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -467,7 +489,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -487,7 +509,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -507,7 +529,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -527,7 +549,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -547,7 +569,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -567,7 +589,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -587,7 +609,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -607,7 +629,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -627,7 +649,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -647,7 +669,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -667,7 +689,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -687,7 +709,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -707,7 +729,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -727,7 +749,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -747,7 +769,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -767,7 +789,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(1664426417, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@ -827,6 +849,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,
@ -896,61 +919,62 @@ type bintree struct {
}
var _bintree = &bintree{nil, map[string]*bintree{
"ui": {nil, map[string]*bintree{
"index.html": {uiIndexHtml, map[string]*bintree{}},
"ui": &bintree{nil, map[string]*bintree{
"index.html": &bintree{uiIndexHtml, map[string]*bintree{}},
}},
"xgen": {nil, map[string]*bintree{
"v0.9": {nil, map[string]*bintree{
"index.html": {xgenV09IndexHtml, map[string]*bintree{}},
"xgen": &bintree{nil, map[string]*bintree{
"v0.9": &bintree{nil, map[string]*bintree{
"index.html": &bintree{xgenV09IndexHtml, map[string]*bintree{}},
}},
"v1.0": {nil, map[string]*bintree{
"index.html": {xgenV10IndexHtml, map[string]*bintree{}},
"v1.0": &bintree{nil, map[string]*bintree{
"index.html": &bintree{xgenV10IndexHtml, map[string]*bintree{}},
"umi.js": &bintree{xgenV10UmiJs, map[string]*bintree{}},
}},
}},
"yao": {nil, map[string]*bintree{
"apis": {nil, map[string]*bintree{
"README.md": {yaoApisReadmeMd, map[string]*bintree{}},
"chart.http.json": {yaoApisChartHttpJson, map[string]*bintree{}},
"import.http.json": {yaoApisImportHttpJson, map[string]*bintree{}},
"page.http.json": {yaoApisPageHttpJson, map[string]*bintree{}},
"storage.http.json": {yaoApisStorageHttpJson, map[string]*bintree{}},
"table.http.json": {yaoApisTableHttpJson, map[string]*bintree{}},
"user.http.json": {yaoApisUserHttpJson, map[string]*bintree{}},
"xiang.http.json": {yaoApisXiangHttpJson, map[string]*bintree{}},
"yao": &bintree{nil, map[string]*bintree{
"apis": &bintree{nil, map[string]*bintree{
"README.md": &bintree{yaoApisReadmeMd, map[string]*bintree{}},
"chart.http.json": &bintree{yaoApisChartHttpJson, map[string]*bintree{}},
"import.http.json": &bintree{yaoApisImportHttpJson, map[string]*bintree{}},
"page.http.json": &bintree{yaoApisPageHttpJson, map[string]*bintree{}},
"storage.http.json": &bintree{yaoApisStorageHttpJson, map[string]*bintree{}},
"table.http.json": &bintree{yaoApisTableHttpJson, map[string]*bintree{}},
"user.http.json": &bintree{yaoApisUserHttpJson, map[string]*bintree{}},
"xiang.http.json": &bintree{yaoApisXiangHttpJson, map[string]*bintree{}},
}},
"data": {nil, map[string]*bintree{
"app.json": {yaoDataAppJson, map[string]*bintree{}},
"icons": {nil, map[string]*bintree{
"404.png": {yaoDataIcons404Png, map[string]*bintree{}},
"icon.icns": {yaoDataIconsIconIcns, map[string]*bintree{}},
"icon.ico": {yaoDataIconsIconIco, map[string]*bintree{}},
"icon.png": {yaoDataIconsIconPng, map[string]*bintree{}},
"data": &bintree{nil, map[string]*bintree{
"app.json": &bintree{yaoDataAppJson, map[string]*bintree{}},
"icons": &bintree{nil, map[string]*bintree{
"404.png": &bintree{yaoDataIcons404Png, map[string]*bintree{}},
"icon.icns": &bintree{yaoDataIconsIconIcns, map[string]*bintree{}},
"icon.ico": &bintree{yaoDataIconsIconIco, map[string]*bintree{}},
"icon.png": &bintree{yaoDataIconsIconPng, map[string]*bintree{}},
}},
"index.html": {yaoDataIndexHtml, map[string]*bintree{}},
"index.html": &bintree{yaoDataIndexHtml, map[string]*bintree{}},
}},
"flows": {nil, map[string]*bintree{
"README.md": {yaoFlowsReadmeMd, map[string]*bintree{}},
"admin": {nil, map[string]*bintree{
"guard.flow.json": {yaoFlowsAdminGuardFlowJson, map[string]*bintree{}},
"flows": &bintree{nil, map[string]*bintree{
"README.md": &bintree{yaoFlowsReadmeMd, map[string]*bintree{}},
"admin": &bintree{nil, map[string]*bintree{
"guard.flow.json": &bintree{yaoFlowsAdminGuardFlowJson, map[string]*bintree{}},
}},
"menu.flow.json": {yaoFlowsMenuFlowJson, map[string]*bintree{}},
"user": {nil, map[string]*bintree{
"find.flow.json": {yaoFlowsUserFindFlowJson, map[string]*bintree{}},
"menu.flow.json": &bintree{yaoFlowsMenuFlowJson, map[string]*bintree{}},
"user": &bintree{nil, map[string]*bintree{
"find.flow.json": &bintree{yaoFlowsUserFindFlowJson, map[string]*bintree{}},
}},
}},
"langs": {nil, map[string]*bintree{
"en-US.json": {yaoLangsEnUsJson, map[string]*bintree{}},
"langs": &bintree{nil, map[string]*bintree{
"en-US.json": &bintree{yaoLangsEnUsJson, map[string]*bintree{}},
}},
"models": {nil, map[string]*bintree{
"README.md": {yaoModelsReadmeMd, map[string]*bintree{}},
"menu.mod.json": {yaoModelsMenuModJson, map[string]*bintree{}},
"user.mod.json": {yaoModelsUserModJson, map[string]*bintree{}},
"workflow.mod.json": {yaoModelsWorkflowModJson, map[string]*bintree{}},
"models": &bintree{nil, map[string]*bintree{
"README.md": &bintree{yaoModelsReadmeMd, map[string]*bintree{}},
"menu.mod.json": &bintree{yaoModelsMenuModJson, map[string]*bintree{}},
"user.mod.json": &bintree{yaoModelsUserModJson, map[string]*bintree{}},
"workflow.mod.json": &bintree{yaoModelsWorkflowModJson, map[string]*bintree{}},
}},
"tables": {nil, map[string]*bintree{
"README.md": {yaoTablesReadmeMd, map[string]*bintree{}},
"menu.tab.json": {yaoTablesMenuTabJson, map[string]*bintree{}},
"user.tab.json": {yaoTablesUserTabJson, map[string]*bintree{}},
"tables": &bintree{nil, map[string]*bintree{
"README.md": &bintree{yaoTablesReadmeMd, map[string]*bintree{}},
"menu.tab.json": &bintree{yaoTablesMenuTabJson, map[string]*bintree{}},
"user.tab.json": &bintree{yaoTablesUserTabJson, map[string]*bintree{}},
}},
}},
}}

View file

@ -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
}

25
data/data_test.go Normal file
View file

@ -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")
}

View file

@ -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
}

View file

@ -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,15 @@ 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, "/")
return data.ReplaceXGen("/__yao_admin_root/", fmt.Sprintf("/%s/", root))
}

View file

@ -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
}

View file

@ -1 +1,3 @@
# XGEN v1.0.1
<b>## ROOT /__yao_admin_root/ </b>