当前位置:   article > 正文

QOR-CMS(3):做一个针对user 的CURD,加查询过滤,显示字段,标记label,和各种组件使用_qorin69

qorin69

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/80740388

博主地址是:http://blog.csdn.net/freewebsys

前言


https://getqor.com/cn
QOR经过全新架构,以加速开发与部署内容管理系统(CMS)、电子商务系统和业务应用程序。QOR由这类系统中抽象出的通用功能模块构成,其中包含灵活可配置的后台、内容发布系统、媒体库等等。
文档:
https://doc.getqor.com/
代码:
https://github.com/golangpkg/qor-cms-demos
全部qor文章:
https://blog.csdn.net/freewebsys/article/category/7742598

1,qor-curd


qor的一个核心功能,也是我超级喜欢的一个功能。
就是可以配置配置。就能完成一个 CRUD的界面,超级方便呢。
看看qor设计的一个系统,对应每一个不同的cms,总有写资源是不一样的。
没有使用通用的模式,而是将数据的权限控制交给了开发人员。
开发人员设计几个数据结构,然后就可以操作mysql数据库了。

2,一个超级赞的CURD


先看代码:

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
    "github.com/qor/admin"
    "net/http"
    "database/sql"
    "fmt"
)

//声明全局变量
var (
    // 注册数据库,可以是sqlite3 也可以是 mysql 换下驱动就可以了。
    DB, _ = gorm.Open("sqlite3", "demo.db")
    // 初始化admin 还有其他的,比如API
    Admin = admin.New(&admin.AdminConfig{DB: DB, SiteName: "Qor Admin "})
)

func init() {
    //地址
    type Address struct {
        gorm.Model
        Code string
        Name string
    }
    //角色
    type Role struct {
        gorm.Model
        Name string
    }
    //用户
    type User struct {
        gorm.Model
        Email     string
        Password  string
        Name      sql.NullString
        Gender    string
        Role      Role
        Addresses []Address
        Active     bool
    }
    DB.AutoMigrate(&Address{}, &Role{}, &User{}) //自动创建表。

    address := Admin.AddResource(&Address{}, &admin.Config{Name: "地址管理", Menu: []string{"组织管理"}})
    role := Admin.AddResource(&Role{}, &admin.Config{Name: "角色管理", Menu: []string{"组织管理"}})
    // Add it to Admin
    user := Admin.AddResource(&User{}, &admin.Config{Name: "用户管理", Menu: []string{"组织管理"}})
    // 显示字段
    //user.IndexAttrs("Name", "Gender", "Role", "Password", "CreateAt")
    // 不显示字段
    user.IndexAttrs("-Password", "-Role", "-Addresses")
    user.Meta(&admin.Meta{Name: "Email", Label: "邮箱"})
    user.Meta(&admin.Meta{Name: "Name", Label: "名称"})
    user.Meta(&admin.Meta{Name: "Gender", Label: "性别", Config: &admin.SelectOneConfig{Collection: []string{"Male", "Female", "Unknown"}}})
    分组显示
    //user.Scope(&admin.Scope{Name: "Male", Group: "Gender", Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
    //  return db.Where("gender = ?", "Male")
    //}})
    //user.Scope(&admin.Scope{Name: "Female", Group: "Gender", Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
    //  return db.Where("gender = ?", "Female")
    //}})

    user.Action(&admin.Action{
        Name: "enable",
        Handler: func(actionArgument *admin.ActionArgument) error {
            // `FindSelectedRecords` => in bulk action mode, will return all checked records, in other mode, will return current record
            for _, record := range actionArgument.FindSelectedRecords() {
                actionArgument.Context.DB.Model(record.(*User)).Update("Active", true)
            }
            return nil
        },
    })
    // Filter users by gender
    user.Filter(&admin.Filter{
        Name: "性别",
        Config: &admin.SelectOneConfig{
            Collection: []string{"Male", "Female", "Unknown"},
        },
    })
    // Filter products by collection
    user.Filter(&admin.Filter{
        Name:   "角色",
        Config: &admin.SelectOneConfig{RemoteDataResource: role},
    })

    fmt.Println(user)
    fmt.Println(role)
    fmt.Println(address)
}

func main() {
    // 启动服务
    mux := http.NewServeMux()
    Admin.MountTo("/admin", mux)
    http.ListenAndServe(":9000", mux)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

系统是英文的,可以给user的每一个字段加上一个 label 表示中文名称。
同时还可以增加一个type类型表示是个输入框,chekckbox,等类型。

 user.Meta(&admin.Meta{Name: "Email", Label: "邮箱"})
    user.Meta(&admin.Meta{Name: "Name", Label: "名称"})
    user.Meta(&admin.Meta{Name: "Gender", Label: "性别", Config: &admin.SelectOneConfig{Collection: []string{"Male", "Female", "Unknown"}}})  
  • 1
  • 2
  • 3

增加拦截:

// Filter products by collection
    user.Filter(&admin.Filter{
        Name:   "角色",
        Config: &admin.SelectOneConfig{RemoteDataResource: role},
    })
  • 1
  • 2
  • 3
  • 4
  • 5

按照角色查询过滤,并且这个数据字段是从ajax 查询 role 数据表查询到的。

3,显示界面




还是那个 main 函数,由于不直接操作页面。
所以显示,都是通过参数配置进行的,执行都是再 qor的文档里面慢慢研究的。

4,总结


qor 通过一系列的配置,来控制 curd的。
加上分页查询,过滤,并且对于slelect 还可以关联查询其他数据表的数据。
比如说用户的角色配置,查询的是角色表。
用户的组查询 组数据表,地址查询地址信息表。
再新增和修改都是这样操作的。这些功能写起来到不是很复杂,但是进行多个数据库查询,咋也得花上几个小时完成,但是使用qor 只需要配置下就行了。也就画上几分钟,当然,我研究的时候花了好几天。
再做新功能的时候超级快了。更多时间花到业务逻辑上,而不是做CRUD管理查询啥的。。

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/80740388

博主地址是:http://blog.csdn.net/freewebsys

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/1021127
推荐阅读
相关标签
  

闽ICP备14008679号