[feat] 重新梳理依赖
This commit is contained in:
@@ -5,16 +5,16 @@ import (
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"git.fsdpf.net/go/contracts"
|
||||
"git.fsdpf.net/go/contracts/res_type"
|
||||
"git.fsdpf.net/go/db"
|
||||
"git.fsdpf.net/go/req"
|
||||
)
|
||||
|
||||
type QueryField struct {
|
||||
ResField
|
||||
typ contracts.QueryDataType `db:"dataType"`
|
||||
alias string `db:"alias"`
|
||||
isExpr bool `db:"isExpr"`
|
||||
typ req.RouteParamType `db:"dataType"`
|
||||
alias string `db:"alias"`
|
||||
isExpr bool `db:"isExpr"`
|
||||
isOmitempty bool
|
||||
ignored bool
|
||||
}
|
||||
@@ -35,20 +35,20 @@ func (this QueryField) IsOmitempty() bool {
|
||||
return this.isOmitempty
|
||||
}
|
||||
|
||||
func (this QueryField) Type() contracts.QueryDataType {
|
||||
func (this QueryField) Type() req.RouteParamType {
|
||||
return this.typ
|
||||
}
|
||||
|
||||
func (this *QueryField) SetOptions(options int) contracts.QueryField {
|
||||
if options&contracts.QueryField_IsExpr != 0 {
|
||||
func (this *QueryField) SetOptions(options byte) req.QueryField {
|
||||
if options&req.IsExpr != 0 {
|
||||
this.isExpr = true
|
||||
}
|
||||
|
||||
if options&contracts.QueryField_IsOmitempty != 0 {
|
||||
if options&req.IsOmitempty != 0 {
|
||||
this.isOmitempty = true
|
||||
}
|
||||
|
||||
if options&contracts.QueryField_Ignored != 0 {
|
||||
if options&req.Ignored != 0 {
|
||||
this.ignored = true
|
||||
}
|
||||
|
||||
@@ -101,19 +101,19 @@ func (this *QueryField) ToStructField(tags ...string) reflect.StructField {
|
||||
}
|
||||
|
||||
switch this.typ {
|
||||
case contracts.QueryDataType_String:
|
||||
case req.ReqString:
|
||||
typ = reflect.TypeOf(string(""))
|
||||
case contracts.QueryDataType_Number:
|
||||
case req.ReqNumber:
|
||||
typ = reflect.TypeOf(res_type.ResFieldByNumber(0))
|
||||
case contracts.QueryDataType_Integer:
|
||||
case req.ReqInteger:
|
||||
typ = reflect.TypeOf(res_type.ResFieldByInteger(0))
|
||||
case contracts.QueryDataType_Float:
|
||||
case req.ReqFloat:
|
||||
typ = reflect.TypeOf(res_type.ResFieldByFloat(0))
|
||||
case contracts.QueryDataType_Bool:
|
||||
case req.ReqBool:
|
||||
typ = reflect.TypeOf(true)
|
||||
case contracts.QueryDataType_Array:
|
||||
case req.ReqArray:
|
||||
typ = reflect.TypeOf([]any{})
|
||||
case contracts.QueryDataType_Json:
|
||||
case req.ReqJson:
|
||||
typ = reflect.TypeOf(map[string]any{})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package base
|
||||
|
||||
import "git.fsdpf.net/go/condition"
|
||||
|
||||
type ResCondition struct {
|
||||
Id int `db:"id"`
|
||||
Pid int `db:"pid"`
|
||||
@@ -36,3 +38,54 @@ type ResWhereExpr struct {
|
||||
}
|
||||
|
||||
type GetResConditions func(categoryUuid string) []ResCondition
|
||||
|
||||
// Create Condition By Resource
|
||||
func NewConditionByRes(items []ResCondition, opts ...condition.Option) (root *condition.Condition) {
|
||||
conditions := map[int]any{}
|
||||
|
||||
for _, item := range items {
|
||||
switch item.Type {
|
||||
case "and":
|
||||
conditions[item.Id] = condition.New()
|
||||
case "or":
|
||||
conditions[item.Id] = condition.New(condition.Type(condition.OR))
|
||||
case "expr":
|
||||
conditions[item.Id] = condition.NewExpr(
|
||||
item.ColumnResource, item.Column,
|
||||
condition.Token(item.Value, condition.TokenType(item.ValueType)),
|
||||
condition.Operator(condition.ConditionOperator(item.Operator)),
|
||||
condition.FieldSqlFn(item.ColumnSqlFunc, item.ColumnSqlFuncParam),
|
||||
condition.IgnoreEmptyParma(item.IgnoreEmptyParma),
|
||||
)
|
||||
}
|
||||
|
||||
if item.Pid == 0 && (item.Type == "and" || item.Type == "or") {
|
||||
root = conditions[item.Id].(*condition.Condition)
|
||||
}
|
||||
}
|
||||
|
||||
for _, item := range items {
|
||||
parent := root
|
||||
|
||||
if item.Pid == 0 {
|
||||
continue
|
||||
} else {
|
||||
parent = conditions[item.Pid].(*condition.Condition)
|
||||
}
|
||||
|
||||
switch item.Type {
|
||||
case "and", "or":
|
||||
parent.SetCondition(conditions[item.Id].(*condition.Condition))
|
||||
case "expr":
|
||||
parent.SetExpr(conditions[item.Id].(*condition.ConditionExpr))
|
||||
}
|
||||
}
|
||||
|
||||
if root == nil {
|
||||
root = condition.New()
|
||||
}
|
||||
|
||||
root.SetOption(opts...)
|
||||
|
||||
return root
|
||||
}
|
||||
|
||||
@@ -7,24 +7,24 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"git.fsdpf.net/go/contracts"
|
||||
"git.fsdpf.net/go/contracts/res_type"
|
||||
"git.fsdpf.net/go/db"
|
||||
"git.fsdpf.net/go/db/schema"
|
||||
"git.fsdpf.net/go/req"
|
||||
"github.com/google/uuid"
|
||||
"github.com/spf13/cast"
|
||||
)
|
||||
|
||||
// 资源字段
|
||||
type ResField struct {
|
||||
Uuid string `db:"uuid"`
|
||||
Name string `db:"name"`
|
||||
Code string `db:"code"`
|
||||
CodeResource string `db:"codeResource"`
|
||||
DataType contracts.ResDataType `db:"table_type"`
|
||||
Length string `db:"length"`
|
||||
Comment string `db:"comment"`
|
||||
Default string `db:"default"`
|
||||
Uuid string `db:"uuid"`
|
||||
Name string `db:"name"`
|
||||
Code string `db:"code"`
|
||||
CodeResource string `db:"codeResource"`
|
||||
DataType req.ResDataType `db:"table_type"`
|
||||
Length string `db:"length"`
|
||||
Comment string `db:"comment"`
|
||||
Default string `db:"default"`
|
||||
}
|
||||
|
||||
func (this ResField) ToStructField(tags ...string) reflect.StructField {
|
||||
@@ -38,16 +38,16 @@ func (this ResField) ToStructField(tags ...string) reflect.StructField {
|
||||
}
|
||||
|
||||
switch this.DataType {
|
||||
case contracts.ResDataType_String, contracts.ResDataType_Text, contracts.ResDataType_Enum,
|
||||
contracts.ResDataType_Timestamp, contracts.ResDataType_Date, contracts.ResDataType_Datetime:
|
||||
case req.ResString, req.ResText, req.ResEnum,
|
||||
req.ResTimestamp, req.ResDate, req.ResDatetime:
|
||||
typ = reflect.TypeOf(string(""))
|
||||
case contracts.ResDataType_Integer, contracts.ResDataType_SmallInteger:
|
||||
case req.ResInteger, req.ResSmallInteger:
|
||||
typ = reflect.TypeOf(res_type.ResFieldByInteger(0))
|
||||
case contracts.ResDataType_Decimal:
|
||||
case req.ResDecimal:
|
||||
typ = reflect.TypeOf(float64(0))
|
||||
case contracts.ResDataType_Boolean:
|
||||
case req.ResBoolean:
|
||||
typ = reflect.TypeOf(true)
|
||||
case contracts.ResDataType_Json:
|
||||
case req.ResJson:
|
||||
if this.Default != "" && this.Default[0:1] == "[" {
|
||||
typ = reflect.TypeOf([]any{})
|
||||
} else {
|
||||
@@ -74,47 +74,47 @@ func (this ResField) GetName() string {
|
||||
return this.Name
|
||||
}
|
||||
|
||||
func (this ResField) GetDataType() contracts.ResDataType {
|
||||
func (this ResField) GetDataType() req.ResDataType {
|
||||
return this.DataType
|
||||
}
|
||||
|
||||
func (this ResField) GetQueryDataType() contracts.QueryDataType {
|
||||
func (this ResField) GetQueryDataType() req.RouteParamType {
|
||||
switch this.GetDataType() {
|
||||
case contracts.ResDataType_Enum,
|
||||
contracts.ResDataType_Timestamp, contracts.ResDataType_Date,
|
||||
contracts.ResDataType_Datetime, contracts.ResDataType_String,
|
||||
contracts.ResDataType_Text:
|
||||
return contracts.QueryDataType_String
|
||||
case contracts.ResDataType_Integer, contracts.ResDataType_SmallInteger:
|
||||
return contracts.QueryDataType_Integer
|
||||
case contracts.ResDataType_Decimal:
|
||||
return contracts.QueryDataType_Float
|
||||
case contracts.ResDataType_Boolean:
|
||||
return contracts.QueryDataType_Bool
|
||||
case contracts.ResDataType_Json:
|
||||
case req.ResEnum,
|
||||
req.ResTimestamp, req.ResDate,
|
||||
req.ResDatetime, req.ResString,
|
||||
req.ResText:
|
||||
return req.ReqString
|
||||
case req.ResInteger, req.ResSmallInteger:
|
||||
return req.ReqInteger
|
||||
case req.ResDecimal:
|
||||
return req.ReqFloat
|
||||
case req.ResBoolean:
|
||||
return req.ReqBool
|
||||
case req.ResJson:
|
||||
if this.Default != "" && this.Default[0:1] == "[" {
|
||||
return contracts.QueryDataType_Array
|
||||
return req.ReqArray
|
||||
}
|
||||
return contracts.QueryDataType_Json
|
||||
return req.ReqJson
|
||||
}
|
||||
return contracts.QueryDataType_String
|
||||
return req.ReqString
|
||||
}
|
||||
|
||||
func (this ResField) ToValue(v any) any {
|
||||
switch this.DataType {
|
||||
case contracts.ResDataType_String, contracts.ResDataType_Text, contracts.ResDataType_Enum,
|
||||
contracts.ResDataType_Timestamp, contracts.ResDataType_Date, contracts.ResDataType_Datetime:
|
||||
case req.ResString, req.ResText, req.ResEnum,
|
||||
req.ResTimestamp, req.ResDate, req.ResDatetime:
|
||||
return strings.Trim(cast.ToString(v), " ")
|
||||
case contracts.ResDataType_Integer, contracts.ResDataType_SmallInteger:
|
||||
case req.ResInteger, req.ResSmallInteger:
|
||||
return cast.ToInt(v)
|
||||
case contracts.ResDataType_Decimal:
|
||||
case req.ResDecimal:
|
||||
return strings.Trim(cast.ToString(v), " ")
|
||||
case contracts.ResDataType_Boolean:
|
||||
case req.ResBoolean:
|
||||
if v, _ := strconv.ParseBool(fmt.Sprintf("%v", v)); v {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
case contracts.ResDataType_Json:
|
||||
case req.ResJson:
|
||||
if v == nil {
|
||||
if this.Default != "" && this.Default[0:1] == "[" {
|
||||
return db.Raw("'[]'")
|
||||
@@ -142,7 +142,7 @@ func (this ResField) ToValue(v any) any {
|
||||
}
|
||||
|
||||
func (this ResField) GetRawDefault(driver string) db.Expression {
|
||||
if this.DataType == contracts.ResDataType_Json {
|
||||
if this.DataType == req.ResJson {
|
||||
if this.Default != "" && this.Default[0:1] == "[" {
|
||||
return db.Raw("'[]'")
|
||||
} else if this.Default != "" && this.Default[0:1] == "{" {
|
||||
@@ -150,7 +150,7 @@ func (this ResField) GetRawDefault(driver string) db.Expression {
|
||||
} else if this.Default == "" {
|
||||
return db.Raw("'{}'")
|
||||
}
|
||||
} else if this.DataType == contracts.ResDataType_Boolean {
|
||||
} else if this.DataType == req.ResBoolean {
|
||||
if v, _ := strconv.ParseBool(this.Default); v {
|
||||
return db.Raw("'1'")
|
||||
}
|
||||
@@ -169,7 +169,7 @@ func (this ResField) GetRawDefault(driver string) db.Expression {
|
||||
}
|
||||
|
||||
if this.Default == "" {
|
||||
if this.GetDataType() == contracts.ResDataType_Date || this.GetDataType() == contracts.ResDataType_Datetime {
|
||||
if this.GetDataType() == req.ResDate || this.GetDataType() == req.ResDatetime {
|
||||
return db.Raw("NULL")
|
||||
}
|
||||
return db.Raw("''")
|
||||
@@ -255,7 +255,7 @@ func (this ResField) ToBlueprint(table *schema.Blueprint) (temp *schema.ColumnDe
|
||||
return temp
|
||||
}
|
||||
|
||||
func (this ResField) ToQueryField(t contracts.QueryDataType, alias string, options int) contracts.QueryField {
|
||||
func (this ResField) ToQueryField(t req.RouteParamType, alias string, options byte) req.QueryField {
|
||||
o := &QueryField{
|
||||
ResField: this,
|
||||
typ: t,
|
||||
|
||||
@@ -2,6 +2,7 @@ package base
|
||||
|
||||
import (
|
||||
"git.fsdpf.net/go/contracts"
|
||||
"git.fsdpf.net/go/req"
|
||||
)
|
||||
|
||||
type ResRelation struct {
|
||||
@@ -23,7 +24,7 @@ type GetResRelations func(categoryUuid string) []ResRelation
|
||||
type GetOrmJoinsByResRelations func(root string, items []ResRelation) []contracts.Join
|
||||
|
||||
// 获取被关联对象的资源
|
||||
type GetResRelationResource func(r ResRelation) (contracts.Resource, bool)
|
||||
type GetResRelationResource func(r ResRelation) (req.Resource, bool)
|
||||
|
||||
// 资源关联依赖
|
||||
func GetJoinResDependencies(root string, items []ResRelation) (dependencies []string) {
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
"github.com/samber/lo"
|
||||
|
||||
"git.fsdpf.net/go/contracts"
|
||||
"git.fsdpf.net/go/contracts/support"
|
||||
"git.fsdpf.net/go/db"
|
||||
"git.fsdpf.net/go/req"
|
||||
)
|
||||
|
||||
// 资源变更事件
|
||||
@@ -29,7 +29,7 @@ type ResChangeEventTopicPayload struct {
|
||||
|
||||
type ResChangeRecordTopicPayload struct {
|
||||
Type string // insert | delete | update
|
||||
User contracts.User // 操作用户
|
||||
User req.User // 操作用户
|
||||
Res Resource // 变更资源
|
||||
Result sql.Result // 执行结果
|
||||
Old []map[string]any // 旧数据
|
||||
@@ -92,7 +92,7 @@ func (this Resource) IsSystem() bool {
|
||||
}
|
||||
|
||||
// 资源字段
|
||||
func (this Resource) GetFields() (result []contracts.ResField) {
|
||||
func (this Resource) GetFields() (result []req.ResField) {
|
||||
for _, item := range this.Fields {
|
||||
result = append(result, item)
|
||||
}
|
||||
@@ -100,15 +100,15 @@ func (this Resource) GetFields() (result []contracts.ResField) {
|
||||
}
|
||||
|
||||
// 资源字段
|
||||
func (this Resource) GetField(code string) (contracts.ResField, bool) {
|
||||
return lo.Find(this.GetFields(), func(v contracts.ResField) bool {
|
||||
func (this Resource) GetField(code string) (req.ResField, bool) {
|
||||
return lo.Find(this.GetFields(), func(v req.ResField) bool {
|
||||
return v.GetCode() == code
|
||||
})
|
||||
}
|
||||
|
||||
// 判断资源字段
|
||||
func (this Resource) HasField(code string) bool {
|
||||
return lo.SomeBy(this.GetFields(), func(v contracts.ResField) bool {
|
||||
return lo.SomeBy(this.GetFields(), func(v req.ResField) bool {
|
||||
return v.GetCode() == code
|
||||
})
|
||||
}
|
||||
@@ -147,7 +147,7 @@ func (this Resource) GetDBDriver() string {
|
||||
return this.GetDBConn().GetConfig().Driver
|
||||
}
|
||||
|
||||
func (this Resource) GetAuthDBTable(u contracts.User, params ...any) *db.Builder {
|
||||
func (this Resource) GetAuthDBTable(u req.User, params ...any) *db.Builder {
|
||||
builder := this.GetDBTable(append(params, u)...)
|
||||
|
||||
// 数据权限过滤
|
||||
@@ -164,7 +164,7 @@ func (this Resource) GetAuthDBTable(u contracts.User, params ...any) *db.Builder
|
||||
func (this Resource) GetDBTable(params ...any) *db.Builder {
|
||||
builder := this.GetDBBuilder()
|
||||
|
||||
var user contracts.User
|
||||
var user req.User
|
||||
alias := this.Code
|
||||
|
||||
for _, param := range params {
|
||||
@@ -173,7 +173,7 @@ func (this Resource) GetDBTable(params ...any) *db.Builder {
|
||||
builder.Tx = v
|
||||
case string:
|
||||
alias = v
|
||||
case contracts.User:
|
||||
case req.User:
|
||||
user = v
|
||||
}
|
||||
}
|
||||
@@ -213,7 +213,7 @@ func (this Resource) GetDBTable(params ...any) *db.Builder {
|
||||
return builder.Table(string(this.GetTable()), alias)
|
||||
}
|
||||
|
||||
func (this Resource) WithRolesCondition(b *db.Builder, t string, u contracts.User) error {
|
||||
func (this Resource) WithRolesCondition(b *db.Builder, t string, u req.User) error {
|
||||
isFullRight := false
|
||||
isFullNot := false
|
||||
|
||||
@@ -268,7 +268,7 @@ func (this Resource) WithRolesCondition(b *db.Builder, t string, u contracts.Use
|
||||
return db.ToSql()
|
||||
} else if conditions.IsNotEmpty() {
|
||||
oOrm := NewOrm(this, nil)
|
||||
oOrm.SetGlobalParams(support.NewGlobalParam("{}", u))
|
||||
oOrm.SetGlobalParams(req.NewGlobalParam("{}", u))
|
||||
|
||||
db.Where(conditions.ToSql(oOrm.GetModel()))
|
||||
|
||||
@@ -322,7 +322,7 @@ func (this Resource) formatSaveValue(data map[string]any) {
|
||||
}
|
||||
|
||||
// 填充保存数据
|
||||
func (this Resource) fillSaveValue(data map[string]any, u contracts.User, t string) {
|
||||
func (this Resource) fillSaveValue(data map[string]any, u req.User, t string) {
|
||||
for _, field := range this.GetFields() {
|
||||
fCode := field.GetCode()
|
||||
|
||||
@@ -401,7 +401,7 @@ func (this Resource) onResEvent(builder *db.Builder) {
|
||||
}
|
||||
|
||||
// 用户事件
|
||||
func (this Resource) onUserEvent(builder *db.Builder, user contracts.User) {
|
||||
func (this Resource) onUserEvent(builder *db.Builder, user req.User) {
|
||||
old := []map[string]any{}
|
||||
|
||||
builder.Before(func(b *db.Builder, t string, data ...map[string]any) {
|
||||
@@ -439,7 +439,7 @@ func (this Resource) onUserEvent(builder *db.Builder, user contracts.User) {
|
||||
})
|
||||
}
|
||||
|
||||
func NewVirtualResource(pRes Resource, code, name, sql string, fields []ResField) contracts.Resource {
|
||||
func NewVirtualResource(pRes Resource, code, name, sql string, fields []ResField) req.Resource {
|
||||
return &Resource{
|
||||
Uuid: code,
|
||||
PUuid: pRes.Uuid,
|
||||
|
||||
14
base/user.go
14
base/user.go
@@ -3,7 +3,7 @@ package base
|
||||
import (
|
||||
"github.com/samber/lo"
|
||||
|
||||
"git.fsdpf.net/go/contracts"
|
||||
"git.fsdpf.net/go/req"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
@@ -12,7 +12,7 @@ type user struct {
|
||||
username string
|
||||
nickname string
|
||||
roles []string
|
||||
runtime contracts.UserRuntime
|
||||
runtime req.UserRuntime
|
||||
}
|
||||
|
||||
func (this user) ID() int64 {
|
||||
@@ -47,19 +47,19 @@ func (this user) IsAnonymous() bool {
|
||||
return this.id == 0
|
||||
}
|
||||
|
||||
func (this user) Runtime() contracts.UserRuntime {
|
||||
func (this user) Runtime() req.UserRuntime {
|
||||
return this.runtime
|
||||
}
|
||||
|
||||
// 获取匿名用户
|
||||
func GetAnonymous(opts ...contracts.UserRuntimeOption) contracts.User {
|
||||
func GetAnonymous(opts ...req.UserRuntimeOption) req.User {
|
||||
u := user{
|
||||
id: 0,
|
||||
uuid: "00000000-0000-0000-0000-000000000000",
|
||||
username: "anonymous",
|
||||
nickname: "匿名者",
|
||||
roles: []string{"00000000-0000-0000-0000-000000000000"},
|
||||
runtime: contracts.UserRuntime{},
|
||||
runtime: req.UserRuntime{},
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
@@ -70,14 +70,14 @@ func GetAnonymous(opts ...contracts.UserRuntimeOption) contracts.User {
|
||||
}
|
||||
|
||||
// 系统用户
|
||||
func GetSystemUser(opts ...contracts.UserRuntimeOption) contracts.User {
|
||||
func GetSystemUser(opts ...req.UserRuntimeOption) req.User {
|
||||
u := user{
|
||||
id: -1,
|
||||
uuid: "ffffffff-ffff-ffff-ffff-ffffffffffff",
|
||||
username: "system",
|
||||
nickname: "系统",
|
||||
roles: []string{"ffffffff-ffff-ffff-ffff-ffffffffffff"},
|
||||
runtime: contracts.UserRuntime{},
|
||||
runtime: req.UserRuntime{},
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
|
||||
Reference in New Issue
Block a user