更新结构
This commit is contained in:
29
server/internal/articlemodel/articlemodel.go
Normal file
29
server/internal/articlemodel/articlemodel.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package articlemodel
|
||||
|
||||
import "github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||
|
||||
var _ ArticleModel = (*customArticleModel)(nil)
|
||||
|
||||
type (
|
||||
// ArticleModel is an interface to be customized, add more methods here,
|
||||
// and implement the added methods in customArticleModel.
|
||||
ArticleModel interface {
|
||||
articleModel
|
||||
withSession(session sqlx.Session) ArticleModel
|
||||
}
|
||||
|
||||
customArticleModel struct {
|
||||
*defaultArticleModel
|
||||
}
|
||||
)
|
||||
|
||||
// NewArticleModel returns a model for the database table.
|
||||
func NewArticleModel(conn sqlx.SqlConn) ArticleModel {
|
||||
return &customArticleModel{
|
||||
defaultArticleModel: newArticleModel(conn),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *customArticleModel) withSession(session sqlx.Session) ArticleModel {
|
||||
return NewArticleModel(sqlx.NewSqlConnFromSession(session))
|
||||
}
|
||||
93
server/internal/articlemodel/articlemodel_gen.go
Normal file
93
server/internal/articlemodel/articlemodel_gen.go
Normal file
@@ -0,0 +1,93 @@
|
||||
// Code generated by goctl. DO NOT EDIT.
|
||||
// versions:
|
||||
// goctl version: 1.9.1
|
||||
|
||||
package articlemodel
|
||||
|
||||
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 (
|
||||
articleFieldNames = builder.RawFieldNames(&Article{})
|
||||
articleRows = strings.Join(articleFieldNames, ",")
|
||||
articleRowsExpectAutoSet = strings.Join(stringx.Remove(articleFieldNames, "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
|
||||
articleRowsWithPlaceHolder = strings.Join(stringx.Remove(articleFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
|
||||
)
|
||||
|
||||
type (
|
||||
articleModel interface {
|
||||
Insert(ctx context.Context, data *Article) (sql.Result, error)
|
||||
FindOne(ctx context.Context, id int64) (*Article, error)
|
||||
Update(ctx context.Context, data *Article) error
|
||||
Delete(ctx context.Context, id int64) error
|
||||
}
|
||||
|
||||
defaultArticleModel struct {
|
||||
conn sqlx.SqlConn
|
||||
table string
|
||||
}
|
||||
|
||||
Article struct {
|
||||
Title string `db:"title"`
|
||||
Content string `db:"content"`
|
||||
Cover string `db:"cover"`
|
||||
CreateAt time.Time `db:"create_at"`
|
||||
UpdateAt time.Time `db:"update_at"`
|
||||
IsDelete int64 `db:"is_delete"`
|
||||
Topic string `db:"topic"`
|
||||
Excerpt string `db:"excerpt"`
|
||||
Id int64 `db:"id"`
|
||||
}
|
||||
)
|
||||
|
||||
func newArticleModel(conn sqlx.SqlConn) *defaultArticleModel {
|
||||
return &defaultArticleModel{
|
||||
conn: conn,
|
||||
table: "`article`",
|
||||
}
|
||||
}
|
||||
|
||||
func (m *defaultArticleModel) 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 *defaultArticleModel) FindOne(ctx context.Context, id int64) (*Article, error) {
|
||||
query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", articleRows, m.table)
|
||||
var resp Article
|
||||
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 *defaultArticleModel) Insert(ctx context.Context, data *Article) (sql.Result, error) {
|
||||
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, articleRowsExpectAutoSet)
|
||||
ret, err := m.conn.ExecCtx(ctx, query, data.Title, data.Content, data.Cover, data.IsDelete, data.Topic, data.Excerpt, data.Id)
|
||||
return ret, err
|
||||
}
|
||||
|
||||
func (m *defaultArticleModel) Update(ctx context.Context, data *Article) error {
|
||||
query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, articleRowsWithPlaceHolder)
|
||||
_, err := m.conn.ExecCtx(ctx, query, data.Title, data.Content, data.Cover, data.IsDelete, data.Topic, data.Excerpt, data.Id)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m *defaultArticleModel) tableName() string {
|
||||
return m.table
|
||||
}
|
||||
5
server/internal/articlemodel/vars.go
Normal file
5
server/internal/articlemodel/vars.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package articlemodel
|
||||
|
||||
import "github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||
|
||||
var ErrNotFound = sqlx.ErrNotFound
|
||||
113
server/internal/handler/uploadimg/upload.go
Normal file
113
server/internal/handler/uploadimg/upload.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/JACKYMYPERSON/hldrCenter/config"
|
||||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// UploadImageHandler 处理图片上传到OSS
|
||||
func UploadImageHandler(cfg *config.Config) gin.HandlerFunc {
|
||||
// 闭包:内部函数可以访问 cfg 参数
|
||||
return func(c *gin.Context) {
|
||||
// 获取上传的图片文件
|
||||
fileHeader, err := c.FormFile("image")
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"code": 400,
|
||||
"message": "获取图片失败,请重新上传",
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 打开文件
|
||||
file, err := fileHeader.Open()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{
|
||||
"code": 500,
|
||||
"message": "打开图片文件失败",
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// 检查文件大小(使用配置中的max_file_size)
|
||||
if fileHeader.Size > cfg.Upload.MaxFileSize {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"code": 400,
|
||||
"message": fmt.Sprintf("图片大小不能超过 %dMB", cfg.Upload.MaxFileSize>>20),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 检查文件类型(使用配置中的allow_image_types)
|
||||
fileType := fileHeader.Header.Get("Content-Type")
|
||||
if !strings.Contains(cfg.Upload.AllowImageTypes, fileType) {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"code": 400,
|
||||
"message": fmt.Sprintf("不支持的图片类型,仅允许:%s", cfg.Upload.AllowImageTypes),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 初始化OSS客户端(使用配置中的OSS参数)
|
||||
client, err := oss.New(
|
||||
cfg.OSS.Endpoint,
|
||||
cfg.OSS.AccessKeyID,
|
||||
cfg.OSS.AccessKeySecret,
|
||||
)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{
|
||||
"code": 500,
|
||||
"message": "初始化OSS客户端失败",
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 获取Bucket
|
||||
bucket, err := client.Bucket(cfg.OSS.BucketName)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{
|
||||
"code": 500,
|
||||
"message": "获取Bucket失败",
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 生成唯一文件名
|
||||
timestamp := time.Now().Format("20060102150405")
|
||||
filename := fmt.Sprintf("%s_%s", timestamp, fileHeader.Filename)
|
||||
objectKey := cfg.OSS.ObjectPrefix + filename // OSS中的完整对象键
|
||||
|
||||
// 上传文件到OSS
|
||||
err = bucket.PutObject(objectKey, file)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{
|
||||
"code": 500,
|
||||
"message": "上传图片到OSS失败",
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 生成图片访问URL
|
||||
host := strings.TrimPrefix(cfg.OSS.Endpoint, "https://")
|
||||
imageURL := fmt.Sprintf("https://%s.%s/%s", cfg.OSS.BucketName, host, objectKey)
|
||||
|
||||
// 返回成功响应
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"code": 200,
|
||||
"message": "图片上传成功",
|
||||
"data": gin.H{"url": imageURL},
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user