补充页面图片接口

This commit is contained in:
2025-10-27 12:48:37 +08:00
parent cc944f6a19
commit c0dded3e43
11 changed files with 490 additions and 0 deletions

61
server/api/pages_imgs.api Normal file
View File

@@ -0,0 +1,61 @@
// 页面图片相关结构体
type PageImage {
Id int64 `json:"id"` // 图片ID
Page string `json:"page"` // 所属页面(对应路由的页面标识)
ImageUrl string `json:"image_url"` // 图片URL
Sort int `json:"sort"` // 排序首页1-3其他页面1
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 查询页面图片请求(按页面查询)
type GetPageImagesReq {
Page string `json:"page" form:"page" validate:"required"` // 页面标识如home、base-overview等
}
// 查询页面图片响应
type GetPageImagesResp {
Images []PageImage `json:"images"` // 图片列表首页返回3张其他页面返回1张
Msg string `json:"message"`
}
// 新增/更新页面图片请求
type SavePageImageReq {
Id int64 `json:"id,omitempty"` // 可选更新时传ID
Page string `json:"page" validate:"required"` // 页面标识
ImageUrl string `json:"image_url" validate:"required"` // 图片URL
Sort int `json:"sort" validate:"required"` // 排序首页1-3其他页面1
}
// 新增/更新页面图片响应
type SavePageImageResp {
Success bool `json:"success"`
Msg string `json:"message"`
Id int64 `json:"id,omitempty"` // 新增时返回ID
}
// 删除页面图片请求
type DeletePageImageReq {
Id int64 `json:"id" validate:"required"` // 图片ID
}
// 删除页面图片响应
type DeletePageImageResp {
Success bool `json:"success"`
Msg string `json:"message"`
}
@server (
group: pageImage
prefix: /api/page-image
)
service page_image_api {
// 1. 查询指定页面的图片(如首页轮播图、基地概况顶部图)
@handler GetPageImagesHandler
get /page-image/get (GetPageImagesReq) returns (GetPageImagesResp)
// 2. 更新页面图片支持上传后保存URL已存在则覆盖
@handler SavePageImageHandler
post /page-image/save (SavePageImageReq) returns (SavePageImageResp)
}

View File

@@ -0,0 +1,50 @@
// Code scaffolded by goctl. Safe to edit.
// goctl 1.9.2
package pageImage
import (
"fmt"
"net/http"
"github.com/JACKYMYPERSON/hldrCenter/config"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/logic/pageImage"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/model"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/types"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/rest/httpx"
)
func GetPageImagesHandler(cfg *config.Config) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.GetPageImagesReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
mysqlCfg := cfg.MySQL
dsn := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=Local",
mysqlCfg.Username,
mysqlCfg.Password,
mysqlCfg.Host,
mysqlCfg.Port,
mysqlCfg.Database,
mysqlCfg.Charset,
)
fmt.Println("接收到articlePost请求")
conn := sqlx.NewSqlConn("mysql", dsn)
imgModel := model.NewPageImageModel(conn)
l := pageImage.NewGetPageImagesLogic(r.Context(), cfg, imgModel)
resp, err := l.GetPageImages(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}

View File

@@ -0,0 +1,50 @@
// Code scaffolded by goctl. Safe to edit.
// goctl 1.9.2
package pageImage
import (
"fmt"
"net/http"
"github.com/JACKYMYPERSON/hldrCenter/config"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/logic/pageImage"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/model"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/types"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/rest/httpx"
)
func SavePageImageHandler(cfg *config.Config) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SavePageImageReq
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
}
mysqlCfg := cfg.MySQL
dsn := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=Local",
mysqlCfg.Username,
mysqlCfg.Password,
mysqlCfg.Host,
mysqlCfg.Port,
mysqlCfg.Database,
mysqlCfg.Charset,
)
fmt.Println("接收到articlePost请求")
conn := sqlx.NewSqlConn("mysql", dsn)
imgModel := model.NewPageImageModel(conn)
l := pageImage.NewSavePageImageLogic(r.Context(), cfg, imgModel)
resp, err := l.SavePageImage(&req)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
}
}

View File

@@ -0,0 +1,70 @@
// Code scaffolded by goctl. Safe to edit.
// goctl 1.9.2
package pageImage
import (
"context"
"fmt"
"sort"
"github.com/JACKYMYPERSON/hldrCenter/config"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/model"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type GetPageImagesLogic struct {
logx.Logger
ctx context.Context
cfg *config.Config
model model.PageImageModel
}
func NewGetPageImagesLogic(ctx context.Context, cfg *config.Config, model model.PageImageModel) *GetPageImagesLogic {
return &GetPageImagesLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
cfg: cfg,
model: model,
}
}
func (l *GetPageImagesLogic) GetPageImages(req *types.GetPageImagesReq) (resp *types.GetPageImagesResp, err error) {
images, err := l.model.FindByPage(l.ctx, req.Page)
if err != nil {
// 处理数据库查询错误(如记录不存在时返回空列表,不报错)
if err == model.ErrNotFound {
return &types.GetPageImagesResp{
Images: []types.PageImage{},
Msg: "该页面暂无图片",
}, nil
}
return nil, fmt.Errorf("查询图片失败:%v", err)
}
// 2. 转换模型数据到响应结构体
var respImages []types.PageImage
for _, img := range images {
respImages = append(respImages, types.PageImage{
Id: img.Id,
Page: img.Page,
ImageUrl: img.ImageUrl,
Sort: int(img.Sort),
CreateTime: img.CreateTime.Format("2006-01-02 15:04:05"), // 格式化时间
UpdateTime: img.UpdateTime.Format("2006-01-02 15:04:05"),
})
}
// 3. 按 sort 字段升序排序(确保首页轮播图顺序正确)
sort.Slice(respImages, func(i, j int) bool {
return respImages[i].Sort < respImages[j].Sort
})
// 4. 返回响应
return &types.GetPageImagesResp{
Images: respImages,
Msg: "查询成功",
}, nil
}

View File

@@ -0,0 +1,36 @@
// Code scaffolded by goctl. Safe to edit.
// goctl 1.9.2
package pageImage
import (
"context"
"github.com/JACKYMYPERSON/hldrCenter/config"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/model"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SavePageImageLogic struct {
logx.Logger
ctx context.Context
cfg *config.Config
model model.PageImageModel
}
func NewSavePageImageLogic(ctx context.Context, cfg *config.Config, model model.PageImageModel) *SavePageImageLogic {
return &SavePageImageLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
cfg: cfg,
model: model,
}
}
func (l *SavePageImageLogic) SavePageImage(req *types.SavePageImageReq) (resp *types.SavePageImageResp, err error) {
// todo: add your logic here and delete this line
return
}

View File

@@ -0,0 +1,29 @@
package model
import "github.com/zeromicro/go-zero/core/stores/sqlx"
var _ PageImageModel = (*customPageImageModel)(nil)
type (
// PageImageModel is an interface to be customized, add more methods here,
// and implement the added methods in customPageImageModel.
PageImageModel interface {
pageImageModel
withSession(session sqlx.Session) PageImageModel
}
customPageImageModel struct {
*defaultPageImageModel
}
)
// NewPageImageModel returns a model for the database table.
func NewPageImageModel(conn sqlx.SqlConn) PageImageModel {
return &customPageImageModel{
defaultPageImageModel: newPageImageModel(conn),
}
}
func (m *customPageImageModel) withSession(session sqlx.Session) PageImageModel {
return NewPageImageModel(sqlx.NewSqlConnFromSession(session))
}

View File

@@ -0,0 +1,121 @@
// Code generated by goctl. DO NOT EDIT.
// versions:
// goctl version: 1.9.2
package model
import (
"context"
"database/sql"
"fmt"
"strings"
"time"
"github.com/zeromicro/go-zero/core/stores/builder"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/core/stringx"
)
var (
pageImageFieldNames = builder.RawFieldNames(&PageImage{})
pageImageRows = strings.Join(pageImageFieldNames, ",")
pageImageRowsExpectAutoSet = strings.Join(stringx.Remove(pageImageFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
pageImageRowsWithPlaceHolder = strings.Join(stringx.Remove(pageImageFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
)
type (
pageImageModel interface {
Insert(ctx context.Context, data *PageImage) (sql.Result, error)
FindOne(ctx context.Context, id int64) (*PageImage, error)
FindOneByPageSort(ctx context.Context, page string, sort int64) (*PageImage, error)
Update(ctx context.Context, data *PageImage) error
Delete(ctx context.Context, id int64) error
FindByPage(ctx context.Context, page string) ([]*PageImage, error)
}
defaultPageImageModel struct {
conn sqlx.SqlConn
table string
}
PageImage struct {
Id int64 `db:"id"` // 图片ID主键
Page string `db:"page"` // 所属页面home-首页base-overview-基地概况等)
ImageUrl string `db:"image_url"` // 图片URL
Sort int64 `db:"sort"` // 排序首页1-3其他页面1
CreateTime time.Time `db:"create_time"` // 创建时间
UpdateTime time.Time `db:"update_time"` // 更新时间
}
)
func newPageImageModel(conn sqlx.SqlConn) *defaultPageImageModel {
return &defaultPageImageModel{
conn: conn,
table: "`page_image`",
}
}
func (m *defaultPageImageModel) Delete(ctx context.Context, id int64) error {
query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
_, err := m.conn.ExecCtx(ctx, query, id)
return err
}
func (m *defaultPageImageModel) FindOne(ctx context.Context, id int64) (*PageImage, error) {
query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", pageImageRows, m.table)
var resp PageImage
err := m.conn.QueryRowCtx(ctx, &resp, query, id)
switch err {
case nil:
return &resp, nil
case sqlx.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultPageImageModel) FindOneByPageSort(ctx context.Context, page string, sort int64) (*PageImage, error) {
var resp PageImage
query := fmt.Sprintf("select %s from %s where `page` = ? and `sort` = ? limit 1", pageImageRows, m.table)
err := m.conn.QueryRowCtx(ctx, &resp, query, page, sort)
switch err {
case nil:
return &resp, nil
case sqlx.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultPageImageModel) Insert(ctx context.Context, data *PageImage) (sql.Result, error) {
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?)", m.table, pageImageRowsExpectAutoSet)
ret, err := m.conn.ExecCtx(ctx, query, data.Page, data.ImageUrl, data.Sort)
return ret, err
}
func (m *defaultPageImageModel) Update(ctx context.Context, newData *PageImage) error {
query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, pageImageRowsWithPlaceHolder)
_, err := m.conn.ExecCtx(ctx, query, newData.Page, newData.ImageUrl, newData.Sort, newData.Id)
return err
}
func (m *defaultPageImageModel) tableName() string {
return m.table
}
func (m *defaultPageImageModel) FindByPage(ctx context.Context, page string) ([]*PageImage, error) {
// pageImageRows 是 goctl 生成的字段列表常量(如 "id,page,image_url,sort,create_time,update_time"
query := fmt.Sprintf("select %s from %s USE INDEX (idx_page) where page = ?", pageImageRows, m.table)
var images []*PageImage
err := m.conn.QueryRowsCtx(ctx, &images, query, page)
if err != nil {
if err == sql.ErrNoRows {
return []*PageImage{}, nil // 返回空切片,避免上层处理 ErrNotFound 导致的错误
}
return nil, fmt.Errorf("查询失败:%v", err)
}
return images, nil
}

View File

@@ -0,0 +1,5 @@
package model
import "github.com/zeromicro/go-zero/core/stores/sqlx"
var ErrNotFound = sqlx.ErrNotFound

View File

@@ -0,0 +1,44 @@
// Code generated by goctl. DO NOT EDIT.
// goctl 1.9.2
package types
type DeletePageImageReq struct {
Id int64 `json:"id" validate:"required"` // 图片ID
}
type DeletePageImageResp struct {
Success bool `json:"success"`
Msg string `json:"message"`
}
type GetPageImagesReq struct {
Page string `json:"page" validate:"required"` // 页面标识如home、base-overview等
}
type GetPageImagesResp struct {
Images []PageImage `json:"images"` // 图片列表首页返回3张其他页面返回1张
Msg string `json:"message"`
}
type PageImage struct {
Id int64 `json:"id"` // 图片ID
Page string `json:"page"` // 所属页面(对应路由的页面标识)
ImageUrl string `json:"image_url"` // 图片URL
Sort int `json:"sort"` // 排序首页1-3其他页面1
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type SavePageImageReq struct {
Id int64 `json:"id,omitempty"` // 可选更新时传ID
Page string `json:"page" validate:"required"` // 页面标识
ImageUrl string `json:"image_url" validate:"required"` // 图片URL
Sort int `json:"sort" validate:"required"` // 排序首页1-3其他页面1
}
type SavePageImageResp struct {
Success bool `json:"success"`
Msg string `json:"message"`
Id int64 `json:"id,omitempty"` // 新增时返回ID
}

View File

@@ -5,6 +5,7 @@ import (
"github.com/JACKYMYPERSON/hldrCenter/internal/article/handler/article"
"github.com/JACKYMYPERSON/hldrCenter/internal/baseoverview/handler/baseOverview"
"github.com/JACKYMYPERSON/hldrCenter/internal/devproject/handler/devproject"
"github.com/JACKYMYPERSON/hldrCenter/internal/pageimgs/handler/pageImage"
ping "github.com/JACKYMYPERSON/hldrCenter/internal/ping/handler/ping"
uploadimg "github.com/JACKYMYPERSON/hldrCenter/internal/upload/handler/upload"
"github.com/JACKYMYPERSON/hldrCenter/middleware"
@@ -59,6 +60,14 @@ func SetupRouter(cfg *config.Config) *gin.Engine {
// 查询项目详情GET /api/devproject/get
devprojects.GET("/get", gin.WrapH(devproject.GetDevProjectHandler(cfg)))
}
pageImages := api.Group("/page-image")
{
// 查询指定页面图片GET /api/page-image/get?page=home
pageImages.POST("/get", gin.WrapH(pageImage.GetPageImagesHandler(cfg)))
// 新增/更新页面图片POST /api/page-image/save
pageImages.POST("/save", gin.WrapH(pageImage.SavePageImageHandler(cfg)))
}
}
return r

15
server/sql/page_imgs.sql Normal file
View File

@@ -0,0 +1,15 @@
CREATE TABLE page_image (
id INT NOT NULL AUTO_INCREMENT COMMENT '图片ID主键',
page VARCHAR(50) NOT NULL DEFAULT '' COMMENT '所属页面home-首页base-overview-基地概况等)',
image_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '图片URL',
sort INT NOT NULL DEFAULT 0 COMMENT '排序首页1-3其他页面1',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 单独一行显式声明主键,确保 goctl 识别
PRIMARY KEY (id),
-- 唯一约束也单独声明
UNIQUE KEY uk_page_sort (page, sort) COMMENT '控制同一页面+排序唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '页面图片表';
-- 索引单独创建
CREATE INDEX idx_page ON page_image (page) COMMENT '按页面查询';