官方教程已经上线, 请访问: niuhe.zuxing.net/
在实际开发中, 每添加一个表时,一般就会有对应的增删改查操作, 而这些操作代码又高度相似,copy 代码时枯燥乏味。因此在 0.3.4 版本中添加了 xorm 基本代码生成功能。让编码更聚焦核心功能。
插件会在 niuhe/.model.niuhe 中读取表定义并生成代码。
include('comm.niuhe')
#mode 可选 默认值为 api,
#niuhe 可选, 默认值为 False, 在生成对应的 niuhe 是否覆盖已存在的 niuhe 文件内容
#dao 可选, 默认值为 False, 在生成对应的 dao 是否覆盖已存在的 dao 文件内容
#service 可选, 默认值为 False, 在生成对应的 service 是否覆盖已存在的 service 文件内容
#model 可选, 默认值为 False, 在生成对应的 model 是否覆盖已存在的 model 文件内容
#这里是做示例用, 实际开发中直接写 class Config():即可
class Config(mode='api', niuhe=True, dao=True, service=True, model=True):
'''系统配置表'''
name = required.StringField(desc='配置名称', index=True, search=True, len=255, notnull=True)# index 加索引, len varchar 最大长度, notnull 是否为空 search 分页查询时是否出现在参数中
value = required.LongField(desc='配置值', search=True)
state = required.EnumField(desc='状态', group=comm.StateEnum)
当首次生成代码时, 会生成以下几个文件(以 #app=jobspider为例)
niuhe/api_config.niuhe(需要手动include到all.niuhe中)src/jobspider/xorm/models/config.gosrc/jobspider/xorm/daos/config_dao.gosrc/jobspider/xorm/services/config_svc.gosrc/jobspider/app/api/views/config_views.go(include后才会生成)src/jobspider/app/api/views/gen_config_views.go(include后才会生成)
下列代码均为插件生成的表,api 定义和增删改查代码
niuhe 文件
niuhe/api_config.niuhe
include('comm.niuhe')
class ConfigItem(Message):
'''系统配置表'''
id = optional.LongField(desc='id')
name = required.StringField(desc='配置名称')
value = required.LongField(desc='配置值')
state = required.EnumField(desc='状态', group=comm.StateEnum)
create_at = optional.StringField(desc='创建时间')
update_at = optional.StringField(desc='更新时间')
class ConfigFormReq(Message):
'''请求 Config 信息'''
id = required.LongField()
class ConfigPageReq(Message):
'''分页查询 Config 信息'''
page = required.IntegerField(desc='页码')
size = required.IntegerField(desc='每页数量')
name = required.StringField(desc='配置名称')
value = required.LongField(desc='配置值')
class ConfigPageRsp(Message):
'''分页查询 Config 信息'''
total = required.LongField(desc='总数')
items = repeated.MessageField(cls=ConfigItem, desc='Config信息')
class ConfigNoneRsp(Message):
'''Config 无数据返回'''
pass
with services():
GET('分页查询获取 Config 信息', '/api/config/page/', ConfigPageReq, ConfigPageRsp)
GET('查询获取 Config 信息', '/api/config/form/', ConfigFormReq, ConfigItem)
POST('添加 Config 信息', '/api/config/add/', ConfigItem, ConfigItem)
POST('更新 Config 信息', '/api/config/update/', ConfigItem, ConfigItem)
DELETE('删除 Config 信息', '/api/config/delete/', ConfigFormReq, ConfigNoneRsp)
model 文件
src/jobspider/xorm/models/config.go
package models
// Generated by niuhe.idl
// 如要同步表结构, 需要手动将 Config 手动添加到 models.go 文件的 GetSyncModels 数组中
import (
"jobspider/app/api/protos"
"time"
)
type Config struct {
Id int64 `xorm:"NOT NULL PK AUTOINCR INT(11)"`
Name string `xorm:"VARCHAR(255) NOT NULL INDEX COMMENT('配置名称')"` // 配置名称
Value int64 `xorm:"INT COMMENT('配置值')"` // 配置值
State int `xorm:"INT COMMENT('状态')"` // 状态
CreateAt time.Time `xorm:"created"` // 创建时间
UpdateAt time.Time `xorm:"updated"` // 更新时间
DeleteAt time.Time `xorm:"deleted"` // 删除时间
}
func (row *Config) ToProto(item *protos.ConfigItem) *protos.ConfigItem {
if item == nil {
item = &protos.ConfigItem{}
}
item.Id = row.Id
item.Name = row.Name
item.Value = row.Value
item.State = row.State
item.CreateAt = row.CreateAt.Format(time.DateTime)
item.UpdateAt = row.UpdateAt.Format(time.DateTime)
return item
}
dao 文件
src/jobspider/xorm/daos/config_dao.go
package daos
// Generated by niuhe.idl
import (
"github.com/ma-guo/niuhe"
"jobspider/xorm/models"
)
// 系统配置表
type _ConfigDao struct {
*Dao
}
func (dao *Dao) Config() *_ConfigDao {
return &_ConfigDao{Dao: dao}
}
func (dao *_ConfigDao) GetByIds(ids ...int64) ([]*models.Config, error) {
rows := []*models.Config{}
session := dao.db()
err := session.In("id", ids).Desc(`id`).Find(&rows)
if err != nil {
niuhe.LogInfo(`GetByIds Config error: %v`, err)
return nil, err
}
return rows, nil
}
func (dao *_ConfigDao) GetPage(page, size int, name string, value int64) ([]*models.Config, int64, error) {
rows := make([]*models.Config, 0)
session := dao.db()
dao.Like(session, `name`, name)
dao.Like(session, `value`, value)
dao.Limit(session, page, size)
total, err := session.Desc(`id`).FindAndCount(&rows)
if err != nil {
niuhe.LogInfo(`GetPage Config error: %v`, err)
return nil, 0, err
}
return rows, total, nil
}
service 文件
src/jobspider/xorm/services/config_svc.go
package services
// Generated by niuhe.idl
import (
"github.com/ma-guo/niuhe"
"jobspider/xorm/models"
)
// 系统配置表
type _ConfigSvc struct {
*_Svc
}
func (svc *_Svc) Config() *_ConfigSvc {
return &_ConfigSvc{svc}
}
// 获取单个数据
func (svc *_ConfigSvc) GetById(id int64) (*models.Config, bool, error) {
row := &models.Config{Id: id}
has, err := svc.dao().GetBy(row)
if err != nil {
niuhe.LogInfo(`GetById Config error: %v`, err)
}
return row, has, err
}
// 获取单个数据
func (svc *_ConfigSvc) GetBy(row *models.Config) (bool, error) {
has, err := svc.dao().GetBy(row)
if err != nil {
niuhe.LogInfo(`GetBy Config error: %v`, err)
}
return has, err
}
// 更新数据
func (svc *_ConfigSvc) Update(row *models.Config) (bool, error) {
has, err := svc.dao().Config().Update(row.Id, row)
if err != nil {
niuhe.LogInfo(`Update Config error: %v`, err)
}
return has, err
}
// 插入数据
func (svc *_ConfigSvc) Insert(row *models.Config) error {
err := svc.dao().Insert(row)
if err != nil {
niuhe.LogInfo(`Insert Config error: %v`, err)
}
return err
}
// 删除数据
func (svc *_ConfigSvc) Delete(row *models.Config) error {
err := svc.dao().Delete(row)
if err != nil {
niuhe.LogInfo(`Delete Config error: %v`, err)
}
return err
}
// 根据 id 获取 map 数据
func (svc *_ConfigSvc) GetByIds(ids ...int64) (map[int64]*models.Config, error) {
rows, err := svc.dao().Config().GetByIds(ids...)
if err != nil {
niuhe.LogInfo(`GetByIds Config error: %v`, err)
return nil, err
}
rowsMap := make(map[int64]*models.Config, 0)
for _, row := range rows {
rowsMap[row.Id] = row
}
return rowsMap, nil
}
// 分页获取数据
func (svc *_ConfigSvc) GetPage(page, size int, name string, value int64) ([]*models.Config, int64, error) {
rows, total, err := svc.dao().Config().GetPage(page, size, name, value)
if err != nil {
niuhe.LogInfo(`GetPage Config error: %v`, err)
}
return rows, total, nil
}
view 文件
src/jobspider/app/api/views/config_views.go 需要手动 include('api_config.niuhe')后才有。
后续支持插件生成方法实现代码和对应的前端代码。
package views
// Generated by niuhe.idl
import (
"jobspider/app/api/protos"
"jobspider/xorm/models"
"jobspider/xorm/services"
"github.com/ma-guo/niuhe"
)
type Config struct {
_Gen_Config
}
// 分页查询获取 Config 信息
func (v *Config) Page_GET(c *niuhe.Context, req *protos.ConfigPageReq, rsp *protos.ConfigPageRsp) error {
svc := services.NewSvc()
defer svc.Close()
rows, total, err := svc.Config().GetPage(req.Page, req.Size, req.Name, req.Value)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
rsp.Total = total
rsp.Items = make([]*protos.ConfigItem, len(rows))
for idx, row := range rows {
rsp.Items[idx] = row.ToProto(nil)
}
return nil
}
// 查询获取 Config 信息
func (v *Config) Form_GET(c *niuhe.Context, req *protos.ConfigFormReq, rsp *protos.ConfigItem) error {
svc := services.NewSvc()
defer svc.Close()
row, has, err := svc.Config().GetById(req.Id)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
if !has {
return niuhe.NewCommError(-1, "Not Found")
}
row.ToProto(rsp)
return nil
}
// 添加 Config 信息
func (v *Config) Add_POST(c *niuhe.Context, req *protos.ConfigItem, rsp *protos.ConfigItem) error {
svc := services.NewSvc()
defer svc.Close()
row := &models.Config{
Name: req.Name,
Value: req.Value,
State: req.State,
}
err := svc.Config().Insert(row)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
row.ToProto(rsp)
return nil
}
// 更新 Config 信息
func (v *Config) Update_POST(c *niuhe.Context, req *protos.ConfigItem, rsp *protos.ConfigItem) error {
svc := services.NewSvc()
defer svc.Close()
row, has, err := svc.Config().GetById(req.Id)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
if !has {
return niuhe.NewCommError(-1, "Not Found")
}
row.Name = req.Name
row.Value = req.Value
row.State = req.State
_, err = svc.Config().Update(row)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
row.ToProto(rsp)
return nil
}
// 删除 Config 信息
func (v *Config) Delete_DELETE(c *niuhe.Context, req *protos.ConfigFormReq, rsp *protos.ConfigNoneRsp) error {
svc := services.NewSvc()
defer svc.Close()
row, has, err := svc.Config().GetById(req.Id)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
if !has {
return niuhe.NewCommError(-1, "Not Found")
}
err = svc.Config().Delete(row)
if err != nil {
niuhe.LogInfo("%v", err)
return err
}
return nil
}
func init() {
GetModule().Register(&Config{})
}
gen_view 文件
src/jobspider/app/api/views/gen_config_views.go 需要手动 include('api_config.niuhe')后才有
package views
// Generated by niuhe.idl
import (
"jobspider/app/api/protos"
"github.com/ma-guo/niuhe"
)
type _Gen_Config struct{}
// 分页查询获取 Config 信息
func (v *_Gen_Config) Page_GET(c *niuhe.Context, req *protos.ConfigPageReq, rsp *protos.ConfigPageRsp) error {
return niuhe.NewCommError(-1, "Not Implemented")
}
// 查询获取 Config 信息
func (v *_Gen_Config) Form_GET(c *niuhe.Context, req *protos.ConfigFormReq, rsp *protos.ConfigItem) error {
return niuhe.NewCommError(-1, "Not Implemented")
}
// 添加 Config 信息
func (v *_Gen_Config) Add_POST(c *niuhe.Context, req *protos.ConfigItem, rsp *protos.ConfigItem) error {
return niuhe.NewCommError(-1, "Not Implemented")
}
// 更新 Config 信息
func (v *_Gen_Config) Update_POST(c *niuhe.Context, req *protos.ConfigItem, rsp *protos.ConfigItem) error {
return niuhe.NewCommError(-1, "Not Implemented")
}
// 删除 Config 信息
func (v *_Gen_Config) Delete_DELETE(c *niuhe.Context, req *protos.ConfigFormReq, rsp *protos.ConfigNoneRsp) error {
return niuhe.NewCommError(-1, "Not Implemented")
}
gen_protos 新增代码
src/jobspider/app/api/protos/gen_protos.go
// 系统配置表
type ConfigItem struct {
Id int64 `json:"id" zpf_name:"id"` // id
Name string `json:"name" zpf_name:"name" zpf_reqd:"true"` // 配置名称
Value int64 `json:"value" zpf_name:"value" zpf_reqd:"true"` // 配置值
State int `json:"state" zpf_name:"state" zpf_reqd:"true"` // 状态 取值范围及含义: 1 - 可用; 2 - 禁用;
CreateAt string `json:"create_at" zpf_name:"create_at"` // 创建时间
UpdateAt string `json:"update_at" zpf_name:"update_at"` // 更新时间
}
// 请求,Config,信息
type ConfigFormReq struct {
Id int64 `json:"id" zpf_name:"id" zpf_reqd:"true"`
}
// 分页查询,Config,信息
type ConfigPageReq struct {
Page int `json:"page" zpf_name:"page" zpf_reqd:"true"` // 页码
Size int `json:"size" zpf_name:"size" zpf_reqd:"true"` // 每页数量
Name string `json:"name" zpf_name:"name" zpf_reqd:"true"` // 配置名称
Value int64 `json:"value" zpf_name:"value" zpf_reqd:"true"` // 配置值
}
// 分页查询,Config,信息
type ConfigPageRsp struct {
Total int64 `json:"total" zpf_name:"total" zpf_reqd:"true"` // 总数
Items []*ConfigItem `json:"items" zpf_name:"items"` // Config信息
}
// Config,无数据返回
type ConfigNoneRsp struct {
}