当前位置: 首页 > article >正文

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/createPOST创建广告
/api/webad/deletePOST删除广告
/api/webad/updatePOST更新广告
/api/webad/get-listGET获取广告列表
/api/webad/get-by-idGET获取广告详情

至此,一个完整的广告管理模块就开发完成了。该模块实现了基本的CRUD功能,包括创建、删除、更新、列表查询和详情查询等功能。


http://www.kler.cn/a/378378.html

相关文章:

  • MyBatis一文入门精通,面试题(含答案)
  • 【系统架构设计师(第2版)】目录
  • Rust 力扣 - 2461. 长度为 K 子数组中的最大和
  • 面试题:JVM(二)
  • 「C/C++」C++设计模式 之 抽象工厂模式(Abstract Factory)
  • C++和OpenGL实现3D游戏编程【连载17】——着色器进阶
  • 【嵌入式】基础入门步骤
  • Leetcode - 周赛421
  • ChatGPT 越狱:研究人员使用十六进制编码和表情符号绕过 AI 保护措施
  • 双目视觉标定——1原理与实践
  • 软件测试--BUG篇
  • 基于Retinex算法的图像去雾matlab仿真
  • WPF 实现冒泡排序可视化
  • Pr 视频效果:ASC CDL
  • 基于物联网的户外环境检测装置教学文章
  • Qt中的Model与View 4:QStandardItemModel与QTableView
  • 【FL0013】基于SpringBoot和微信小程序的机电公司管理信息系统
  • 人工智能如何改变未来生活:从医疗到日常的全面升级
  • 项目学习总结
  • js中多let与var
  • 如何使用 EXPLAIN 分析查询计划?
  • 例行性工作
  • [LeetCode] 1137. 第N个泰波那契数
  • 串口屏控制的自动滑轨(未完工)
  • 【论文解读】EdgeYOLO:一种边缘实时目标检测器(附论文地址)
  • Django响应