From f46f452434b40a220952f781b0de0d25d145186a Mon Sep 17 00:00:00 2001 From: yxh Date: Thu, 26 Dec 2019 22:55:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E7=94=A8=E6=88=B7=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E6=96=87=E4=BB=B6=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/model/qxkj_role/qxkj_role.go | 3 + app/model/qxkj_role/qxkj_role_entity.go | 62 +++++ app/model/qxkj_role/qxkj_role_model.go | 248 ++++++++++++++++++ app/model/qxkj_role_user/qxkj_role_user.go | 3 + .../qxkj_role_user/qxkj_role_user_entity.go | 57 ++++ .../qxkj_role_user/qxkj_role_user_model.go | 248 ++++++++++++++++++ app/model/qxkj_user/qxkj_user.go | 3 + app/model/qxkj_user/qxkj_user_entity.go | 67 +++++ app/model/qxkj_user/qxkj_user_model.go | 248 ++++++++++++++++++ data/db.sql | 124 +++++++++ test/demo_test.go | 14 +- 11 files changed, 1070 insertions(+), 7 deletions(-) create mode 100644 app/model/qxkj_role/qxkj_role.go create mode 100644 app/model/qxkj_role/qxkj_role_entity.go create mode 100644 app/model/qxkj_role/qxkj_role_model.go create mode 100644 app/model/qxkj_role_user/qxkj_role_user.go create mode 100644 app/model/qxkj_role_user/qxkj_role_user_entity.go create mode 100644 app/model/qxkj_role_user/qxkj_role_user_model.go create mode 100644 app/model/qxkj_user/qxkj_user.go create mode 100644 app/model/qxkj_user/qxkj_user_entity.go create mode 100644 app/model/qxkj_user/qxkj_user_model.go create mode 100644 data/db.sql diff --git a/app/model/qxkj_role/qxkj_role.go b/app/model/qxkj_role/qxkj_role.go new file mode 100644 index 0000000..0f6ab7d --- /dev/null +++ b/app/model/qxkj_role/qxkj_role.go @@ -0,0 +1,3 @@ +package qxkj_role + +// Fill with you ideas below. diff --git a/app/model/qxkj_role/qxkj_role_entity.go b/app/model/qxkj_role/qxkj_role_entity.go new file mode 100644 index 0000000..3ff5306 --- /dev/null +++ b/app/model/qxkj_role/qxkj_role_entity.go @@ -0,0 +1,62 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package qxkj_role + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" +) + +// Entity is the golang structure for table qxkj_role. +type Entity struct { + Id int `orm:"id,primary" json:"id"` // + ParentId int `orm:"parent_id" json:"parent_id"` // 父角色ID + Status int `orm:"status" json:"status"` // 状态;0:禁用;1:正常 + CreateTime int `orm:"create_time" json:"create_time"` // 创建时间 + UpdateTime int `orm:"update_time" json:"update_time"` // 更新时间 + ListOrder float64 `orm:"list_order" json:"list_order"` // 排序 + Name string `orm:"name" json:"name"` // 角色名称 + Remark string `orm:"remark" json:"remark"` // 备注 +} + +// QxkjRole is alias of Entity, which some developers say they just want. +type QxkjRole = Entity + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (r *Entity) OmitEmpty() *arModel { + return Model.Data(r).OmitEmpty() +} + +// Inserts does "INSERT...INTO..." statement for inserting current object into table. +func (r *Entity) Insert() (result sql.Result, err error) { + return Model.Data(r).Insert() +} + +// Replace does "REPLACE...INTO..." statement for inserting current object into table. +// If there's already another same record in the table (it checks using primary key or unique index), +// it deletes it and insert this one. +func (r *Entity) Replace() (result sql.Result, err error) { + return Model.Data(r).Replace() +} + +// Save does "INSERT...INTO..." statement for inserting/updating current object into table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Save() (result sql.Result, err error) { + return Model.Data(r).Save() +} + +// Update does "UPDATE...WHERE..." statement for updating current object from table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Update() (result sql.Result, err error) { + return Model.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update() +} + +// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table. +func (r *Entity) Delete() (result sql.Result, err error) { + return Model.Where(gdb.GetWhereConditionOfStruct(r)).Delete() +} diff --git a/app/model/qxkj_role/qxkj_role_model.go b/app/model/qxkj_role/qxkj_role_model.go new file mode 100644 index 0000000..55e7afa --- /dev/null +++ b/app/model/qxkj_role/qxkj_role_model.go @@ -0,0 +1,248 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package qxkj_role + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" + "github.com/gogf/gf/frame/g" + "time" +) + +// arModel is a active record design model for table qxkj_role operations. +type arModel struct { + Model *gdb.Model +} + +var ( + // Table is the table name of qxkj_role. + Table = "qxkj_role" + // Model is the model object of qxkj_role. + Model = &arModel{g.DB("default").Table(Table).Safe()} +) + +// TX sets the transaction for current operation. +func (m *arModel) TX(tx *gdb.TX) *arModel { + return &arModel{m.Model.TX(tx)} +} + +// Master marks the following operation on master node. +func (m *arModel) Master() *arModel { + return &arModel{m.Model.Master()} +} + +// Slave marks the following operation on slave node. +// Note that it makes sense only if there's any slave node configured. +func (m *arModel) Slave() *arModel { + return &arModel{m.Model.Slave()} +} + +// LeftJoin does "LEFT JOIN ... ON ..." statement on the model. +func (m *arModel) LeftJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.LeftJoin(joinTable, on)} +} + +// RightJoin does "RIGHT JOIN ... ON ..." statement on the model. +func (m *arModel) RightJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.RightJoin(joinTable, on)} +} + +// InnerJoin does "INNER JOIN ... ON ..." statement on the model. +func (m *arModel) InnerJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.InnerJoin(joinTable, on)} +} + +// Fields sets the operation fields of the model, multiple fields joined using char ','. +func (m *arModel) Fields(fields string) *arModel { + return &arModel{m.Model.Fields(fields)} +} + +// FieldsEx sets the excluded operation fields of the model, multiple fields joined using char ','. +func (m *arModel) FieldsEx(fields string) *arModel { + return &arModel{m.Model.FieldsEx(fields)} +} + +// Option sets the extra operation option for the model. +func (m *arModel) Option(option int) *arModel { + return &arModel{m.Model.Option(option)} +} + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (m *arModel) OmitEmpty() *arModel { + return &arModel{m.Model.OmitEmpty()} +} + +// Filter marks filtering the fields which does not exist in the fields of the operated table. +func (m *arModel) Filter() *arModel { + return &arModel{m.Model.Filter()} +} + +// Where sets the condition statement for the model. The parameter can be type of +// string/map/gmap/slice/struct/*struct, etc. Note that, if it's called more than one times, +// multiple conditions will be joined into where statement using "AND". +// Eg: +// Where("uid=10000") +// Where("uid", 10000) +// Where("money>? AND name like ?", 99999, "vip_%") +// Where("uid", 1).Where("name", "john") +// Where("status IN (?)", g.Slice{1,2,3}) +// Where("age IN(?,?)", 18, 50) +// Where(User{ Id : 1, UserName : "john"}) +func (m *arModel) Where(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.Where(where, args...)} +} + +// And adds "AND" condition to the where statement. +func (m *arModel) And(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.And(where, args...)} +} + +// Or adds "OR" condition to the where statement. +func (m *arModel) Or(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.Or(where, args...)} +} + +// GroupBy sets the "GROUP BY" statement for the model. +func (m *arModel) GroupBy(groupBy string) *arModel { + return &arModel{m.Model.GroupBy(groupBy)} +} + +// OrderBy sets the "ORDER BY" statement for the model. +func (m *arModel) OrderBy(orderBy string) *arModel { + return &arModel{m.Model.OrderBy(orderBy)} +} + +// Limit sets the "LIMIT" statement for the model. +// The parameter can be either one or two number, if passed two number is passed, +// it then sets "LIMIT limit[0],limit[1]" statement for the model, or else it sets "LIMIT limit[0]" +// statement. +func (m *arModel) Limit(limit ...int) *arModel { + return &arModel{m.Model.Limit(limit...)} +} + +// Offset sets the "OFFSET" statement for the model. +// It only makes sense for some databases like SQLServer, PostgreSQL, etc. +func (m *arModel) Offset(offset int) *arModel { + return &arModel{m.Model.Offset(offset)} +} + +// ForPage sets the paging number for the model. +// The parameter is started from 1 for paging. +// Note that, it differs that the Limit function start from 0 for "LIMIT" statement. +func (m *arModel) ForPage(page, limit int) *arModel { + return &arModel{m.Model.ForPage(page, limit)} +} + +// Batch sets the batch operation number for the model. +func (m *arModel) Batch(batch int) *arModel { + return &arModel{m.Model.Batch(batch)} +} + +// Cache sets the cache feature for the model. It caches the result of the sql, which means +// if there's another same sql request, it just reads and returns the result from cache, it +// but not committed and executed into the database. +// +// If the parameter < 0, which means it clear the cache with given . +// If the parameter = 0, which means it never expires. +// If the parameter > 0, which means it expires after . +// +// The optional parameter is used to bind a name to the cache, which means you can later +// control the cache like changing the or clearing the cache with specified . +// +// Note that, the cache feature is disabled if the model is operating on a transaction. +func (m *arModel) Cache(expire time.Duration, name ...string) *arModel { + return &arModel{m.Model.Cache(expire, name...)} +} + +// Data sets the operation data for the model. +// The parameter can be type of string/map/gmap/slice/struct/*struct, etc. +// Eg: +// Data("uid=10000") +// Data("uid", 10000) +// Data(g.Map{"uid": 10000, "name":"john"}) +// Data(g.Slice{g.Map{"uid": 10000, "name":"john"}, g.Map{"uid": 20000, "name":"smith"}) +func (m *arModel) Data(data ...interface{}) *arModel { + return &arModel{m.Model.Data(data...)} +} + +// Insert does "INSERT INTO ..." statement for the model. +func (m *arModel) Insert() (result sql.Result, err error) { + return m.Model.Insert() +} + +// Replace does "REPLACE INTO ..." statement for the model. +func (m *arModel) Replace() (result sql.Result, err error) { + return m.Model.Replace() +} + +// Save does "INSERT INTO ... ON DUPLICATE KEY UPDATE..." statement for the model. +// It updates the record if there's primary or unique index in the saving data, +// or else it inserts a new record into the table. +func (m *arModel) Save() (result sql.Result, err error) { + return m.Model.Save() +} + +// Update does "UPDATE ... " statement for the model. +func (m *arModel) Update() (result sql.Result, err error) { + return m.Model.Update() +} + +// Delete does "DELETE FROM ... " statement for the model. +func (m *arModel) Delete() (result sql.Result, err error) { + return m.Model.Delete() +} + +// Count does "SELECT COUNT(x) FROM ..." statement for the model. +func (m *arModel) Count() (int, error) { + return m.Model.Count() +} + +// All does "SELECT FROM ..." statement for the model. +// It retrieves the records from table and returns the result as []*Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +func (m *arModel) All() ([]*Entity, error) { + all, err := m.Model.All() + if err != nil { + return nil, err + } + var entities []*Entity + if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entities, nil +} + +// One retrieves one record from table and returns the result as *Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +func (m *arModel) One() (*Entity, error) { + one, err := m.Model.One() + if err != nil { + return nil, err + } + var entity *Entity + if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entity, nil +} + +// Value retrieves a specified record value from table and returns the result as interface type. +// It returns nil if there's no record found with the given conditions from table. +func (m *arModel) Value() (gdb.Value, error) { + return m.Model.Value() +} + +// Chunk iterates the table with given size and callback function. +func (m *arModel) Chunk(limit int, callback func(entities []*Entity, err error) bool) { + m.Model.Chunk(limit, func(result gdb.Result, err error) bool { + var entities []*Entity + err = result.Structs(&entities) + if err == sql.ErrNoRows { + return false + } + return callback(entities, err) + }) +} diff --git a/app/model/qxkj_role_user/qxkj_role_user.go b/app/model/qxkj_role_user/qxkj_role_user.go new file mode 100644 index 0000000..8eb7954 --- /dev/null +++ b/app/model/qxkj_role_user/qxkj_role_user.go @@ -0,0 +1,3 @@ +package qxkj_role_user + +// Fill with you ideas below. diff --git a/app/model/qxkj_role_user/qxkj_role_user_entity.go b/app/model/qxkj_role_user/qxkj_role_user_entity.go new file mode 100644 index 0000000..41838b7 --- /dev/null +++ b/app/model/qxkj_role_user/qxkj_role_user_entity.go @@ -0,0 +1,57 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package qxkj_role_user + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" +) + +// Entity is the golang structure for table qxkj_role_user. +type Entity struct { + Id int `orm:"id,primary" json:"id"` // + RoleId int `orm:"role_id" json:"role_id"` // 角色 id + UserId int `orm:"user_id" json:"user_id"` // 用户id +} + +// QxkjRoleUser is alias of Entity, which some developers say they just want. +type QxkjRoleUser = Entity + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (r *Entity) OmitEmpty() *arModel { + return Model.Data(r).OmitEmpty() +} + +// Inserts does "INSERT...INTO..." statement for inserting current object into table. +func (r *Entity) Insert() (result sql.Result, err error) { + return Model.Data(r).Insert() +} + +// Replace does "REPLACE...INTO..." statement for inserting current object into table. +// If there's already another same record in the table (it checks using primary key or unique index), +// it deletes it and insert this one. +func (r *Entity) Replace() (result sql.Result, err error) { + return Model.Data(r).Replace() +} + +// Save does "INSERT...INTO..." statement for inserting/updating current object into table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Save() (result sql.Result, err error) { + return Model.Data(r).Save() +} + +// Update does "UPDATE...WHERE..." statement for updating current object from table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Update() (result sql.Result, err error) { + return Model.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update() +} + +// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table. +func (r *Entity) Delete() (result sql.Result, err error) { + return Model.Where(gdb.GetWhereConditionOfStruct(r)).Delete() +} diff --git a/app/model/qxkj_role_user/qxkj_role_user_model.go b/app/model/qxkj_role_user/qxkj_role_user_model.go new file mode 100644 index 0000000..15c23da --- /dev/null +++ b/app/model/qxkj_role_user/qxkj_role_user_model.go @@ -0,0 +1,248 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package qxkj_role_user + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" + "github.com/gogf/gf/frame/g" + "time" +) + +// arModel is a active record design model for table qxkj_role_user operations. +type arModel struct { + Model *gdb.Model +} + +var ( + // Table is the table name of qxkj_role_user. + Table = "qxkj_role_user" + // Model is the model object of qxkj_role_user. + Model = &arModel{g.DB("default").Table(Table).Safe()} +) + +// TX sets the transaction for current operation. +func (m *arModel) TX(tx *gdb.TX) *arModel { + return &arModel{m.Model.TX(tx)} +} + +// Master marks the following operation on master node. +func (m *arModel) Master() *arModel { + return &arModel{m.Model.Master()} +} + +// Slave marks the following operation on slave node. +// Note that it makes sense only if there's any slave node configured. +func (m *arModel) Slave() *arModel { + return &arModel{m.Model.Slave()} +} + +// LeftJoin does "LEFT JOIN ... ON ..." statement on the model. +func (m *arModel) LeftJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.LeftJoin(joinTable, on)} +} + +// RightJoin does "RIGHT JOIN ... ON ..." statement on the model. +func (m *arModel) RightJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.RightJoin(joinTable, on)} +} + +// InnerJoin does "INNER JOIN ... ON ..." statement on the model. +func (m *arModel) InnerJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.InnerJoin(joinTable, on)} +} + +// Fields sets the operation fields of the model, multiple fields joined using char ','. +func (m *arModel) Fields(fields string) *arModel { + return &arModel{m.Model.Fields(fields)} +} + +// FieldsEx sets the excluded operation fields of the model, multiple fields joined using char ','. +func (m *arModel) FieldsEx(fields string) *arModel { + return &arModel{m.Model.FieldsEx(fields)} +} + +// Option sets the extra operation option for the model. +func (m *arModel) Option(option int) *arModel { + return &arModel{m.Model.Option(option)} +} + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (m *arModel) OmitEmpty() *arModel { + return &arModel{m.Model.OmitEmpty()} +} + +// Filter marks filtering the fields which does not exist in the fields of the operated table. +func (m *arModel) Filter() *arModel { + return &arModel{m.Model.Filter()} +} + +// Where sets the condition statement for the model. The parameter can be type of +// string/map/gmap/slice/struct/*struct, etc. Note that, if it's called more than one times, +// multiple conditions will be joined into where statement using "AND". +// Eg: +// Where("uid=10000") +// Where("uid", 10000) +// Where("money>? AND name like ?", 99999, "vip_%") +// Where("uid", 1).Where("name", "john") +// Where("status IN (?)", g.Slice{1,2,3}) +// Where("age IN(?,?)", 18, 50) +// Where(User{ Id : 1, UserName : "john"}) +func (m *arModel) Where(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.Where(where, args...)} +} + +// And adds "AND" condition to the where statement. +func (m *arModel) And(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.And(where, args...)} +} + +// Or adds "OR" condition to the where statement. +func (m *arModel) Or(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.Or(where, args...)} +} + +// GroupBy sets the "GROUP BY" statement for the model. +func (m *arModel) GroupBy(groupBy string) *arModel { + return &arModel{m.Model.GroupBy(groupBy)} +} + +// OrderBy sets the "ORDER BY" statement for the model. +func (m *arModel) OrderBy(orderBy string) *arModel { + return &arModel{m.Model.OrderBy(orderBy)} +} + +// Limit sets the "LIMIT" statement for the model. +// The parameter can be either one or two number, if passed two number is passed, +// it then sets "LIMIT limit[0],limit[1]" statement for the model, or else it sets "LIMIT limit[0]" +// statement. +func (m *arModel) Limit(limit ...int) *arModel { + return &arModel{m.Model.Limit(limit...)} +} + +// Offset sets the "OFFSET" statement for the model. +// It only makes sense for some databases like SQLServer, PostgreSQL, etc. +func (m *arModel) Offset(offset int) *arModel { + return &arModel{m.Model.Offset(offset)} +} + +// ForPage sets the paging number for the model. +// The parameter is started from 1 for paging. +// Note that, it differs that the Limit function start from 0 for "LIMIT" statement. +func (m *arModel) ForPage(page, limit int) *arModel { + return &arModel{m.Model.ForPage(page, limit)} +} + +// Batch sets the batch operation number for the model. +func (m *arModel) Batch(batch int) *arModel { + return &arModel{m.Model.Batch(batch)} +} + +// Cache sets the cache feature for the model. It caches the result of the sql, which means +// if there's another same sql request, it just reads and returns the result from cache, it +// but not committed and executed into the database. +// +// If the parameter < 0, which means it clear the cache with given . +// If the parameter = 0, which means it never expires. +// If the parameter > 0, which means it expires after . +// +// The optional parameter is used to bind a name to the cache, which means you can later +// control the cache like changing the or clearing the cache with specified . +// +// Note that, the cache feature is disabled if the model is operating on a transaction. +func (m *arModel) Cache(expire time.Duration, name ...string) *arModel { + return &arModel{m.Model.Cache(expire, name...)} +} + +// Data sets the operation data for the model. +// The parameter can be type of string/map/gmap/slice/struct/*struct, etc. +// Eg: +// Data("uid=10000") +// Data("uid", 10000) +// Data(g.Map{"uid": 10000, "name":"john"}) +// Data(g.Slice{g.Map{"uid": 10000, "name":"john"}, g.Map{"uid": 20000, "name":"smith"}) +func (m *arModel) Data(data ...interface{}) *arModel { + return &arModel{m.Model.Data(data...)} +} + +// Insert does "INSERT INTO ..." statement for the model. +func (m *arModel) Insert() (result sql.Result, err error) { + return m.Model.Insert() +} + +// Replace does "REPLACE INTO ..." statement for the model. +func (m *arModel) Replace() (result sql.Result, err error) { + return m.Model.Replace() +} + +// Save does "INSERT INTO ... ON DUPLICATE KEY UPDATE..." statement for the model. +// It updates the record if there's primary or unique index in the saving data, +// or else it inserts a new record into the table. +func (m *arModel) Save() (result sql.Result, err error) { + return m.Model.Save() +} + +// Update does "UPDATE ... " statement for the model. +func (m *arModel) Update() (result sql.Result, err error) { + return m.Model.Update() +} + +// Delete does "DELETE FROM ... " statement for the model. +func (m *arModel) Delete() (result sql.Result, err error) { + return m.Model.Delete() +} + +// Count does "SELECT COUNT(x) FROM ..." statement for the model. +func (m *arModel) Count() (int, error) { + return m.Model.Count() +} + +// All does "SELECT FROM ..." statement for the model. +// It retrieves the records from table and returns the result as []*Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +func (m *arModel) All() ([]*Entity, error) { + all, err := m.Model.All() + if err != nil { + return nil, err + } + var entities []*Entity + if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entities, nil +} + +// One retrieves one record from table and returns the result as *Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +func (m *arModel) One() (*Entity, error) { + one, err := m.Model.One() + if err != nil { + return nil, err + } + var entity *Entity + if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entity, nil +} + +// Value retrieves a specified record value from table and returns the result as interface type. +// It returns nil if there's no record found with the given conditions from table. +func (m *arModel) Value() (gdb.Value, error) { + return m.Model.Value() +} + +// Chunk iterates the table with given size and callback function. +func (m *arModel) Chunk(limit int, callback func(entities []*Entity, err error) bool) { + m.Model.Chunk(limit, func(result gdb.Result, err error) bool { + var entities []*Entity + err = result.Structs(&entities) + if err == sql.ErrNoRows { + return false + } + return callback(entities, err) + }) +} diff --git a/app/model/qxkj_user/qxkj_user.go b/app/model/qxkj_user/qxkj_user.go new file mode 100644 index 0000000..598e71d --- /dev/null +++ b/app/model/qxkj_user/qxkj_user.go @@ -0,0 +1,3 @@ +package qxkj_user + +// Fill with you ideas below. diff --git a/app/model/qxkj_user/qxkj_user_entity.go b/app/model/qxkj_user/qxkj_user_entity.go new file mode 100644 index 0000000..44f0a6c --- /dev/null +++ b/app/model/qxkj_user/qxkj_user_entity.go @@ -0,0 +1,67 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package qxkj_user + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" +) + +// Entity is the golang structure for table qxkj_user. +type Entity struct { + Id int `orm:"id,primary" json:"id"` // + UserName string `orm:"user_name,unique" json:"user_name"` // 用户名 + Mobile string `orm:"mobile,unique" json:"mobile"` // 中国手机不带国家代码,国际手机号格式为:国家代码-手机号 + UserNickname string `orm:"user_nickname" json:"user_nickname"` // 用户昵称 + Birthday int `orm:"birthday" json:"birthday"` // 生日 + CreateTime int `orm:"create_time" json:"create_time"` // 注册时间 + UserPassword string `orm:"user_password" json:"user_password"` // 登录密码;cmf_password加密 + UserStatus int `orm:"user_status" json:"user_status"` // 用户状态;0:禁用,1:正常,2:未验证 + UserEmail string `orm:"user_email" json:"user_email"` // 用户登录邮箱 + Sex int `orm:"sex" json:"sex"` // 性别;0:保密,1:男,2:女 + Avatar string `orm:"avatar" json:"avatar"` // 用户头像 + LastLoginTime int `orm:"last_login_time" json:"last_login_time"` // 最后登录时间 + LastLoginIp string `orm:"last_login_ip" json:"last_login_ip"` // 最后登录ip +} + +// QxkjUser is alias of Entity, which some developers say they just want. +type QxkjUser = Entity + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (r *Entity) OmitEmpty() *arModel { + return Model.Data(r).OmitEmpty() +} + +// Inserts does "INSERT...INTO..." statement for inserting current object into table. +func (r *Entity) Insert() (result sql.Result, err error) { + return Model.Data(r).Insert() +} + +// Replace does "REPLACE...INTO..." statement for inserting current object into table. +// If there's already another same record in the table (it checks using primary key or unique index), +// it deletes it and insert this one. +func (r *Entity) Replace() (result sql.Result, err error) { + return Model.Data(r).Replace() +} + +// Save does "INSERT...INTO..." statement for inserting/updating current object into table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Save() (result sql.Result, err error) { + return Model.Data(r).Save() +} + +// Update does "UPDATE...WHERE..." statement for updating current object from table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Update() (result sql.Result, err error) { + return Model.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update() +} + +// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table. +func (r *Entity) Delete() (result sql.Result, err error) { + return Model.Where(gdb.GetWhereConditionOfStruct(r)).Delete() +} diff --git a/app/model/qxkj_user/qxkj_user_model.go b/app/model/qxkj_user/qxkj_user_model.go new file mode 100644 index 0000000..7171b54 --- /dev/null +++ b/app/model/qxkj_user/qxkj_user_model.go @@ -0,0 +1,248 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package qxkj_user + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" + "github.com/gogf/gf/frame/g" + "time" +) + +// arModel is a active record design model for table qxkj_user operations. +type arModel struct { + Model *gdb.Model +} + +var ( + // Table is the table name of qxkj_user. + Table = "qxkj_user" + // Model is the model object of qxkj_user. + Model = &arModel{g.DB("default").Table(Table).Safe()} +) + +// TX sets the transaction for current operation. +func (m *arModel) TX(tx *gdb.TX) *arModel { + return &arModel{m.Model.TX(tx)} +} + +// Master marks the following operation on master node. +func (m *arModel) Master() *arModel { + return &arModel{m.Model.Master()} +} + +// Slave marks the following operation on slave node. +// Note that it makes sense only if there's any slave node configured. +func (m *arModel) Slave() *arModel { + return &arModel{m.Model.Slave()} +} + +// LeftJoin does "LEFT JOIN ... ON ..." statement on the model. +func (m *arModel) LeftJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.LeftJoin(joinTable, on)} +} + +// RightJoin does "RIGHT JOIN ... ON ..." statement on the model. +func (m *arModel) RightJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.RightJoin(joinTable, on)} +} + +// InnerJoin does "INNER JOIN ... ON ..." statement on the model. +func (m *arModel) InnerJoin(joinTable string, on string) *arModel { + return &arModel{m.Model.InnerJoin(joinTable, on)} +} + +// Fields sets the operation fields of the model, multiple fields joined using char ','. +func (m *arModel) Fields(fields string) *arModel { + return &arModel{m.Model.Fields(fields)} +} + +// FieldsEx sets the excluded operation fields of the model, multiple fields joined using char ','. +func (m *arModel) FieldsEx(fields string) *arModel { + return &arModel{m.Model.FieldsEx(fields)} +} + +// Option sets the extra operation option for the model. +func (m *arModel) Option(option int) *arModel { + return &arModel{m.Model.Option(option)} +} + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (m *arModel) OmitEmpty() *arModel { + return &arModel{m.Model.OmitEmpty()} +} + +// Filter marks filtering the fields which does not exist in the fields of the operated table. +func (m *arModel) Filter() *arModel { + return &arModel{m.Model.Filter()} +} + +// Where sets the condition statement for the model. The parameter can be type of +// string/map/gmap/slice/struct/*struct, etc. Note that, if it's called more than one times, +// multiple conditions will be joined into where statement using "AND". +// Eg: +// Where("uid=10000") +// Where("uid", 10000) +// Where("money>? AND name like ?", 99999, "vip_%") +// Where("uid", 1).Where("name", "john") +// Where("status IN (?)", g.Slice{1,2,3}) +// Where("age IN(?,?)", 18, 50) +// Where(User{ Id : 1, UserName : "john"}) +func (m *arModel) Where(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.Where(where, args...)} +} + +// And adds "AND" condition to the where statement. +func (m *arModel) And(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.And(where, args...)} +} + +// Or adds "OR" condition to the where statement. +func (m *arModel) Or(where interface{}, args ...interface{}) *arModel { + return &arModel{m.Model.Or(where, args...)} +} + +// GroupBy sets the "GROUP BY" statement for the model. +func (m *arModel) GroupBy(groupBy string) *arModel { + return &arModel{m.Model.GroupBy(groupBy)} +} + +// OrderBy sets the "ORDER BY" statement for the model. +func (m *arModel) OrderBy(orderBy string) *arModel { + return &arModel{m.Model.OrderBy(orderBy)} +} + +// Limit sets the "LIMIT" statement for the model. +// The parameter can be either one or two number, if passed two number is passed, +// it then sets "LIMIT limit[0],limit[1]" statement for the model, or else it sets "LIMIT limit[0]" +// statement. +func (m *arModel) Limit(limit ...int) *arModel { + return &arModel{m.Model.Limit(limit...)} +} + +// Offset sets the "OFFSET" statement for the model. +// It only makes sense for some databases like SQLServer, PostgreSQL, etc. +func (m *arModel) Offset(offset int) *arModel { + return &arModel{m.Model.Offset(offset)} +} + +// ForPage sets the paging number for the model. +// The parameter is started from 1 for paging. +// Note that, it differs that the Limit function start from 0 for "LIMIT" statement. +func (m *arModel) ForPage(page, limit int) *arModel { + return &arModel{m.Model.ForPage(page, limit)} +} + +// Batch sets the batch operation number for the model. +func (m *arModel) Batch(batch int) *arModel { + return &arModel{m.Model.Batch(batch)} +} + +// Cache sets the cache feature for the model. It caches the result of the sql, which means +// if there's another same sql request, it just reads and returns the result from cache, it +// but not committed and executed into the database. +// +// If the parameter < 0, which means it clear the cache with given . +// If the parameter = 0, which means it never expires. +// If the parameter > 0, which means it expires after . +// +// The optional parameter is used to bind a name to the cache, which means you can later +// control the cache like changing the or clearing the cache with specified . +// +// Note that, the cache feature is disabled if the model is operating on a transaction. +func (m *arModel) Cache(expire time.Duration, name ...string) *arModel { + return &arModel{m.Model.Cache(expire, name...)} +} + +// Data sets the operation data for the model. +// The parameter can be type of string/map/gmap/slice/struct/*struct, etc. +// Eg: +// Data("uid=10000") +// Data("uid", 10000) +// Data(g.Map{"uid": 10000, "name":"john"}) +// Data(g.Slice{g.Map{"uid": 10000, "name":"john"}, g.Map{"uid": 20000, "name":"smith"}) +func (m *arModel) Data(data ...interface{}) *arModel { + return &arModel{m.Model.Data(data...)} +} + +// Insert does "INSERT INTO ..." statement for the model. +func (m *arModel) Insert() (result sql.Result, err error) { + return m.Model.Insert() +} + +// Replace does "REPLACE INTO ..." statement for the model. +func (m *arModel) Replace() (result sql.Result, err error) { + return m.Model.Replace() +} + +// Save does "INSERT INTO ... ON DUPLICATE KEY UPDATE..." statement for the model. +// It updates the record if there's primary or unique index in the saving data, +// or else it inserts a new record into the table. +func (m *arModel) Save() (result sql.Result, err error) { + return m.Model.Save() +} + +// Update does "UPDATE ... " statement for the model. +func (m *arModel) Update() (result sql.Result, err error) { + return m.Model.Update() +} + +// Delete does "DELETE FROM ... " statement for the model. +func (m *arModel) Delete() (result sql.Result, err error) { + return m.Model.Delete() +} + +// Count does "SELECT COUNT(x) FROM ..." statement for the model. +func (m *arModel) Count() (int, error) { + return m.Model.Count() +} + +// All does "SELECT FROM ..." statement for the model. +// It retrieves the records from table and returns the result as []*Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +func (m *arModel) All() ([]*Entity, error) { + all, err := m.Model.All() + if err != nil { + return nil, err + } + var entities []*Entity + if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entities, nil +} + +// One retrieves one record from table and returns the result as *Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +func (m *arModel) One() (*Entity, error) { + one, err := m.Model.One() + if err != nil { + return nil, err + } + var entity *Entity + if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entity, nil +} + +// Value retrieves a specified record value from table and returns the result as interface type. +// It returns nil if there's no record found with the given conditions from table. +func (m *arModel) Value() (gdb.Value, error) { + return m.Model.Value() +} + +// Chunk iterates the table with given size and callback function. +func (m *arModel) Chunk(limit int, callback func(entities []*Entity, err error) bool) { + m.Model.Chunk(limit, func(result gdb.Result, err error) bool { + var entities []*Entity + err = result.Structs(&entities) + if err == sql.ErrNoRows { + return false + } + return callback(entities, err) + }) +} diff --git a/data/db.sql b/data/db.sql new file mode 100644 index 0000000..7dc3c7e --- /dev/null +++ b/data/db.sql @@ -0,0 +1,124 @@ +-- MySQL dump 10.13 Distrib 5.6.26, for Win64 (x86_64) +-- +-- Host: localhost Database: gfast +-- ------------------------------------------------------ +-- Server version 5.6.26 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `qxkj_role` +-- + +DROP TABLE IF EXISTS `qxkj_role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `qxkj_role` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父角色ID', + `status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '状态;0:禁用;1:正常', + `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + `list_order` float NOT NULL DEFAULT '0' COMMENT '排序', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '角色名称', + `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', + PRIMARY KEY (`id`), + KEY `parent_id` (`parent_id`), + KEY `status` (`status`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `qxkj_role` +-- + +LOCK TABLES `qxkj_role` WRITE; +/*!40000 ALTER TABLE `qxkj_role` DISABLE KEYS */; +INSERT INTO `qxkj_role` VALUES (1,0,1,1329633709,1329633709,0,'超级管理员','拥有网站最高管理员权限!'),(2,0,1,1329633709,1329633709,0,'普通管理员','权限由最高管理员分配!'),(3,0,1,0,0,0,'站点管理员','站点管理人员'),(4,0,1,0,0,0,'初级管理员','初级管理员'),(5,0,1,0,0,0,'高级管理员','高级管理员'),(6,0,0,0,0,0,'超级管理员','超级管理员'),(7,0,1,0,0,0,'系统管理员','包含所有系统设置权限'),(8,0,1,0,0,0,'区级管理员',''); +/*!40000 ALTER TABLE `qxkj_role` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `qxkj_role_user` +-- + +DROP TABLE IF EXISTS `qxkj_role_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `qxkj_role_user` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `role_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '角色 id', + `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户id', + PRIMARY KEY (`id`), + KEY `role_id` (`role_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8 COMMENT='用户角色对应表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `qxkj_role_user` +-- + +LOCK TABLES `qxkj_role_user` WRITE; +/*!40000 ALTER TABLE `qxkj_role_user` DISABLE KEYS */; +INSERT INTO `qxkj_role_user` VALUES (6,3,4),(8,2,5),(10,2,6),(20,4,7),(21,7,2),(23,2,10),(27,2,14),(28,2,15),(29,2,16),(47,2,20),(48,7,3),(49,2,3),(50,2,23),(51,7,22),(52,2,24),(53,5,8); +/*!40000 ALTER TABLE `qxkj_role_user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `qxkj_user` +-- + +DROP TABLE IF EXISTS `qxkj_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `qxkj_user` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户名', + `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '中国手机不带国家代码,国际手机号格式为:国家代码-手机号', + `user_nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户昵称', + `birthday` int(11) NOT NULL DEFAULT '0' COMMENT '生日', + `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间', + `user_password` varchar(255) NOT NULL DEFAULT '' COMMENT '登录密码;cmf_password加密', + `user_status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '用户状态;0:禁用,1:正常,2:未验证', + `user_email` varchar(100) NOT NULL DEFAULT '' COMMENT '用户登录邮箱', + `sex` tinyint(2) NOT NULL DEFAULT '0' COMMENT '性别;0:保密,1:男,2:女', + `avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '用户头像', + `last_login_time` int(11) NOT NULL DEFAULT '0' COMMENT '最后登录时间', + `last_login_ip` varchar(15) NOT NULL DEFAULT '' COMMENT '最后登录ip', + PRIMARY KEY (`id`), + UNIQUE KEY `user_login` (`user_name`) USING BTREE, + UNIQUE KEY `mobile` (`mobile`) USING BTREE, + KEY `user_nickname` (`user_nickname`) +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `qxkj_user` +-- + +LOCK TABLES `qxkj_user` WRITE; +/*!40000 ALTER TABLE `qxkj_user` DISABLE KEYS */; +INSERT INTO `qxkj_user` VALUES (1,'admin','18687460581','超级管理员',0,1557715675,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'yxh669@qq.com',0,'',1571734295,'127.0.0.1'),(2,'yixiaohu','13699885599','易小虎',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'yxh@qq.com',1,'',1571923157,'192.168.31.221'),(3,'zs','16399669855','张三',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'zs@qq.com',0,'',1559293160,'127.0.0.1'),(4,'qlgl','13758596696','测试',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'qlgl@qq.com',0,'',1559293134,'127.0.0.1'),(5,'test','13845696696','测试2',0,0,'9OFlt5qzzvCiZWhe7ilcLA==',1,'123@qq.com',0,'',0,''),(6,'18999998889','13755866654','刘大大',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'1223@qq.com',0,'',0,''),(7,'zmm','13788566696','张明明',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'11123@qq.com',0,'',0,''),(8,'lxx','13756566696','李小小',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'123333@qq.com',0,'',1571729563,'127.0.0.1'),(10,'xmm','13588999969','小秘密',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'',0,'',0,''),(14,'cd_19','123154564','看金利科技',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'',0,'',0,''),(15,'lmm','135877545454','刘敏敏',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'',0,'',0,''),(16,'ldn','13899658874','李大牛',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'',0,'',0,''),(20,'dbc','13877555566','大百词',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'',0,'',0,''),(22,'yxfmlbb','15969423326','袁学飞',0,1557715675,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'yxh6691@qq.com',0,'',1565059554,'127.0.0.1'),(23,'wangming','13699888855','王明',0,0,'IJ1xz+Wve+ZONVMFfXJQMw==',1,'',0,'',0,''),(24,'zhk','13699885591','综合科',0,0,'IZNU7Pn91/++830Pi6HAWA==',1,'',0,'',1569288069,'192.168.0.146'); +/*!40000 ALTER TABLE `qxkj_user` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2019-12-26 22:52:55 diff --git a/test/demo_test.go b/test/demo_test.go index 146f031..9e33b5f 100644 --- a/test/demo_test.go +++ b/test/demo_test.go @@ -9,14 +9,14 @@ import ( "testing" ) -func TestDemo(t *testing.T){ +func TestDemo(t *testing.T) { //t.Run("demo1" ,Demo1) t.Run("Adapters_test", Adapters) } -func Demo1(t *testing.T){ - e,err:=casbin.NewEnforcer("casbin_conf/model.conf","casbin_conf/policy.csv") - if err!=nil{ +func Demo1(t *testing.T) { + e, err := casbin.NewEnforcer("casbin_conf/model.conf", "casbin_conf/policy.csv") + if err != nil { panic(err) } sub := "alice" // the user that wants to access a resource. 对象 @@ -25,7 +25,7 @@ func Demo1(t *testing.T){ ok, err := e.Enforce(sub, obj, act) if err != nil { - fmt.Println("验证失败",err) + fmt.Println("验证失败", err) } if ok == true { @@ -117,7 +117,7 @@ func testAutoSave(t *testing.T, a *utils.Adapter) { // NewEnforcer() will load the policy automatically. e, err := casbin.NewEnforcer("casbin_conf/rbac_model.conf", a) - if err!=nil{ + if err != nil { panic(err) } // AutoSave is enabled by default. @@ -167,4 +167,4 @@ func testSaveLoad(t *testing.T, a *utils.Adapter) { e, _ := casbin.NewEnforcer("casbin_conf/rbac_model.conf", a) testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}) -} \ No newline at end of file +}