103 lines
3.5 KiB
Go
103 lines
3.5 KiB
Go
package admin
|
|
|
|
import (
|
|
"github.com/goravel/framework/contracts/http"
|
|
|
|
apperrors "goravel/app/errors"
|
|
"goravel/app/http/response"
|
|
"goravel/app/http/trans"
|
|
"goravel/app/services"
|
|
"goravel/app/services/option_providers"
|
|
)
|
|
|
|
type OptionController struct {
|
|
providers map[string]services.OptionProvider
|
|
dictionaryService services.DictionaryService
|
|
}
|
|
|
|
func NewOptionController() *OptionController {
|
|
|
|
// 注册所有选项提供者
|
|
// 添加新的选项类型时,只需:
|
|
// 1. 在 app/services/option_providers/ 目录下创建新的提供者文件
|
|
// 2. 实现 services.OptionProvider 接口
|
|
// 3. 在此处注册新的提供者
|
|
providers := make(map[string]services.OptionProvider)
|
|
providers["role"] = option_providers.NewRoleOptionProvider()
|
|
providers["department"] = option_providers.NewDepartmentOptionProvider()
|
|
providers["menu"] = option_providers.NewMenuOptionProvider(services.NewTreeServiceImpl())
|
|
providers["status"] = option_providers.NewStatusOptionProvider()
|
|
providers["method"] = option_providers.NewMethodOptionProvider()
|
|
providers["yes_no"] = option_providers.NewYesNoOptionProvider()
|
|
providers["admin"] = option_providers.NewAdminOptionProvider()
|
|
providers["payment_method"] = option_providers.NewPaymentMethodOptionProvider()
|
|
// 在此处添加新的选项提供者,例如:
|
|
// providers["new_type"] = option_providers.NewNewTypeOptionProvider()
|
|
|
|
return &OptionController{
|
|
providers: providers,
|
|
dictionaryService: services.NewDictionaryService(),
|
|
}
|
|
}
|
|
|
|
// Index 获取选项列表
|
|
// 通过 type 参数指定选项类型,例如: /options?type=role
|
|
func (r *OptionController) Index(ctx http.Context) http.Response {
|
|
optionType := ctx.Request().Query("type", "")
|
|
|
|
if optionType == "" {
|
|
return response.Error(ctx, http.StatusBadRequest, apperrors.ErrOptionTypeRequired.Code)
|
|
}
|
|
|
|
// 如果 type 是 "dictionary",则需要进一步检查 dictionary_type 参数
|
|
if optionType == "dictionary" {
|
|
dictType := ctx.Request().Query("dictionary_type", "")
|
|
if dictType == "" {
|
|
return response.Error(ctx, http.StatusBadRequest, apperrors.ErrOptionTypeRequired.Code)
|
|
}
|
|
|
|
dictionaries, err := r.dictionaryService.GetByType(dictType)
|
|
if err != nil {
|
|
return response.Error(ctx, http.StatusInternalServerError, apperrors.ErrQueryFailed.Code)
|
|
}
|
|
|
|
// 转换为选项格式,并处理多语言
|
|
var options []map[string]any
|
|
for _, dict := range dictionaries {
|
|
label := dict.Label
|
|
// 如果有 translation_key,优先使用翻译键
|
|
if dict.TranslationKey != "" {
|
|
translated := trans.Get(ctx, dict.TranslationKey)
|
|
// 只有当翻译结果不同于 key 本身(表示找到了翻译)且不为空时才使用
|
|
if translated != "" && translated != dict.TranslationKey {
|
|
label = translated
|
|
}
|
|
}
|
|
|
|
options = append(options, map[string]any{
|
|
"label": label,
|
|
"value": dict.Value,
|
|
})
|
|
}
|
|
return response.Success(ctx, options)
|
|
}
|
|
|
|
provider, exists := r.providers[optionType]
|
|
if !exists {
|
|
return response.Error(ctx, http.StatusBadRequest, apperrors.ErrInvalidOptionType.Code)
|
|
}
|
|
|
|
data, err := provider.GetOptions(ctx)
|
|
if err != nil {
|
|
return response.Error(ctx, http.StatusInternalServerError, apperrors.ErrQueryFailed.Code)
|
|
}
|
|
|
|
return response.Success(ctx, data)
|
|
}
|
|
|
|
// RegisterProvider 注册新的选项提供者(可选,用于动态注册)
|
|
// 如果需要在运行时动态添加提供者,可以使用此方法
|
|
func (r *OptionController) RegisterProvider(optionType string, provider services.OptionProvider) {
|
|
r.providers[optionType] = provider
|
|
}
|