This commit is contained in:
Joe
2026-01-16 15:49:34 +08:00
commit 550d3e1f42
380 changed files with 62024 additions and 0 deletions
@@ -0,0 +1,70 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/facades"
"github.com/goravel/framework/support/str"
"github.com/samber/lo"
"github.com/spf13/cast"
"goravel/app/models"
)
type AdminOptionProvider struct{}
func NewAdminOptionProvider() *AdminOptionProvider {
return &AdminOptionProvider{}
}
func (p *AdminOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
var admins []models.Admin
// 排除开发者ID
developerIDsStr := facades.Config().GetString("admin.developer_ids", "2")
developerIDs := parseProtectedIDs(developerIDsStr)
query := facades.Orm().Query().Where("status", 1)
if len(developerIDs) > 0 {
query = query.Where("id NOT IN ?", developerIDs)
}
if err := query.Order("id asc").Get(&admins); err != nil {
return nil, err
}
options := lo.Map(admins, func(admin models.Admin, _ int) map[string]any {
label := admin.Username
if admin.Nickname != "" {
label = admin.Nickname + " (" + admin.Username + ")"
}
return map[string]any{
"label": label,
"value": cast.ToString(admin.ID),
}
})
return map[string]any{
"options": options,
}, nil
}
// parseProtectedIDs 解析受保护的管理员ID字符串(支持逗号分隔)
func parseProtectedIDs(idsStr string) []uint {
var ids []uint
if idsStr == "" {
return ids
}
// 使用字符串分割
parts := str.Of(idsStr).Split(",")
for _, part := range parts {
part = str.Of(part).Trim().String()
if !str.Of(part).IsEmpty() {
if id := cast.ToUint(part); id > 0 {
ids = append(ids, id)
}
}
}
return ids
}
@@ -0,0 +1,47 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/facades"
"goravel/app/models"
)
type DepartmentOptionProvider struct{}
func NewDepartmentOptionProvider() *DepartmentOptionProvider {
return &DepartmentOptionProvider{}
}
func (p *DepartmentOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
var departments []models.Department
if err := facades.Orm().Query().Where("status", 1).Order("sort asc, id asc").Get(&departments); err != nil {
return nil, err
}
tree := p.buildDepartmentTree(departments, 0)
return map[string]any{
"options": tree,
"list": departments,
}, nil
}
func (p *DepartmentOptionProvider) buildDepartmentTree(departments []models.Department, parentID uint) []map[string]any {
var tree []map[string]any
for _, dept := range departments {
if dept.ParentID == parentID {
node := map[string]any{
"id": dept.ID,
"name": dept.Name,
}
children := p.buildDepartmentTree(departments, dept.ID)
if len(children) > 0 {
node["children"] = children
}
tree = append(tree, node)
}
}
return tree
}
@@ -0,0 +1,57 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
"goravel/app/models"
"goravel/app/services"
)
type MenuOptionProvider struct {
treeService services.TreeService
}
func NewMenuOptionProvider(treeService services.TreeService) *MenuOptionProvider {
return &MenuOptionProvider{
treeService: treeService,
}
}
func (p *MenuOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
menus, err := p.treeService.BuildMenuTree(0)
if err != nil {
return nil, err
}
tree := p.buildMenuTree(menus)
return map[string]any{
"options": tree,
}, nil
}
func (p *MenuOptionProvider) buildMenuTree(menus []models.Menu) []map[string]any {
var tree []map[string]any
for _, menu := range menus {
// 使用菜单标题和路径构建显示标签
label := menu.Title
if menu.Path != "" {
label = label + " (" + menu.Path + ")"
}
node := map[string]any{
"id": menu.ID,
"name": menu.Title,
"label": label,
"value": menu.ID,
}
if len(menu.Children) > 0 {
node["children"] = p.buildMenuTree(menu.Children)
}
tree = append(tree, node)
}
return tree
}
@@ -0,0 +1,26 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
)
type MethodOptionProvider struct{}
func NewMethodOptionProvider() *MethodOptionProvider {
return &MethodOptionProvider{}
}
func (p *MethodOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
options := []map[string]any{
{"label": "GET", "value": "GET"},
{"label": "POST", "value": "POST"},
{"label": "PUT", "value": "PUT"},
{"label": "DELETE", "value": "DELETE"},
{"label": "PATCH", "value": "PATCH"},
}
return map[string]any{
"options": options,
}, nil
}
@@ -0,0 +1,38 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/facades"
"github.com/samber/lo"
"github.com/spf13/cast"
"goravel/app/models"
)
type PaymentMethodOptionProvider struct{}
func NewPaymentMethodOptionProvider() *PaymentMethodOptionProvider {
return &PaymentMethodOptionProvider{}
}
func (p *PaymentMethodOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
var paymentMethods []models.PaymentMethod
// 只查询已启用的支付方式
query := facades.Orm().Query().Model(&models.PaymentMethod{}).Where("is_active", true).Order("sort asc").Order("id asc")
if err := query.Get(&paymentMethods); err != nil {
return nil, err
}
options := lo.Map(paymentMethods, func(pm models.PaymentMethod, _ int) map[string]any {
return map[string]any{
"label": pm.Name,
"value": cast.ToString(pm.ID),
}
})
return map[string]any{
"options": options,
}, nil
}
@@ -0,0 +1,35 @@
package option_providers
import (
"github.com/samber/lo"
"github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/facades"
"github.com/spf13/cast"
"goravel/app/models"
)
type RoleOptionProvider struct{}
func NewRoleOptionProvider() *RoleOptionProvider {
return &RoleOptionProvider{}
}
func (p *RoleOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
var roles []models.Role
if err := facades.Orm().Query().Where("status", 1).Order("id asc").Get(&roles); err != nil {
return nil, err
}
options := lo.Map(roles, func(role models.Role, _ int) map[string]any {
return map[string]any{
"label": role.Name,
"value": cast.ToString(role.ID),
}
})
return map[string]any{
"options": options,
}, nil
}
@@ -0,0 +1,25 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
"goravel/app/http/trans"
)
type StatusOptionProvider struct{}
func NewStatusOptionProvider() *StatusOptionProvider {
return &StatusOptionProvider{}
}
func (p *StatusOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
options := []map[string]any{
{"label": trans.Get(ctx, "common.enabled"), "value": "1"},
{"label": trans.Get(ctx, "common.disabled"), "value": "0"},
}
return map[string]any{
"options": options,
}, nil
}
@@ -0,0 +1,25 @@
package option_providers
import (
"github.com/goravel/framework/contracts/http"
"goravel/app/http/trans"
)
type YesNoOptionProvider struct{}
func NewYesNoOptionProvider() *YesNoOptionProvider {
return &YesNoOptionProvider{}
}
func (p *YesNoOptionProvider) GetOptions(ctx http.Context) (map[string]any, error) {
options := []map[string]any{
{"label": trans.Get(ctx, "common.yes"), "value": "1"},
{"label": trans.Get(ctx, "common.no"), "value": "0"},
}
return map[string]any{
"options": options,
}, nil
}