goframe开发一个企业网站 logic 开发 再生成service8
GoFrame Web广告模块开发教程
1. API接口定义
首先在 api/front/webad.go
中定义请求和响应结构:
package front
type WebAdReq struct {
Id uint `json:"id"`
Title string `json:"title"` // 广告标题
Image string `json:"image"` // 广告图片
Url string `json:"url"` // 广告链接
Sort int `json:"sort"` // 排序
Status int `json:"status"` // 状态:0=禁用,1=启用
Position int `json:"position"` // 位置:1=首页轮播
Page int `json:"page"` // 当前页码
Size int `json:"size"` // 每页数量
}
type WebAdRes struct {
Id uint `json:"id"`
Title string `json:"title"` // 广告标题
Image string `json:"image"` // 广告图片
Url string `json:"url"` // 广告链接
Sort int `json:"sort"` // 排序
Status int `json:"status"` // 状态
Position int `json:"position"` // 位置
CreatedAt string `json:"created_at"`
}
type WebAdListRes struct {
Total int64 `json:"total"` // 总数
List []WebAdRes `json:"list"` // 列表
}
2. 业务逻辑实现
在 internal/logic/webad/webad.go
中实现业务逻辑:
package webad
import (
"context"
"web/api/front"
"web/internal/service"
"github.com/gogf/gf/v2/frame/g"
)
type sWebAd struct{}
func New() *sWebAd {
return &sWebAd{}
}
func init() {
service.RegisterWebAd(New())
}
// Create 创建广告
func (s *sWebAd) Create(ctx context.Context, in *front.WebAdReq) (err error) {
_, err = g.Model("web_ad").Data(in).Insert()
return
}
// Delete 删除广告
func (s *sWebAd) Delete(ctx context.Context, id uint) error {
_, err := g.Model("web_ad").Where("id", id).Delete()
return err
}
// Update 更新广告
func (s *sWebAd) Update(ctx context.Context, in *front.WebAdReq) error {
_, err := g.Model("web_ad").Data(in).Where("id", in.Id).Update()
return err
}
// GetList 获取广告列表
func (s *sWebAd) GetList(ctx context.Context, in *front.WebAdReq) (out *front.WebAdListRes, err error) {
out = &front.WebAdListRes{}
m := g.Model("web_ad")
// 条件查询
if in.Title != "" {
m = m.WhereLike("title", "%"+in.Title+"%")
}
if in.Status > 0 {
m = m.Where("status", in.Status)
}
if in.Position > 0 {
m = m.Where("position", in.Position)
}
// 获取总数
out.Total, err = m.Count()
if err != nil {
return out, err
}
// 分页查询
err = m.Page(in.Page, in.Size).
OrderDesc("sort").
OrderDesc("id").
Scan(&out.List)
return
}
// GetById 根据ID获取广告信息
func (s *sWebAd) GetById(ctx context.Context, id uint) (out *front.WebAdRes, err error) {
out = &front.WebAdRes{}
err = g.Model("web_ad").Where("id", id).Scan(out)
return
}
3. 生成Service接口
运行命令生成service接口:
gf gen service
这将在 internal/service/webad.go
中生成接口定义:
package service
import (
"context"
"web/api/front"
)
type IWebAd interface {
Create(ctx context.Context, in *front.WebAdReq) (err error)
Delete(ctx context.Context, id uint) error
Update(ctx context.Context, in *front.WebAdReq) error
GetList(ctx context.Context, in *front.WebAdReq) (out *front.WebAdListRes, err error)
GetById(ctx context.Context, id uint) (out *front.WebAdRes, err error)
}
var localWebAd IWebAd
func WebAd() IWebAd {
if localWebAd == nil {
panic("implement not found for interface IWebAd, forgot register?")
}
return localWebAd
}
func RegisterWebAd(i IWebAd) {
localWebAd = i
}
4. 控制器实现
在 internal/controller/webad/webad.go
中编写控制器:
package webad
import (
"context"
"web/api/front"
"web/internal/service"
)
type Controller struct{}
func New() *Controller {
return &Controller{}
}
// Create 创建广告
func (c *Controller) Create(ctx context.Context, req *front.WebAdReq) (res *front.WebAdRes, err error) {
err = service.WebAd().Create(ctx, req)
return
}
// Delete 删除广告
func (c *Controller) Delete(ctx context.Context, req *front.WebAdReq) (res *front.WebAdRes, err error) {
err = service.WebAd().Delete(ctx, req.Id)
return
}
// Update 更新广告
func (c *Controller) Update(ctx context.Context, req *front.WebAdReq) (res *front.WebAdRes, err error) {
err = service.WebAd().Update(ctx, req)
return
}
// GetList 获取广告列表
func (c *Controller) GetList(ctx context.Context, req *front.WebAdReq) (res *front.WebAdListRes, err error) {
return service.WebAd().GetList(ctx, req)
}
// GetById 获取广告详情
func (c *Controller) GetById(ctx context.Context, req *front.WebAdReq) (res *front.WebAdRes, err error) {
return service.WebAd().GetById(ctx, req.Id)
}
5. 路由注册
在 internal/cmd/apiserver/router.go
中注册路由:
package apiserver
import (
"github.com/gogf/gf/v2/net/ghttp"
"web/internal/controller/webad"
)
func BindRouter(s *ghttp.Server) {
// 广告管理
s.Group("/api/webad", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse)
controller := webad.New()
group.Bind(
controller.Create,
controller.Delete,
controller.Update,
controller.GetList,
controller.GetById,
)
})
}
6. 数据库表结构
创建 web_ad
表:
CREATE TABLE `web_ad` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL COMMENT '广告标题',
`image` varchar(255) NOT NULL COMMENT '广告图片',
`url` varchar(255) NOT NULL COMMENT '广告链接',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0=禁用,1=启用',
`position` tinyint NOT NULL COMMENT '位置:1=首页轮播',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='广告表';
7. API接口说明
模块提供以下接口:
接口路径 | 请求方式 | 说明 |
---|---|---|
/api/webad/create | POST | 创建广告 |
/api/webad/delete | POST | 删除广告 |
/api/webad/update | POST | 更新广告 |
/api/webad/get-list | GET | 获取广告列表 |
/api/webad/get-by-id | GET | 获取广告详情 |
至此,一个完整的广告管理模块就开发完成了。该模块实现了基本的CRUD功能,包括创建、删除、更新、列表查询和详情查询等功能。