(原) QOR使用总结

原创文章,请后转载,并注明出处。

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"},
	})

相关文章