QOR在搭建后台方面,确实还是比较快的。加上golang本身的特点,搭起整个系统框架就比较迅速了。
可惜它没有继续的维护/更新,自己啃起来还是比较累的。
1. 调用网页内容
后台添加一个文章的任务条功能
article.Action(&admin.Action{
Name: "征稿",
Modes: []string{"collection"},
URL: func(record interface{}, context *admin.Context) string {
return fmt.Sprintf("/web/art_get/%s", server["DeviceCode"])
},
URLOpenType: "slideout", // slideout bottomsheet
})
这将调用本的Web地址,通过Web返回页面内容。
点击按钮,从下方(bottomsheet)或者右方(slideout)滑出窗口。
返回的网页内容必须要用以下格式供js文件调用,才能生成标题栏和内容栏。否则内容可能不显示。主要是js获取class名。
之前就在这里卡了,调用的页面出不来。页面出来内容又出不来。就这一条就值得付10元时间损耗。
<div class="qor-layout">
<main class="mdl-layout-title qor-page">获取专家文章</main>
<main class="mdl-layout__content qor-page" id="content">
<br/>
获取中心服务器文章中...
</main>
</div>
2.string字段使用多选功能
一般情况下,数组类型的字段可以使用多选。
foodList.Meta(&admin.Meta{
Name: "TimeType", Type: "select_many", Config: &admin.SelectManyConfig{
Collection: []string{"a","b","c"},
}
})
在实际需求中,要用普通字符字段来保存多个值,例如常见的“关键词”,就是用字符串来保存多个词,中间用逗号分隔。
这里作一些修改来完成需求。
步骤1: 调用自己写的模板
foodList.Meta(&admin.Meta{
Name: "TimeType", Type: "select_many", Config: &admin.SelectManyConfig{
SelectionTemplate: "metas/form/select_many_string.tmpl", // 关键之一:调用自己写的模板
Collection: func(_ interface{}, c *admin.Context) [][]string { // 这里调用可选项
var fType [][]string
// 调用系统设置中的食物成份分类
for _, n := range strings.Split(data.DB_Get_aSysSet(c.GetDB(), "FoodTimeType"), ",") {
fType = append(fType, []string{n, n})
}
return fType
},
}, Setter: func(record interface{}, metaValue *resource.MetaValue, context *qor.Context) {
// 这里来完成保存工作
select_value := metaValue.Value.([]string)
f := record.(*data.FoodList)
f.TimeType = strings.Join(select_value, ",")
return
}})
步骤2:添加函数
在库github.com/qor/admin/func_map.go中添加字符串分割函数string_split。
...
// FuncMap funcs map for current context
func (context *Context) FuncMap() template.FuncMap {
funcMap := template.FuncMap{
"current_user": func() qor.CurrentUser { return context.CurrentUser },
"get_resource": context.Admin.GetResource,
"new_resource_context": context.NewResourceContext,
"is_new_record": context.isNewRecord,
"is_equal": context.isEqual,
"is_included": context.isIncluded,
"primary_key_of": context.primaryKeyOf,
"unique_key_of": context.uniqueKeyOf,
"formatted_value_of": context.FormattedValueOf,
"raw_value_of": context.RawValueOf,
"string_split": context.StringSplit, // Ease添加函数
...
// 字符串切割(Ease添加函数)
func (context *Context) StringSplit(str string, flag string) []string {
return strings.Split(str, flag)
}
...
步骤3:在模板select_many_string.tmpl中分割字符串
更多的内容与select_many.tmpl一致。
{{$current_values := string_split (raw_value_of .ResourceValue .Meta) ","}}
<div class="qor-field__show qor-field__selectmany-show">
{{range $value := $current_values}}
<span>{{stringify $value}}</span>
{{end}}
</div>
3. 简单的输入可直接调用模板
用户修改积分功能,一般会使用自定义的页面去完成。
简单一点的实现,可以直接如下,它调用app/views/qor/action.tmpl文件为模板,可让用户输入信息。
正在研究如何让它显示中文信息,现在它标题只能是字段英文名
// 修改用户积分
type UserPoint struct {
Point uint `name:"原积分"`
ChangPoint uint `name:"添减积分"`
Memo string `name:"修改原因"`
}
UserPointRes := Admin.NewResource(&UserPoint{})
user.Action(&admin.Action{
Name: "修改积分",
Handler: func(a *admin.ActionArgument) error {
arg := a.Argument.(*UserPoint) // 从参数获取用户输入
fmt.Println(arg)
// for _, record := range a.FindSelectedRecords() {
// a.Context.GetDB().Model(record).UpdateColumn("tracking_number", trackingNumberArgument.TrackingNumber)
// }
return nil
},
Resource: UserPointRes,
Modes: []string{"menu_item", "show", "edit"},
})