Vscode niuhe 插件使用教程(7) - xorm 代码生成

244 阅读6分钟

官方教程已经上线, 请访问: 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 (需要手动 includeall.niuhe 中)
  • src/jobspider/xorm/models/config.go
  • src/jobspider/xorm/daos/config_dao.go
  • src/jobspider/xorm/services/config_svc.go
  • src/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 {
}