修改数据库事务的使用方式,无需手动添加defer释放锁,日记图片压缩
This commit is contained in:
parent
5d3d26b907
commit
167593e65f
|
@ -31,7 +31,7 @@ func init() {
|
||||||
log.Println("IP:", record.IpAddr, "点击了:", record.Title)
|
log.Println("IP:", record.IpAddr, "点击了:", record.Title)
|
||||||
relId := record.RelId
|
relId := record.RelId
|
||||||
record.Id = uuid.NewString()
|
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
|
err := tx.Table("blog_view_record").Create(&record).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -39,7 +39,7 @@ func init() {
|
||||||
err2 := database.RedisTemplate.HIncrBy(ctx, consts.REDIS_BLOG_VIEW_RECORD, relId, 1).Err()
|
err2 := database.RedisTemplate.HIncrBy(ctx, consts.REDIS_BLOG_VIEW_RECORD, relId, 1).Err()
|
||||||
return err2
|
return err2
|
||||||
})
|
})
|
||||||
database.WGormUnlock()
|
// database.WGormUnlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -7,7 +7,11 @@ import (
|
||||||
"blog/internal/model/vo"
|
"blog/internal/model/vo"
|
||||||
"blog/third_party/SessionUtil"
|
"blog/third_party/SessionUtil"
|
||||||
"blog/third_party/database"
|
"blog/third_party/database"
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"image/jpeg"
|
||||||
|
"log"
|
||||||
|
"mime/multipart"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -32,7 +36,7 @@ func (ctrl *DiaryController) Get() {
|
||||||
|
|
||||||
func (ctrl *DiaryController) PostSubmit() {
|
func (ctrl *DiaryController) PostSubmit() {
|
||||||
user := SessionUtil.GetUser(ctrl.Session)
|
user := SessionUtil.GetUser(ctrl.Session)
|
||||||
userId := user.Id
|
createBy := user.Username
|
||||||
|
|
||||||
content := ctrl.Ctx.FormValue("content")
|
content := ctrl.Ctx.FormValue("content")
|
||||||
var err error
|
var err error
|
||||||
|
@ -40,9 +44,9 @@ func (ctrl *DiaryController) PostSubmit() {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
diaryId := uuid.NewString()
|
diaryId := uuid.NewString()
|
||||||
database.WGorm().Transaction(func(tx *gorm.DB) error {
|
database.WGorm(func(tx *gorm.DB) error {
|
||||||
now := time.Now().UnixMilli()
|
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}
|
ctn := vo.CommonContent{Id: uuid.NewString(), RelId: diaryId, Content: content, State: consts.CONTENT_STATE_PUBLISH}
|
||||||
err = tx.Table("common_contents").Create(ctn).Error
|
err = tx.Table("common_contents").Create(ctn).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -54,19 +58,20 @@ func (ctrl *DiaryController) PostSubmit() {
|
||||||
return fileErr
|
return fileErr
|
||||||
}
|
}
|
||||||
fileIds := []string{}
|
fileIds := []string{}
|
||||||
for i, file := range files {
|
for i, _ := range files {
|
||||||
defer file.Close()
|
// defer file.Close()
|
||||||
header := headers[i]
|
header := headers[i]
|
||||||
fileSize := header.Size
|
bytes := compressImg(header)
|
||||||
var bytes []byte = make([]byte, fileSize)
|
fileSize := int64(len(bytes))
|
||||||
_, err = file.Read(bytes)
|
// var bytes []byte = make([]byte, fileSize)
|
||||||
if err != nil {
|
// _, err = file.Read(bytes)
|
||||||
return err
|
// if err != nil {
|
||||||
}
|
// return err
|
||||||
|
// }
|
||||||
fileName := header.Filename
|
fileName := header.Filename
|
||||||
fileId := uuid.NewString()
|
fileId := uuid.NewString()
|
||||||
fileIds = append(fileIds, fileId)
|
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
|
err = tx.Table("common_files").Create(&sysFile).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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()
|
err = database.RedisTemplate.Set(ctx, consts.REDIS_BLOG_CONTENT+diaryId, content, time.Duration(0)).Err()
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctrl.Ctx.JSON(AjaxResult.OkMsg("发布成功", nil))
|
ctrl.Ctx.JSON(AjaxResult.OkMsg("发布成功", nil))
|
||||||
|
@ -98,3 +102,36 @@ func (ctrl *DiaryController) PostSubmit() {
|
||||||
}
|
}
|
||||||
ctrl.Ctx.JSON(AjaxResult.Error("发布失败"))
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -67,13 +67,13 @@ func (ctrl *FileController) PostUpload() {
|
||||||
Data: bytes, State: "1",
|
Data: bytes, State: "1",
|
||||||
Del: 0,
|
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
|
err2 := tx.Table("common_files").Create(sysFile).Error
|
||||||
return err2
|
return err2
|
||||||
// log.Println(sysFile)
|
// log.Println(sysFile)
|
||||||
// return nil
|
// return nil
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// {
|
// {
|
||||||
// success : 0 | 1, // 0 表示上传失败,1 表示上传成功
|
// success : 0 | 1, // 0 表示上传失败,1 表示上传成功
|
||||||
|
@ -99,7 +99,7 @@ func (ctrl *FileController) DelFile() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx := context.Background()
|
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
|
txErr := tx.Table("common_files").Delete(&vo.CommonFiles{Id: id}).Error
|
||||||
if txErr != nil {
|
if txErr != nil {
|
||||||
return txErr
|
return txErr
|
||||||
|
@ -108,7 +108,6 @@ func (ctrl *FileController) DelFile() {
|
||||||
|
|
||||||
return txErr
|
return txErr
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctrl.Ctx.JSON(AjaxResult.Error("删除失败"))
|
ctrl.Ctx.JSON(AjaxResult.Error("删除失败"))
|
||||||
|
|
|
@ -96,7 +96,7 @@ func (*articleService) CreateArticle(articel *admin.AdminArticle) (string, error
|
||||||
articel.Del = 0
|
articel.Del = 0
|
||||||
articel.State = consts.ARTICLE_STATE_DRAFT
|
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()
|
contentId := uuid.NewString()
|
||||||
content := articel.Content
|
content := articel.Content
|
||||||
commonContent := vo.CommonContent{Id: contentId, RelId: articleId, Content: content, State: consts.CONTENT_STATE_DOWN}
|
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
|
err = tx.Table("blog_articles").Create(*articel).Error
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
return articleId, err
|
return articleId, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ func (*articleService) UpdateArticle(articel *admin.AdminArticle) (string, error
|
||||||
time := time.Now().UnixMilli()
|
time := time.Now().UnixMilli()
|
||||||
articleId := articel.Id
|
articleId := articel.Id
|
||||||
articel.UpdateTime = time
|
articel.UpdateTime = time
|
||||||
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
|
err := database.WGorm(func(tx *gorm.DB) error {
|
||||||
//更新Article
|
//更新Article
|
||||||
tx.Table("blog_articles").Updates(articel)
|
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
|
err := tx.Table("common_contents").Where("rel_id", articleId).UpdateColumn("content", articel.Content).Error
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
return articleId, err
|
return articleId, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ func (*articleService) PublishArticle(id string) error {
|
||||||
}
|
}
|
||||||
article.State = consts.ARTICLE_STATE_PUBLISH
|
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
|
var txErr error = tx.Table("blog_articles").Updates(&article).Error
|
||||||
if txErr != nil {
|
if txErr != nil {
|
||||||
return errors.New("文章更新错误")
|
return errors.New("文章更新错误")
|
||||||
|
@ -170,7 +170,7 @@ func (*articleService) PublishArticle(id string) error {
|
||||||
|
|
||||||
return txErr
|
return txErr
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ func (*articleService) UnPublishArticle(id string) error {
|
||||||
return errors.New("撤下失败,文章状态不是已发布状态,无法撤下")
|
return errors.New("撤下失败,文章状态不是已发布状态,无法撤下")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
|
err = database.WGorm(func(tx *gorm.DB) error {
|
||||||
var txErr error
|
var txErr error
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
txErr = database.RedisTemplate.ZRemRangeByScore(ctx, consts.REDIS_BLOG_ARTICLE_LATEST,
|
txErr = database.RedisTemplate.ZRemRangeByScore(ctx, consts.REDIS_BLOG_ARTICLE_LATEST,
|
||||||
|
@ -213,7 +213,6 @@ func (*articleService) UnPublishArticle(id string) error {
|
||||||
|
|
||||||
return txErr
|
return txErr
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -221,11 +220,10 @@ func (*articleService) UnPublishArticle(id string) error {
|
||||||
func (*articleService) DelArticle(id string) error {
|
func (*articleService) DelArticle(id string) error {
|
||||||
// articel := ArticleService.GetAdminArticle(id)
|
// articel := ArticleService.GetAdminArticle(id)
|
||||||
// err := database.GormTemplate.Table("blog_articles").Where("id = ?", id).First(&article).Error
|
// 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
|
txErr := tx.Table("blog_articles").Where("id = ?", id).UpdateColumn("del", 1).Error
|
||||||
return txErr
|
return txErr
|
||||||
})
|
})
|
||||||
defer database.WGormUnlock()
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
<v-card-text>
|
<v-card-text>
|
||||||
<v-textarea outlined rows="8" v-model="content"></v-textarea>
|
<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-container style="height: 100%">
|
||||||
<v-row>
|
<v-row>
|
||||||
<v-col cols="4" v-for="(img,index) in images">
|
<v-col cols="4" v-for="(img,index) in images">
|
||||||
|
|
|
@ -86,7 +86,7 @@
|
||||||
<span class="over-display">{{item.fileName}}</span>
|
<span class="over-display">{{item.fileName}}</span>
|
||||||
</template>
|
</template>
|
||||||
<template #item.fileSize="{ item }">
|
<template #item.fileSize="{ item }">
|
||||||
{{Math.round(item.fileSize/1024)}}KB
|
{{new Number(item.fileSize/(1024*1024)).toFixed(3)}}MB
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #item.actions="{ item }">
|
<template #item.actions="{ item }">
|
||||||
|
|
|
@ -28,11 +28,9 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sqlite无法同时多个线程写入,需要上锁保护,读操作无需考虑
|
// sqlite无法同时多个线程写入,需要上锁保护,读操作无需考虑
|
||||||
func WGorm() *gorm.DB {
|
func WGorm(txFunc func(tx *gorm.DB) error) error {
|
||||||
rwMutex.Lock()
|
rwMutex.Lock()
|
||||||
return GormTemplate
|
err := GormTemplate.Transaction(txFunc)
|
||||||
}
|
|
||||||
|
|
||||||
func WGormUnlock() {
|
|
||||||
rwMutex.Unlock()
|
rwMutex.Unlock()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue