修改数据库事务的使用方式,无需手动添加defer释放锁,日记图片压缩

This commit is contained in:
sysnix 2023-09-28 02:08:07 +08:00
parent 5d3d26b907
commit 167593e65f
7 changed files with 68 additions and 36 deletions

View File

@ -31,7 +31,7 @@ func init() {
log.Println("IP:", record.IpAddr, "点击了:", record.Title)
relId := record.RelId
record.Id = uuid.NewString()
database.WGorm().Transaction(func(tx *gorm.DB) error {
database.WGorm(func(tx *gorm.DB) error {
err := tx.Table("blog_view_record").Create(&record).Error
if err != nil {
return err
@ -39,7 +39,7 @@ func init() {
err2 := database.RedisTemplate.HIncrBy(ctx, consts.REDIS_BLOG_VIEW_RECORD, relId, 1).Err()
return err2
})
database.WGormUnlock()
// database.WGormUnlock()
}
}()

View File

@ -7,7 +7,11 @@ import (
"blog/internal/model/vo"
"blog/third_party/SessionUtil"
"blog/third_party/database"
"bytes"
"context"
"image/jpeg"
"log"
"mime/multipart"
"strings"
"time"
@ -32,7 +36,7 @@ func (ctrl *DiaryController) Get() {
func (ctrl *DiaryController) PostSubmit() {
user := SessionUtil.GetUser(ctrl.Session)
userId := user.Id
createBy := user.Username
content := ctrl.Ctx.FormValue("content")
var err error
@ -40,9 +44,9 @@ func (ctrl *DiaryController) PostSubmit() {
ctx := context.Background()
diaryId := uuid.NewString()
database.WGorm().Transaction(func(tx *gorm.DB) error {
database.WGorm(func(tx *gorm.DB) error {
now := time.Now().UnixMilli()
diary := admin.AdminDiary{Id: diaryId, PublishTime: now, Del: 0, CreateTime: now, CreateBy: userId}
diary := admin.AdminDiary{Id: diaryId, PublishTime: now, Del: 0, CreateTime: now, CreateBy: createBy}
ctn := vo.CommonContent{Id: uuid.NewString(), RelId: diaryId, Content: content, State: consts.CONTENT_STATE_PUBLISH}
err = tx.Table("common_contents").Create(ctn).Error
if err != nil {
@ -54,19 +58,20 @@ func (ctrl *DiaryController) PostSubmit() {
return fileErr
}
fileIds := []string{}
for i, file := range files {
defer file.Close()
for i, _ := range files {
// defer file.Close()
header := headers[i]
fileSize := header.Size
var bytes []byte = make([]byte, fileSize)
_, err = file.Read(bytes)
if err != nil {
return err
}
bytes := compressImg(header)
fileSize := int64(len(bytes))
// var bytes []byte = make([]byte, fileSize)
// _, err = file.Read(bytes)
// if err != nil {
// return err
// }
fileName := header.Filename
fileId := uuid.NewString()
fileIds = append(fileIds, fileId)
sysFile := admin.SysFile{Id: fileId, FileName: fileName, FileSize: fileSize, Data: bytes, Sort: i, Del: 0, CreateBy: userId, CreateTime: now}
sysFile := admin.SysFile{Id: fileId, FileName: fileName, FileSize: fileSize, Data: bytes, Sort: i, Del: 0, CreateBy: createBy, CreateTime: now}
err = tx.Table("common_files").Create(&sysFile).Error
if err != nil {
return err
@ -90,7 +95,6 @@ func (ctrl *DiaryController) PostSubmit() {
err = database.RedisTemplate.Set(ctx, consts.REDIS_BLOG_CONTENT+diaryId, content, time.Duration(0)).Err()
return err
})
defer database.WGormUnlock()
if err != nil {
ctrl.Ctx.JSON(AjaxResult.OkMsg("发布成功", nil))
@ -98,3 +102,36 @@ func (ctrl *DiaryController) PostSubmit() {
}
ctrl.Ctx.JSON(AjaxResult.Error("发布失败"))
}
var compress int64 = 1 * 1024 * 1024
// 判断是否JPEG格式按大小进行压缩
func compressImg(fileHeader *multipart.FileHeader) []byte {
fileName := fileHeader.Filename
fileSize := fileHeader.Size
file, _ := fileHeader.Open()
if strings.HasSuffix(fileName, "jpg") || strings.HasSuffix(fileName, "jpeg") {
quality := 100
if fileSize > compress {
mul := fileSize / compress
if mul > 1 {
quality = 70
}
log.Println("JPG格式图片,判断是否压缩")
i, err := jpeg.Decode(file)
if err != nil {
return nil
}
var buf []byte
b := bytes.NewBuffer(buf)
jpeg.Encode(b, i, &jpeg.Options{Quality: quality})
return b.Bytes()
}
}
var bytes []byte = make([]byte, fileSize)
file.Read(bytes)
return bytes
}

View File

@ -67,13 +67,13 @@ func (ctrl *FileController) PostUpload() {
Data: bytes, State: "1",
Del: 0,
}
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
err = database.WGorm(func(tx *gorm.DB) error {
err2 := tx.Table("common_files").Create(sysFile).Error
return err2
// log.Println(sysFile)
// return nil
})
defer database.WGormUnlock()
if err != nil {
// {
// success : 0 | 1, // 0 表示上传失败1 表示上传成功
@ -99,7 +99,7 @@ func (ctrl *FileController) DelFile() {
return
}
ctx := context.Background()
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
err := database.WGorm(func(tx *gorm.DB) error {
txErr := tx.Table("common_files").Delete(&vo.CommonFiles{Id: id}).Error
if txErr != nil {
return txErr
@ -108,7 +108,6 @@ func (ctrl *FileController) DelFile() {
return txErr
})
defer database.WGormUnlock()
if err != nil {
ctrl.Ctx.JSON(AjaxResult.Error("删除失败"))

View File

@ -96,7 +96,7 @@ func (*articleService) CreateArticle(articel *admin.AdminArticle) (string, error
articel.Del = 0
articel.State = consts.ARTICLE_STATE_DRAFT
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
err := database.WGorm(func(tx *gorm.DB) error {
contentId := uuid.NewString()
content := articel.Content
commonContent := vo.CommonContent{Id: contentId, RelId: articleId, Content: content, State: consts.CONTENT_STATE_DOWN}
@ -108,7 +108,7 @@ func (*articleService) CreateArticle(articel *admin.AdminArticle) (string, error
err = tx.Table("blog_articles").Create(*articel).Error
return err
})
defer database.WGormUnlock()
return articleId, err
}
@ -116,7 +116,7 @@ func (*articleService) UpdateArticle(articel *admin.AdminArticle) (string, error
time := time.Now().UnixMilli()
articleId := articel.Id
articel.UpdateTime = time
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
err := database.WGorm(func(tx *gorm.DB) error {
//更新Article
tx.Table("blog_articles").Updates(articel)
@ -124,7 +124,7 @@ func (*articleService) UpdateArticle(articel *admin.AdminArticle) (string, error
err := tx.Table("common_contents").Where("rel_id", articleId).UpdateColumn("content", articel.Content).Error
return err
})
defer database.WGormUnlock()
return articleId, err
}
@ -146,7 +146,7 @@ func (*articleService) PublishArticle(id string) error {
}
article.State = consts.ARTICLE_STATE_PUBLISH
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
err = database.WGorm(func(tx *gorm.DB) error {
var txErr error = tx.Table("blog_articles").Updates(&article).Error
if txErr != nil {
return errors.New("文章更新错误")
@ -170,7 +170,7 @@ func (*articleService) PublishArticle(id string) error {
return txErr
})
defer database.WGormUnlock()
return err
}
@ -185,7 +185,7 @@ func (*articleService) UnPublishArticle(id string) error {
return errors.New("撤下失败,文章状态不是已发布状态,无法撤下")
}
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
err = database.WGorm(func(tx *gorm.DB) error {
var txErr error
ctx := context.Background()
txErr = database.RedisTemplate.ZRemRangeByScore(ctx, consts.REDIS_BLOG_ARTICLE_LATEST,
@ -213,7 +213,6 @@ func (*articleService) UnPublishArticle(id string) error {
return txErr
})
defer database.WGormUnlock()
return err
}
@ -221,11 +220,10 @@ func (*articleService) UnPublishArticle(id string) error {
func (*articleService) DelArticle(id string) error {
// articel := ArticleService.GetAdminArticle(id)
// err := database.GormTemplate.Table("blog_articles").Where("id = ?", id).First(&article).Error
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
err := database.WGorm(func(tx *gorm.DB) error {
txErr := tx.Table("blog_articles").Where("id = ?", id).UpdateColumn("del", 1).Error
return txErr
})
defer database.WGormUnlock()
return err
}

View File

@ -32,7 +32,7 @@
<v-card-text>
<v-textarea outlined rows="8" v-model="content"></v-textarea>
<input id="i-files" type="file" multiple style="display: none"/>
<input id="i-files" type="file" multiple style="display: none" accept=".jpg,.jpeg,.png,.bmp,.gif"/>
<v-container style="height: 100%">
<v-row>
<v-col cols="4" v-for="(img,index) in images">

View File

@ -86,7 +86,7 @@
<span class="over-display">{{item.fileName}}</span>
</template>
<template #item.fileSize="{ item }">
{{Math.round(item.fileSize/1024)}}KB
{{new Number(item.fileSize/(1024*1024)).toFixed(3)}}MB
</template>
<template #item.actions="{ item }">

View File

@ -28,11 +28,9 @@ func init() {
}
// sqlite无法同时多个线程写入需要上锁保护读操作无需考虑
func WGorm() *gorm.DB {
func WGorm(txFunc func(tx *gorm.DB) error) error {
rwMutex.Lock()
return GormTemplate
}
func WGormUnlock() {
err := GormTemplate.Transaction(txFunc)
rwMutex.Unlock()
return err
}