网站建设中页面模板下载,公司名称变更说明函,jsp网站开发视频,怎么看别人网站在哪里做的外链使用Gin-Vue- Admin框架手动实现crud
在gva框架下自己手动实现一个CRUD的操作#xff0c;该操作将会结合gen进行探讨学习#xff0c;具体实现可以看下面代码的实现#xff0c;项目目录层级分为api层#xff0c;service层#xff0c;model层#xff0c;common层#xff…使用Gin-Vue- Admin框架手动实现crud
在gva框架下自己手动实现一个CRUD的操作该操作将会结合gen进行探讨学习具体实现可以看下面代码的实现项目目录层级分为api层service层model层common层router层gen层。 我的这个实现方式有些许不太一样就是我的修改并非传统的restful风格通过json方式进行传递这个id也确保安全所以这里的请求我不会用Get请求。
创建一个Banner
在gva下的server文件夹中找到plugin文件然后在这里创建一个banner文件夹我们的手动CRUD实现的代码就放置在这里查看项目目录结构banner包的路径是/server/plugin/banner。
model层
在model层中我们分为前端请求的参数request以及后端返回的只response。在我们的model下会有一个创建表的结构体也就是对应数据库字段的一个struct
banner的结构体
package modelimport github.com/flipped-aurora/gin-vue-admin/server/globaltype Banner struct {global.GVA_MODELUrl string json:url gorm:column:url;comment:图片地址Path string json:path gorm:column:path;comment:轮播图跳转地址Description string json:description gorm:column:description;comment:轮播介绍
}
model.request层
用于接收前端的参数
package requestimport (github.com/flipped-aurora/gin-vue-admin/server/plugin/banner/commongithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/modelgithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/model/daogorm.io/gen
)type BannerList struct {common.PageInfoUrl string json:url gorm:column:url;comment:图片地址Path string json:path gorm:column:path;comment:轮播图跳转地址Description string json:description gorm:column:description;comment:轮播介绍
}func (r BannerList) BannerList() model.Banner {return model.Banner{Url: r.Url,Path: r.Path,Description: r.Description,}
}type BannerCreate struct {Url string json:url gorm:column:url;comment:图片地址Path string json:path gorm:column:path;comment:轮播图跳转地址Description string json:description gorm:column:description;comment:轮播介绍
}func (r BannerCreate) BannerCreate() model.Banner {return model.Banner{Url: r.Url,Path: r.Path,Description: r.Description,}
}type BannerUpdate struct {common.GetByIdUrl string json:url gorm:column:url;comment:图片地址Path string json:path gorm:column:path;comment:轮播图跳转地址Description string json:description gorm:column:description;comment:轮播介绍
}func (r BannerUpdate) BannerUpdate() model.Banner {return model.Banner{Url: r.Url,Path: r.Path,Description: r.Description,}
}func (r *BannerList) Search() common.GenScopes {return func(tx gen.Dao) gen.Dao {if r.Url ! {tx tx.Where(dao.Banner.Url.Eq(r.Url))}if r.Path ! {tx tx.Where(dao.Banner.Path.Eq(r.Path))}if r.Description ! {tx tx.Where(dao.Banner.Description.Eq(r.Description))}return tx}
}model.response
返回给前端的一个模型
package responsetype Banner struct {Url string json:url gorm:column:url;comment:图片地址Path string json:path gorm:column:path;comment:轮播图跳转地址Description string json:description gorm:column:description;comment:轮播介绍
}gen层
可以查看gorm的gen的使用文档地址https://gorm.io/gen/ 具体详细的看gorm的文档地址关于gen的相关使用可以看目录结构我的文件存放地 gen是基于gorm封装的在我们最后的banner/main.go中需要装配一下传入db,判断有没有db没有db的调用需要传入db。 $ go get -u gorm.io/gen package mainimport (github.com/flipped-aurora/gin-vue-admin/server/plugin/banner/modelospath/filepathgorm.io/gen
)// generate code
func main() {// 获取当前文件夹路径pwd, _ : os.Getwd()g : gen.NewGenerator(gen.Config{// 文件输出的位置根据自己的情况而定OutPath: filepath.Join(pwd, plugin, banner, model, dao),// 输出的文件名OutFile: query.go,// 输出模式Mode: gen.WithDefaultQuery | gen.WithQueryInterface,FieldCoverable: true,WithUnitTest: false,})// 挂在自己的结构体在这里根据自己的业务而定g.ApplyBasic(new(model.Banner),)g.Execute()
}common层
common层一般是放置一些公共资源需要使用的比如一些返回信息雪花算法生成id等。
common.common.go
package commonimport (gorm.io/gen
)type GetById struct {ID uint json:id form:id
}type GetByIds struct {IDs []uint json:ids form:ids
}// PageInfo 分页字段
type PageInfo struct {Page int json:page form:page // 页码PageSize int json:pageSize form:pageSize // 每页大小Keyword string json:keyword form:keyword //关键字
}// 分页函数
func (c *PageInfo) Paginate() func(tx gen.Dao) gen.Dao {return func(tx gen.Dao) gen.Dao {switch {case c.PageSize 100:c.PageSize 100case c.PageSize 0:c.PageSize 10}offset : (c.Page - 1) * c.PageSizereturn tx.Offset(offset).Limit(c.PageSize)}
}type GenScopes func(tx gen.Dao) gen.Dao// 前端传什么返回什么
type PageResult struct {PageInfoList interface{} json:list swaggertype:string example:interface 数据Count int64 json:count swaggertype:string example:int64 总数
}// list 返回函数
func NewPageResult(list interface{}, count int64, pageInfo PageInfo) PageResult {if list nil {return PageResult{PageInfo: PageInfo{Page: pageInfo.Page,PageSize: pageInfo.PageSize,},List: []struct{}{},Count: count,}}return PageResult{PageInfo: PageInfo{Page: pageInfo.Page,PageSize: pageInfo.PageSize,},List: list,Count: count,}
}common.message.go
存放返回信息还可以自定义一些返回状态码
package commonconst (SuccessCreate 创建成功ErrorCreate 创建失败SuccessUpdate 更新成功ErrorUpdate 更新失败SuccessDelete 删除成功ErrorDelete 删除失败SuccessDeletes 批量删除成功ErrorDeletes 批量删除失败SuccessFirst 查询一条成功ErrorFirst 查询一条失败SuccessList 查询成功ErrorList 查询失败ErrorCount 查询条数失败ErrorRequest 参数有误SuccessServer 服务端返回成功ErrorServer 服务端返回失败
)service层
这里我一般是用于业务处理。
service.banner.go
package serviceimport (contextgithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/commongithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/modelgithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/model/daogithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/model/requestgithub.com/pkg/errors
)var Banner new(banner)type banner struct{}// List 查询多条
func (b *banner) List(ctx context.Context, info request.BannerList) (entity []*model.Banner, count int64, err error) {query : dao.Q.WithContext(ctx).Bannerquery query.Scopes(info.Search())count, err query.Count()if err ! nil {return nil, 0, errors.Wrap(err, common.ErrorList)}entity, err query.Scopes(info.Paginate()).Find()if err ! nil {return nil, 0, errors.Wrap(err, common.ErrorCount)}return entity, count, nil
}// First 查询单条
func (b *banner) First(ctx context.Context, info common.GetById) (entity *model.Banner, err error) {query : dao.Q.WithContext(ctx).Bannerentity, err query.Where(dao.Banner.ID.Eq(info.ID)).First()if err ! nil {return nil, errors.Wrap(err, common.ErrorFirst)}return entity, nil
}// Create 新增
func (b *banner) Create(ctx context.Context, info request.BannerCreate) error {create : info.BannerCreate()query : dao.Q.WithContext(ctx).Bannererr : query.Create(create)if err ! nil {return errors.Wrap(err, common.ErrorCreate)}return nil
}// Update 修改
func (b *banner) Update(ctx context.Context, info request.BannerUpdate) error {update : info.BannerUpdate()query : dao.Q.WithContext(ctx).Banner_, err : query.Where(dao.Banner.ID.Eq(info.ID)).Updates(update)if err ! nil {return errors.Wrap(err, common.ErrorUpdate)}return nil
}// Delete 单个删除
func (b banner) Delete(ctx context.Context, info common.GetById) error {query : dao.Q.WithContext(ctx).Banner_, err : query.Where(dao.Banner.ID.Eq(info.ID)).Delete()if err ! nil {return errors.Wrap(err, common.ErrorDelete)}return nil
}// Deletes 批量删除
func (b *banner) Deletes(ctx context.Context, info common.GetByIds) error {query : dao.Q.WithContext(ctx).Banner_, err : query.Where(dao.Banner.ID.In(info.IDs...)).Delete()if err ! nil {return errors.Wrap(err, common.ErrorDeletes)}return nil
}api层
这里我一般是处理接受前端的请求
api.banner.go
这里与service.banner.go的接口一一对应
package apiimport (github.com/flipped-aurora/gin-vue-admin/server/plugin/banner/commongithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/model/requestgithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/responsegithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/servicegithub.com/gin-gonic/ginnet/http
)var Banner new(banner)type banner struct{}func (b banner) List(c *gin.Context) response.Response {var list request.BannerListerr : c.ShouldBindJSON(list)if err ! nil {return response.Response{Code: http.StatusPaymentRequired, Message: common.ErrorRequest}}lists, count, err : service.Banner.List(c.Request.Context(), list)if err ! nil {return response.Response{Code: http.StatusInternalServerError, Message: common.ErrorServer}}return response.Response{Code: http.StatusOK,Data: common.NewPageResult(lists, count, list.PageInfo),Message: common.SuccessList,}
}func (b *banner) First(c *gin.Context) response.Response {var info common.GetByIderr : c.ShouldBindJSON(info)if err ! nil {return response.Response{Code: http.StatusPaymentRequired, Message: common.ErrorRequest}}data, err : service.Banner.First(c.Request.Context(), info)if err ! nil {return response.Response{Code: http.StatusInternalServerError, Message: common.ErrorServer}}return response.Response{Code: http.StatusOK,Data: data,Message: common.SuccessFirst,}
}func (b *banner) Create(c *gin.Context) response.Response {var create request.BannerCreateerr : c.ShouldBindJSON(create)if err ! nil {return response.Response{Code: http.StatusPaymentRequired, Message: common.ErrorRequest}}err service.Banner.Create(c.Request.Context(), create)if err ! nil {return response.Response{Code: http.StatusInternalServerError, Message: common.ErrorCreate}}return response.Response{Code: http.StatusOK, Message: common.SuccessCreate}
}func (b *banner) Update(c *gin.Context) response.Response {var update request.BannerUpdateerr : c.ShouldBindJSON(update)if err ! nil {return response.Response{Code: http.StatusPaymentRequired, Message: common.ErrorRequest}}err service.Banner.Update(c.Request.Context(), update)if err ! nil {return response.Response{Code: http.StatusInternalServerError, Message: common.ErrorUpdate}}return response.Response{Code: http.StatusOK, Message: common.SuccessUpdate}
}func (b *banner) Delete(c *gin.Context) response.Response {var info common.GetByIderr : c.ShouldBindJSON(info)if err ! nil {return response.Response{Code: http.StatusPaymentRequired, Message: common.ErrorRequest}}err service.Banner.Delete(c.Request.Context(), info)if err ! nil {return response.Response{Code: http.StatusInternalServerError, Message: common.ErrorDelete}}return response.Response{Code: http.StatusOK, Message: common.SuccessDelete}
}func (b *banner) Deletes(c *gin.Context) response.Response {var info common.GetByIdserr : c.ShouldBindJSON(info)if err ! nil {return response.Response{Code: http.StatusPaymentRequired, Message: common.ErrorRequest}}err service.Banner.Deletes(c.Request.Context(), info)if err ! nil {return response.Response{Code: http.StatusInternalServerError, Message: common.ErrorDeletes}}return response.Response{Code: http.StatusOK, Message: common.SuccessDeletes}
}router层
这里是路由注册的地方
router.router.go
package routerimport (github.com/flipped-aurora/gin-vue-admin/server/middlewaregithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/apigithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/responsegithub.com/gin-gonic/gin
)type Banner struct {router *gin.RouterGroup
}func NewBanner(router *gin.RouterGroup) *Banner {return Banner{router}
}func (r Banner) Init() {group : r.router.Group(banner){ // 不带日志中间件group.POST(list, response.Handler()(api.Banner.List))group.POST(first, response.Handler()(api.Banner.First))}{ // 带日志中间件group.Use(middleware.OperationRecord())group.POST(create, response.Handler()(api.Banner.Create))group.PUT(update, response.Handler()(api.Banner.Update))group.DELETE(delete, response.Handler()(api.Banner.Delete))group.DELETE(deletes, response.Handler()(api.Banner.Deletes))}
}banner/main.go
package bannerimport (github.com/flipped-aurora/gin-vue-admin/server/globalgithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/model/daogithub.com/flipped-aurora/gin-vue-admin/server/plugin/banner/routergithub.com/gin-gonic/gin
)var Plugin new(plugin)type plugin struct{}func (p plugin) Register(group *gin.RouterGroup) {router.NewBanner(group).Init()// 这里需要自动装配一下调用dbif global.GVA_DB ! nil {dao.SetDefault(global.GVA_DB)}
}func (p plugin) RouterPath() string {return
}