赞
踩
本文的原文连接是:
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
qor的一个核心功能,也是我超级喜欢的一个功能。
就是可以配置配置。就能完成一个 CRUD的界面,超级方便呢。
看看qor设计的一个系统,对应每一个不同的cms,总有写资源是不一样的。
没有使用通用的模式,而是将数据的权限控制交给了开发人员。
开发人员设计几个数据结构,然后就可以操作mysql数据库了。
先看代码:
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)
}
系统是英文的,可以给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"}}})
增加拦截:
// Filter products by collection
user.Filter(&admin.Filter{
Name: "角色",
Config: &admin.SelectOneConfig{RemoteDataResource: role},
})
按照角色查询过滤,并且这个数据字段是从ajax 查询 role 数据表查询到的。
还是那个 main 函数,由于不直接操作页面。
所以显示,都是通过参数配置进行的,执行都是再 qor的文档里面慢慢研究的。
qor 通过一系列的配置,来控制 curd的。
加上分页查询,过滤,并且对于slelect 还可以关联查询其他数据表的数据。
比如说用户的角色配置,查询的是角色表。
用户的组查询 组数据表,地址查询地址信息表。
再新增和修改都是这样操作的。这些功能写起来到不是很复杂,但是进行多个数据库查询,咋也得花上几个小时完成,但是使用qor 只需要配置下就行了。也就画上几分钟,当然,我研究的时候花了好几天。
再做新功能的时候超级快了。更多时间花到业务逻辑上,而不是做CRUD管理查询啥的。。
本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/80740388
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。