补充页面图片接口
This commit is contained in:
61
server/api/pages_imgs.api
Normal file
61
server/api/pages_imgs.api
Normal 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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
29
server/internal/pageimgs/internal/model/pageimagemodel.go
Normal file
29
server/internal/pageimgs/internal/model/pageimagemodel.go
Normal 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))
|
||||
}
|
||||
121
server/internal/pageimgs/internal/model/pageimagemodel_gen.go
Normal file
121
server/internal/pageimgs/internal/model/pageimagemodel_gen.go
Normal 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
|
||||
}
|
||||
5
server/internal/pageimgs/internal/model/vars.go
Normal file
5
server/internal/pageimgs/internal/model/vars.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package model
|
||||
|
||||
import "github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||
|
||||
var ErrNotFound = sqlx.ErrNotFound
|
||||
44
server/internal/pageimgs/internal/types/types.go
Normal file
44
server/internal/pageimgs/internal/types/types.go
Normal 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
|
||||
}
|
||||
@@ -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
15
server/sql/page_imgs.sql
Normal 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 '按页面查询';
|
||||
Reference in New Issue
Block a user