From c0dded3e43bb148d2f7043802bfb8980feae0ec2 Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Mon, 27 Oct 2025 12:48:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=A1=B5=E9=9D=A2=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/pages_imgs.api | 61 +++++++++ .../handler/pageImage/getpageimageshandler.go | 50 ++++++++ .../handler/pageImage/savepageimagehandler.go | 50 ++++++++ .../logic/pageImage/getpageimageslogic.go | 70 ++++++++++ .../logic/pageImage/savepageimagelogic.go | 36 ++++++ .../pageimgs/internal/model/pageimagemodel.go | 29 +++++ .../internal/model/pageimagemodel_gen.go | 121 ++++++++++++++++++ .../internal/pageimgs/internal/model/vars.go | 5 + .../internal/pageimgs/internal/types/types.go | 44 +++++++ server/router/router.go | 9 ++ server/sql/page_imgs.sql | 15 +++ 11 files changed, 490 insertions(+) create mode 100644 server/api/pages_imgs.api create mode 100644 server/internal/pageimgs/handler/pageImage/getpageimageshandler.go create mode 100644 server/internal/pageimgs/handler/pageImage/savepageimagehandler.go create mode 100644 server/internal/pageimgs/internal/logic/pageImage/getpageimageslogic.go create mode 100644 server/internal/pageimgs/internal/logic/pageImage/savepageimagelogic.go create mode 100644 server/internal/pageimgs/internal/model/pageimagemodel.go create mode 100644 server/internal/pageimgs/internal/model/pageimagemodel_gen.go create mode 100644 server/internal/pageimgs/internal/model/vars.go create mode 100644 server/internal/pageimgs/internal/types/types.go create mode 100644 server/sql/page_imgs.sql diff --git a/server/api/pages_imgs.api b/server/api/pages_imgs.api new file mode 100644 index 00000000..b33deae8 --- /dev/null +++ b/server/api/pages_imgs.api @@ -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) +} + diff --git a/server/internal/pageimgs/handler/pageImage/getpageimageshandler.go b/server/internal/pageimgs/handler/pageImage/getpageimageshandler.go new file mode 100644 index 00000000..42dc33ed --- /dev/null +++ b/server/internal/pageimgs/handler/pageImage/getpageimageshandler.go @@ -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) + } + } +} diff --git a/server/internal/pageimgs/handler/pageImage/savepageimagehandler.go b/server/internal/pageimgs/handler/pageImage/savepageimagehandler.go new file mode 100644 index 00000000..ec990174 --- /dev/null +++ b/server/internal/pageimgs/handler/pageImage/savepageimagehandler.go @@ -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) + } + } +} diff --git a/server/internal/pageimgs/internal/logic/pageImage/getpageimageslogic.go b/server/internal/pageimgs/internal/logic/pageImage/getpageimageslogic.go new file mode 100644 index 00000000..bf52e0bb --- /dev/null +++ b/server/internal/pageimgs/internal/logic/pageImage/getpageimageslogic.go @@ -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 +} diff --git a/server/internal/pageimgs/internal/logic/pageImage/savepageimagelogic.go b/server/internal/pageimgs/internal/logic/pageImage/savepageimagelogic.go new file mode 100644 index 00000000..5c65769a --- /dev/null +++ b/server/internal/pageimgs/internal/logic/pageImage/savepageimagelogic.go @@ -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 +} diff --git a/server/internal/pageimgs/internal/model/pageimagemodel.go b/server/internal/pageimgs/internal/model/pageimagemodel.go new file mode 100644 index 00000000..2c07c9c5 --- /dev/null +++ b/server/internal/pageimgs/internal/model/pageimagemodel.go @@ -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)) +} diff --git a/server/internal/pageimgs/internal/model/pageimagemodel_gen.go b/server/internal/pageimgs/internal/model/pageimagemodel_gen.go new file mode 100644 index 00000000..65a61f30 --- /dev/null +++ b/server/internal/pageimgs/internal/model/pageimagemodel_gen.go @@ -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 +} diff --git a/server/internal/pageimgs/internal/model/vars.go b/server/internal/pageimgs/internal/model/vars.go new file mode 100644 index 00000000..69ca814e --- /dev/null +++ b/server/internal/pageimgs/internal/model/vars.go @@ -0,0 +1,5 @@ +package model + +import "github.com/zeromicro/go-zero/core/stores/sqlx" + +var ErrNotFound = sqlx.ErrNotFound diff --git a/server/internal/pageimgs/internal/types/types.go b/server/internal/pageimgs/internal/types/types.go new file mode 100644 index 00000000..307d68da --- /dev/null +++ b/server/internal/pageimgs/internal/types/types.go @@ -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 +} diff --git a/server/router/router.go b/server/router/router.go index 95bef67c..8b62a0a4 100644 --- a/server/router/router.go +++ b/server/router/router.go @@ -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 diff --git a/server/sql/page_imgs.sql b/server/sql/page_imgs.sql new file mode 100644 index 00000000..8ca4bea4 --- /dev/null +++ b/server/sql/page_imgs.sql @@ -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 '按页面查询'; \ No newline at end of file