Merge pull request #350 from trheyi/main

[change] bindata: update generated bindata
This commit is contained in:
Max 2023-04-02 17:04:36 +08:00 committed by GitHub
commit 705b8a797f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 85 additions and 2158 deletions

View file

@ -40,6 +40,9 @@ test:
fi; \
done
.PHONY: fmt
fmt:
$(GOFMT) -w $(GOFILES)
.PHONY: fmt-check
fmt-check:

View file

@ -70,7 +70,7 @@ var startCmd = &cobra.Command{
// load the application engine
err := engine.Load(config.Conf)
if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
fmt.Println(color.RedString(L("Load: %s"), err.Error()))
os.Exit(1)
}
@ -82,7 +82,7 @@ var startCmd = &cobra.Command{
// variables for the service
fs, err := fs.Get("system")
if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
fmt.Println(color.RedString(L("FileSystem: %s"), err.Error()))
os.Exit(1)
}
@ -121,7 +121,7 @@ var startCmd = &cobra.Command{
go func() {
err := studio.Start(config.Conf)
if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
fmt.Println(color.RedString(L("Studio: %s"), err.Error()))
os.Exit(2)
}
}()
@ -159,9 +159,9 @@ var startCmd = &cobra.Command{
// Start watching
watchDone := make(chan uint8, 1)
if mode == "development" && !startDisableWatching {
fmt.Println(color.WhiteString("\n---------------------------------"))
fmt.Println(color.WhiteString(L("Watching")))
fmt.Println(color.WhiteString("---------------------------------"))
// fmt.Println(color.WhiteString("\n---------------------------------"))
// fmt.Println(color.WhiteString(L("Watching")))
// fmt.Println(color.WhiteString("---------------------------------"))
go service.Watch(srv, watchDone)
}

File diff suppressed because one or more lines are too long

View file

@ -34,6 +34,7 @@ import (
// Load application engine
func Load(cfg config.Config) (err error) {
defer func() { err = exception.Catch(recover()) }()
// SET XGEN_BASE

View file

@ -2,6 +2,7 @@ package model
import (
"fmt"
"strings"
"github.com/yaoapp/gou/application"
"github.com/yaoapp/gou/model"
@ -12,15 +13,26 @@ import (
// Load 加载数据模型
func Load(cfg config.Config) error {
messages := []string{}
model.WithCrypt([]byte(fmt.Sprintf(`{"key":"%s"}`, cfg.DB.AESKey)), "AES")
model.WithCrypt([]byte(`{}`), "PASSWORD")
exts := []string{"*.mod.yao", "*.mod.json", "*.mod.jsonc"}
return application.App.Walk("models", func(root, file string, isdir bool) error {
err := application.App.Walk("models", func(root, file string, isdir bool) error {
if isdir {
return nil
}
_, err := model.Load(file, share.ID(root, file))
if err != nil {
messages = append(messages, err.Error())
}
return err
}, exts...)
if len(messages) > 0 {
return fmt.Errorf(strings.Join(messages, ";\n"))
}
return err
}

View file

@ -1,6 +1,7 @@
package plugin
import (
"fmt"
"io/fs"
"path/filepath"
"strings"
@ -18,8 +19,9 @@ func Load(cfg config.Config) error {
return err
}
return filepath.Walk(root, func(file string, info fs.FileInfo, err error) error {
if info.IsDir() {
messages := []string{}
err = filepath.Walk(root, func(file string, info fs.FileInfo, err error) error {
if info == nil || info.IsDir() {
return nil
}
@ -28,9 +30,18 @@ func Load(cfg config.Config) error {
}
_, err = plugin.Load(file, share.ID(root, file))
if err != nil {
messages = append(messages, err.Error())
}
return err
})
if len(messages) > 0 {
return fmt.Errorf(strings.Join(messages, ";\n"))
}
return err
}
// Root return plugin root

View file

@ -1,6 +1,9 @@
package store
import (
"fmt"
"strings"
"github.com/yaoapp/gou/application"
"github.com/yaoapp/gou/store"
"github.com/yaoapp/yao/config"
@ -9,13 +12,21 @@ import (
// Load load store
func Load(cfg config.Config) error {
messages := []string{}
exts := []string{"*.yao", "*.json", "*.jsonc"}
return application.App.Walk("stores", func(root, file string, isdir bool) error {
err := application.App.Walk("stores", func(root, file string, isdir bool) error {
if isdir {
return nil
}
_, err := store.Load(file, share.ID(root, file))
if err != nil {
messages = append(messages, err.Error())
}
return err
}, exts...)
if len(messages) > 0 {
return fmt.Errorf(strings.Join(messages, ";\n"))
}
return err
}

View file

@ -1 +0,0 @@
# API 接口

View file

@ -1,29 +0,0 @@
{
"name": "数据分析接口",
"version": "1.0.0",
"description": "数据分析接口API",
"group": "xiang/chart",
"guard": "bearer-jwt",
"paths": [
{
"path": "/:name/data",
"method": "GET",
"process": "xiang.chart.Data",
"in": ["$param.name", ":query"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/setting",
"method": "GET",
"process": "xiang.chart.Setting",
"in": ["$param.name", "$query.select"],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}

View file

@ -1,75 +0,0 @@
{
"name": "数据导入接口",
"version": "1.0.0",
"description": "数据分析接口API",
"group": "xiang/import",
"guard": "bearer-jwt",
"paths": [
{
"path": "/:name",
"method": "POST",
"process": "xiang.import.Run",
"in": ["$param.name", "$payload.file", "$payload.mapping"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/setting",
"method": "GET",
"process": "xiang.import.Setting",
"in": ["$param.name"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/data",
"method": "POST",
"process": "xiang.import.Data",
"in": [
"$param.name",
"$payload.file",
"$payload.page",
"$payload.size",
"$payload.mapping"
],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/data/setting",
"method": "GET",
"process": "xiang.import.DataSetting",
"in": ["$param.name"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/mapping",
"method": "GET",
"process": "xiang.import.Mapping",
"in": ["$param.name", "$query.file"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/mapping/setting",
"method": "GET",
"process": "xiang.import.MappingSetting",
"in": ["$param.name", "$query.file"],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}

View file

@ -1,29 +0,0 @@
{
"name": "页面接口",
"version": "1.0.0",
"description": "页面接口API",
"group": "xiang/page",
"guard": "bearer-jwt",
"paths": [
{
"path": "/:name/data",
"method": "GET",
"process": "xiang.page.Data",
"in": ["$param.name", ":query"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/setting",
"method": "GET",
"process": "xiang.page.Setting",
"in": ["$param.name", "$query.select"],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}

View file

@ -1,47 +0,0 @@
{
"name": "存储接口",
"version": "1.0.0",
"description": "存储接口API",
"group": "xiang/storage",
"guard": "bearer-jwt",
"paths": [
{
"path": "/upload",
"method": "POST",
"process": "xiang.fs.Upload",
"in": ["$file.file"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/readfile",
"method": "GET",
"process": "xiang.fs.ReadFile",
"in": ["$query.name", "$query.encode"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/url",
"method": "GET",
"guard": "-",
"process": "xiang.fs.GetURL",
"in": ["$query.name", "$query.type", "$query.token"],
"out": { "status": 200, "type": "image/png" }
},
{
"path": "/token",
"method": "GET",
"process": "xiang.fs.GetToken",
"in": ["$query.name"],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}

View file

@ -1,135 +0,0 @@
{
"name": "数据表格接口",
"version": "1.0.0",
"description": "数据表格接口API",
"group": "xiang/table",
"guard": "table-guard",
"paths": [
{
"path": "/:name/search",
"method": "GET",
"process": "xiang.table.Search",
"in": ["$param.name", ":query-param", "$query.page", "$query.pagesize"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/find/:id",
"method": "GET",
"process": "xiang.table.Find",
"in": ["$param.name", "$param.id", ":query-param"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/select",
"method": "GET",
"process": "xiang.table.Select",
"in": [
"$param.name",
"$query.keyword",
"$query.name",
"$query.value",
"$query.limit"
],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/save",
"method": "POST",
"process": "xiang.table.Save",
"in": ["$param.name", ":payload"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/quicksave",
"method": "POST",
"process": "xiang.table.QuickSave",
"in": ["$param.name", ":payload"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/delete/:id",
"method": "POST",
"process": "xiang.table.Delete",
"in": ["$param.name", "$param.id"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/insert",
"method": "POST",
"process": "xiang.table.Insert",
"in": ["$param.name", "$payload.columns", "$payload.values"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/delete/where",
"method": "POST",
"process": "xiang.table.DeleteWhere",
"in": ["$param.name", ":query-param"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/delete/in",
"method": "POST",
"process": "xiang.table.DeleteIn",
"in": ["$param.name", "$query.ids", "$query.primary"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/update/where",
"method": "POST",
"process": "xiang.table.UpdateWhere",
"in": ["$param.name", ":query-param", ":payload"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/update/in",
"method": "POST",
"process": "xiang.table.UpdateIn",
"in": ["$param.name", "$query.ids", "$query.primary", ":payload"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/:name/setting",
"method": "GET",
"process": "xiang.table.Setting",
"in": ["$param.name", "$query.select"],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}

View file

@ -1,72 +0,0 @@
{
"name": "系统用户接口",
"version": "1.0.0",
"description": "系统用户API",
"group": "xiang/user",
"guard": "bearer-jwt",
"paths": [
{
"path": "/captcha",
"method": "GET",
"guard": "-",
"process": "xiang.user.Captcha",
"in": [":query"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/login",
"method": "POST",
"guard": "-",
"process": "xiang.user.Login",
"in": [":payload"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/token",
"method": "POST",
"guard": "-",
"process": "xiang.user.Token",
"in": ["$payload.key", "$payload.secret"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/menu",
"method": "GET",
"process": "flows.xiang.menu",
"in": [],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/info",
"method": "GET",
"process": "xiang.user.Info",
"in": [],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/token/refresh",
"method": "GET",
"process": "xiang.user.TokenRefresh",
"in": [],
"out": {
"status": 200,
"type": "application/json"
}
}
]
}

View file

@ -1,63 +0,0 @@
{
"name": "系统接口",
"version": "1.0.0",
"description": "系统接口API",
"group": "xiang",
"guard": "bearer-jwt",
"paths": [
{
"path": "/ping",
"method": "GET",
"guard": "-",
"process": "xiang.main.Ping",
"in": [":query"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/ping/post",
"method": "POST",
"guard": "-",
"process": "xiang.main.Ping",
"in": [":payload"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/inspect",
"method": "GET",
"guard": "-",
"process": "xiang.main.inspect",
"in": [],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/menu",
"method": "GET",
"process": "flows.xiang.menu",
"in": ["$session.id"],
"out": {
"status": 200,
"type": "application/json"
}
},
{
"path": "/favicon.ico",
"method": "GET",
"guard": "-",
"process": "xiang.main.Favicon",
"in": [],
"out": {
"status": 200,
"type": "image/x-icon"
}
}
]
}

View file

@ -1 +0,0 @@
# 工作流

View file

@ -1,25 +0,0 @@
{
"label": "后台用户鉴权",
"version": "1.0.0",
"description": "后台用户鉴权",
"nodes": [
{
"name": "签发人",
"process": "session.Get",
"args": ["issuer"]
},
{
"name": "鉴权",
"process": "xiang.flow.IF",
"args": [
{
"when": [{ "用户身份": "{{$res.签发人}}", "!=": "xiang" }],
"name": "更新用户资料",
"process": "xiang.flow.Throw",
"args": ["token 签发人不合法", 403]
}
]
}
],
"output": "success"
}

View file

@ -1,47 +0,0 @@
{
"label": "菜单列表",
"version": "1.0.0",
"description": "菜单列表",
"nodes": [
{
"name": "menus",
"process": "models.xiang.menu.get",
"args": [
{
"select": [
"id",
"name",
"icon",
"parent",
"path",
"blocks",
"visible_menu"
],
"withs": {
"children": {
"query": {
"limit": 2000,
"select": [
"id",
"name",
"icon",
"parent",
"path",
"blocks",
"visible_menu"
]
}
}
},
"wheres": [
{ "column": "status", "value": "enabled" },
{ "column": "parent", "op": "null" }
],
"limit": 200,
"orders": [{ "column": "rank", "option": "asc" }]
}
]
}
],
"output": "{{$res.menus}}"
}

View file

@ -1,16 +0,0 @@
{
"label": "用户资料",
"version": "1.0.0",
"description": "用户资料",
"nodes": [
{
"name": "user",
"process": "models.xiang.user.Find",
"args": [
"{{$in.0}}",
{ "select": ["id", "name", "type", "mobile", "email", "status"] }
]
}
],
"output": "{{$res.user}}"
}

View file

@ -1 +0,0 @@
# 数据模型

View file

@ -1,121 +0,0 @@
{
"name": "菜单",
"table": {
"name": "xiang_menu",
"comment": "菜单表",
"engine": "InnoDB"
},
"columns": [
{
"name": "id",
"type": "ID",
"comment": "ID"
},
{
"name": "parent",
"type": "bigInteger",
"comment": "父节点",
"nullable": true,
"index": true
},
{
"name": "name",
"type": "string",
"length": 200,
"comment": "名称",
"index": true
},
{
"name": "icon",
"type": "string",
"length": 200,
"comment": "图标",
"nullable": true
},
{
"name": "blocks",
"type": "boolean",
"comment": "block布局",
"default": false,
"index": true
},
{
"name": "visible_menu",
"type": "boolean",
"comment": "显示",
"default": false,
"index": true
},
{
"name": "path",
"type": "string",
"length": 200,
"comment": "路由",
"index": true
},
{
"name": "rank",
"type": "integer",
"default": 9999,
"comment": "排列",
"index": true
},
{
"label": "状态",
"name": "status",
"type": "enum",
"default": "enabled",
"option": ["enabled", "disabled"],
"comment": "菜单状态 enabled 开启, disabled 关闭",
"index": true
}
],
"relations": {
"children": {
"type": "hasMany",
"model": "xiang.menu",
"key": "parent",
"foreign": "id",
"query": {
"select": ["name", "icon", "blocks", "path", "rank", "status"]
}
}
},
"values": [
{
"name": "数据看板",
"path": "/kanban",
"icon": "icon-activity",
"rank": 1,
"status": "enabled",
"visible_menu": 0,
"blocks": 1
},
{
"name": "云服务库",
"path": "/table/service",
"icon": "icon-cloud",
"rank": 2,
"status": "enabled",
"visible_menu": 0,
"blocks": 0,
"children": [
{
"name": "云服务库",
"path": "/table/service",
"icon": "icon-list"
},
{
"name": "创建云服务库",
"path": "/form/service/0",
"icon": "icon-plus"
}
]
}
],
"indexes": [],
"option": {
"timestamps": true,
"soft_deletes": true
}
}

View file

@ -1,345 +0,0 @@
{
"name": "用户",
"table": {
"name": "xiang_user",
"comment": "用户表",
"engine": "InnoDB"
},
"columns": [
{ "label": "ID", "name": "id", "type": "ID" },
{
"label": "类型",
"name": "type",
"type": "enum",
"option": ["admin", "staff", "user", "robot"],
"comment": "账号类型 admin 管理员, staff 员工, user 用户, robot 机器人",
"default": "user",
"index": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "enum",
"args": ["admin", "staff", "user", "robot"],
"message": "{{input}}不在许可范围, {{label}}应该为 admin/staff/user/robot"
}
]
},
{
"label": "邮箱",
"name": "email",
"type": "string",
"length": 50,
"comment": "邮箱",
"index": true,
"nullable": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "email",
"args": [],
"message": "{{input}}不是邮箱地址"
}
]
},
{
"label": "手机号",
"name": "mobile",
"type": "string",
"length": 50,
"comment": "手机号",
"index": true,
"nullable": true,
"crypt": "AES",
"validations": [
{
"method": "mobile",
"args": [],
"message": "{{input}}格式错误"
}
]
},
{
"label": "登录密码",
"name": "password",
"type": "string",
"length": 256,
"comment": "登录密码",
"crypt": "PASSWORD",
"index": true,
"nullable": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "minLength",
"args": [6],
"message": "{{label}}应该由6-18位大小写字母、数字和符号构成"
},
{
"method": "maxLength",
"args": [18],
"message": "{{label}}应该由6-18位大小写字母、数字和符号构成"
},
{
"method": "pattern",
"args": ["[0-9]+"],
"message": "{{label}}应该至少包含一个数字"
},
{
"method": "pattern",
"args": ["[A-Z]+"],
"message": "{{label}}应该至少包含一个大写字母"
},
{
"method": "pattern",
"args": ["[a-z]+"],
"message": "{{label}}应该至少包含一个小写字母"
},
{
"method": "pattern",
"args": ["[@#$&*\\+]+"],
"message": "{{label}}应该至少包含一个符号"
}
]
},
{
"label": "操作密码",
"name": "password2nd",
"type": "string",
"length": 256,
"comment": "操作密码",
"crypt": "PASSWORD",
"index": true,
"nullable": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "minLength",
"args": [6],
"message": "{{label}}应该由6-18位大小写字母、数字和符号构成"
},
{
"method": "maxLength",
"args": [18],
"message": "{{label}}应该由6-18位大小写字母、数字和符号构成"
},
{
"method": "pattern",
"args": ["[0-9]+"],
"message": "{{label}}应该至少包含一个数字"
},
{
"method": "pattern",
"args": ["[A-Z]+"],
"message": "{{label}}应该至少包含一个大写字母"
},
{
"method": "pattern",
"args": ["[a-z]+"],
"message": "{{label}}应该至少包含一个小写字母"
},
{
"method": "pattern",
"args": ["[@#$&*\\+]+"],
"message": "{{label}}应该至少包含一个符号"
}
]
},
{
"label": "姓名",
"name": "name",
"type": "string",
"length": 80,
"comment": "姓名",
"index": true,
"nullable": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "minLength",
"args": [2],
"message": "{{label}}至少需要2个字"
},
{
"method": "maxLength",
"args": [40],
"message": "{{label}}不能超过20个字"
}
]
},
{
"label": "身份证号码",
"name": "idcard",
"type": "string",
"length": 256,
"comment": "身份证号码",
"crypt": "AES",
"nullable": true,
"index": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "pattern",
"args": ["^(\\d{18})|(\\d{14}X)$"],
"message": "{{label}}格式错误"
}
]
},
{
"label": "API Key",
"name": "key",
"type": "string",
"length": 256,
"comment": "API Key",
"nullable": true,
"unique": true,
"validations": [
{
"method": "typeof",
"args": ["integer"],
"message": "{{input}}类型错误, {{label}}应该为数字"
},
{
"method": "pattern",
"args": ["^[0-9]{10}$"],
"message": " {{label}}应该由10位数字构成"
}
]
},
{
"label": "API 密钥",
"name": "secret",
"type": "string",
"length": 256,
"nullable": true,
"crypt": "AES",
"comment": "API 密钥",
"index": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "pattern",
"args": ["^[0-9A-Za-z@#$&*]{32}$"],
"message": "{{label}}应该由32位大小写字母、数字和符号构成"
}
]
},
{
"label": "扩展信息",
"name": "extra",
"type": "json",
"comment": "扩展信息",
"nullable": true
},
{
"label": "状态",
"comment": "用户状态 enabled 有效, disabled 无效",
"name": "status",
"type": "enum",
"default": "enabled",
"option": ["enabled", "disabled"],
"index": true,
"validations": [
{
"method": "typeof",
"args": ["string"],
"message": "{{input}}类型错误, {{label}}应该为字符串"
},
{
"method": "enum",
"args": ["enabled", "disabled"],
"message": "{{input}}不在许可范围, {{label}}应该为 enabled/disabled"
}
]
}
],
"relations": {},
"values": [
{
"name": "管理员",
"type": "admin",
"email": "xiang@iqka.com",
"mobile": null,
"password": "A123456p+",
"key": "8304925176",
"secret": "XMTdNRVigbgUiAPdiJCfaWgWcz2PaQXw",
"status": "enabled",
"extra": { "sex": "男" }
},
{
"name": "员工",
"type": "staff",
"email": "staff@iqka.com",
"mobile": null,
"password": "S123456p+",
"key": null,
"secret": null,
"status": "enabled",
"extra": { "sex": "女" }
},
{
"name": "用户",
"type": "user",
"email": null,
"mobile": "13900001111",
"password": "U123456p+",
"key": null,
"secret": null,
"status": "enabled",
"extra": { "sex": "女" }
},
{
"name": "机器人",
"type": "robot",
"email": null,
"mobile": null,
"password": null,
"key": "3845196072",
"secret": "wBeYjL7FjbcvpAdBrxtDFfjydsoPKhRN",
"status": "enabled",
"extra": { "sex": "女" }
}
],
"indexes": [
{
"comment": "类型邮箱唯一",
"name": "type_email_unique",
"columns": ["type", "email"],
"type": "unique"
},
{
"comment": "类型手机号唯一",
"name": "type_mobile_unique",
"columns": ["type", "mobile"],
"type": "unique"
}
],
"option": { "timestamps": true, "soft_deletes": true }
}

View file

@ -1 +0,0 @@
# 数据表格

View file

@ -1,570 +0,0 @@
{
"name": "菜单",
"version": "1.0.0",
"decription": "菜单设置",
"bind": {
"model": "xiang.menu"
},
"guard": "flows.xiang.admin.guard",
"apis": {
"search": {
"process": "models.xiang.menu.Paginate",
"guard": "-",
"default": [
{
"withs": {
"children": {
"query": {
"select": ["name", "id"]
}
}
},
"wheres": [
{
"column": "parent",
"op": "null"
}
]
},
null,
15
]
}
},
"columns": {
"ID": {
"label": "ID",
"view": {
"type": "label",
"props": {
"value": ":id"
}
},
"edit": {
"type": "input",
"props": {
"value": ":id"
}
},
"form": {}
},
"blocks": {
"label": "block布局",
"view": {
"type": "label",
"props": {
"value": ":blocks"
}
},
"edit": {
"type": "checkbox",
"props": {}
},
"form": {}
},
"block布局": {
"label": "block布局",
"view": {
"type": "label",
"props": {
"value": ":blocks"
}
},
"edit": {
"type": "select",
"props": {
"value": ":blocks",
"placeholder": "请选择是否为block布局",
"options": [
{
"label": "是",
"value": 1
},
{
"label": "否",
"value": 0
}
]
}
},
"form": {}
},
"created_at": {
"label": "创建时间",
"view": {
"type": "label",
"props": {
"value": ":created_at"
}
},
"edit": {
"type": "datetime",
"props": {
"value": ":created_at"
}
},
"form": {}
},
"deleted_at": {
"label": "删除标记",
"view": {
"type": "label",
"props": {
"value": ":deleted_at"
}
},
"edit": {
"type": "datetime",
"props": {
"value": ":deleted_at"
}
},
"form": {}
},
"icon": {
"label": "图标",
"view": {
"type": "label",
"props": {
"value": ":icon"
}
},
"edit": {
"type": "input",
"props": {
"value": ":icon"
}
},
"form": {}
},
"id": {
"label": "ID",
"view": {
"type": "label",
"props": {
"value": ":id"
}
},
"edit": {
"type": "input",
"props": {
"value": ":id"
}
},
"form": {}
},
"name": {
"label": "名称",
"view": {
"type": "label",
"props": {
"value": ":name"
}
},
"edit": {
"type": "input",
"props": {
"value": ":name"
}
},
"form": {}
},
"parent": {
"label": "父节点",
"view": {
"type": "label",
"props": {
"value": ":parent"
}
},
"edit": {
"type": "input",
"props": {
"value": ":parent"
}
},
"form": {}
},
"path": {
"label": "路由",
"view": {
"type": "label",
"props": {
"value": ":path"
}
},
"edit": {
"type": "input",
"props": {
"value": ":path"
}
},
"form": {}
},
"rank": {
"label": "排列",
"view": {
"type": "label",
"props": {
"value": ":rank"
}
},
"edit": {
"type": "input",
"props": {
"value": ":rank"
}
},
"form": {}
},
"status": {
"label": "状态",
"view": {
"type": "label",
"props": {
"value": ":status"
}
},
"edit": {
"type": "select",
"props": {
"options": [
{
"label": "enabled",
"value": "enabled"
},
{
"label": "disabled",
"value": "disabled"
}
],
"value": ":status"
}
},
"form": {}
},
"updated_at": {
"label": "更新时间",
"view": {
"type": "label",
"props": {
"value": ":updated_at"
}
},
"edit": {
"type": "datetime",
"props": {
"value": ":updated_at"
}
},
"form": {}
},
"visible_menu": {
"label": "显示",
"view": {
"type": "label",
"props": {
"value": ":visible_menu"
}
},
"edit": {
"type": "checkbox",
"props": {
"value": ":visible_menu"
}
},
"form": {}
},
"创建时间": {
"label": "创建时间",
"view": {
"type": "label",
"props": {
"value": ":created_at"
}
},
"edit": {
"type": "datetime",
"props": {
"value": ":created_at"
}
},
"form": {}
},
"删除标记": {
"label": "删除标记",
"view": {
"type": "label",
"props": {
"value": ":deleted_at"
}
},
"edit": {
"type": "datetime",
"props": {
"value": ":deleted_at"
}
},
"form": {}
},
"名称": {
"label": "名称",
"view": {
"type": "label",
"props": {
"value": ":name"
}
},
"edit": {
"type": "input",
"props": {
"value": ":name"
}
},
"form": {}
},
"图标": {
"label": "图标",
"view": {
"type": "label",
"props": {
"value": ":icon"
}
},
"edit": {
"type": "input",
"props": {
"value": ":icon"
}
},
"form": {}
},
"排列": {
"label": "排列",
"view": {
"type": "label",
"props": {
"value": ":rank"
}
},
"edit": {
"type": "input",
"props": {
"value": ":rank"
}
},
"form": {}
},
"显示": {
"label": "显示",
"view": {
"type": "label",
"props": {
"value": ":visible_menu"
}
},
"edit": {
"type": "select",
"props": {
"value": ":visible_menu",
"placeholder": "请选择是否显示",
"options": [
{
"label": "是",
"value": 1
},
{
"label": "否",
"value": 0
}
]
}
},
"form": {}
},
"更新时间": {
"label": "更新时间",
"view": {
"type": "label",
"props": {
"value": ":updated_at"
}
},
"edit": {
"type": "datetime",
"props": {
"value": ":updated_at"
}
},
"form": {}
},
"父节点": {
"label": "父节点",
"view": {
"type": "label",
"props": {
"value": ":parent"
}
},
"edit": {
"type": "input",
"props": {
"value": ":parent"
}
},
"form": {}
},
"状态": {
"label": "状态",
"view": {
"type": "label",
"props": {
"value": ":status"
}
},
"edit": {
"type": "select",
"props": {
"options": [
{
"label": "enabled",
"value": "enabled"
},
{
"label": "disabled",
"value": "disabled"
}
],
"value": ":status"
}
},
"form": {}
},
"路由": {
"label": "路由",
"view": {
"type": "label",
"props": {
"value": ":path"
}
},
"edit": {
"type": "input",
"props": {
"value": ":path"
}
},
"form": {}
}
},
"filters": {},
"list": {
"primary": "id",
"layout": {
"columns": [
{
"name": "名称",
"width": "240px"
},
{
"name": "父节点"
},
{
"name": "图标"
},
{
"name": "状态"
},
{
"name": "路由"
},
{
"name": "排列"
},
{
"name": "block布局"
},
{
"name": "显示"
}
],
"filters": [
{
"name": "名称",
"width": 6
}
]
},
"actions": {
"create": {
"type": "button",
"props": {
"label": "新建菜单",
"icon": "fas fa-plus"
}
},
"view": {},
"edit": {},
"import": {},
"update": {},
"delete": {},
"insert": {},
"updateWhere": {},
"deleteWhere": {},
"updateSelect": {},
"deleteSelect": {},
"pagination": {},
"setting": {}
},
"option": { "operation": { "unfold": true } }
},
"edit": {
"primary": "id",
"layout": {
"fieldset": [
{
"title": "基础信息",
"description": "",
"columns": [
{
"name": "名称",
"width": 6
},
{
"name": "图标",
"width": 6
},
{
"name": "路由",
"width": 6
},
{
"name": "排列",
"width": 6
},
{
"name": "block布局",
"width": 6
},
{
"name": "显示",
"width": 6
}
]
}
]
},
"actions": {
"cancel": {},
"save": {
"type": "button",
"props": {
"label": "保存"
}
},
"delete": {}
}
},
"insert": {},
"view": {}
}

View file

@ -1,107 +0,0 @@
{
"name": "用户",
"version": "1.0.0",
"decription": "象传用户",
"guard": "flows.xiang.admin.guard",
"bind": {
"model": "xiang.user"
},
"apis": {
"find": { "process": "flows.xiang.user.find" },
"search": {
"default": [
{ "select": ["id", "name", "type", "mobile", "email"] },
1,
10
]
}
},
"columns": {
"登录密码": {
"label": "登录密码",
"view": {
"type": "label",
"props": {
"value": ":password"
}
},
"edit": {
"type": "input",
"props": {
"value": ":password",
"type": "password"
}
}
}
},
"filters": {
"关键词": {
"label": "关键词",
"bind": "where.name.match",
"input": {
"type": "input",
"props": {
"placeholder": "请输入关键词"
}
}
}
},
"list": {
"primary": "id",
"layout": {
"columns": [
{ "name": "姓名", "width": 100 },
{ "name": "类型", "width": 200 },
{ "name": "手机号", "width": 200 },
{ "name": "邮箱", "width": 200 },
{ "name": "状态" }
],
"filters": [{ "name": "关键词", "width": 6 }]
},
"actions": {
"create": {
"type": "button",
"props": {
"label": "添加用户",
"icon": "fas fa-plus"
}
},
"view": {},
"edit": {},
"import": {},
"update": {},
"delete": {},
"insert": {},
"updateWhere": {},
"deleteWhere": {},
"updateSelect": {},
"deleteSelect": {},
"pagination": {},
"setting": {}
},
"option": { "operation": { "unfold": true } }
},
"edit": {
"primary": "id",
"layout": {
"fieldset": [
{
"columns": [
{ "name": "姓名", "width": 12 },
{ "name": "类型", "width": 12 },
{ "name": "手机号", "width": 12 },
{ "name": "邮箱", "width": 12 },
{ "name": "登录密码", "width": 12 }
]
}
]
},
"actions": {
"cancel": {},
"save": { "type": "button", "props": { "label": "保存" } },
"delete": { "type": "button", "props": { "label": "删除" } }
}
},
"insert": {},
"view": {}
}