fix: 完成 Gitea 目录改组收尾(import、构建与 LICENSE)

同步包路径与路由,去掉 SPA 构建步骤,对齐 Gitea 式 LICENSE,并更新规格/规则与占位 SSR。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-29 04:01:20 +08:00
parent 9fe299a45f
commit 3f50316ad0
93 changed files with 1472 additions and 1522 deletions

View File

@@ -1,4 +1,4 @@
package service
package services
import (
"encoding/json"
@@ -6,7 +6,7 @@ import (
"strings"
"time"
"git.iioio.com/freefire/jiang13-forum/model"
"git.iioio.com/freefire/jiang13-forum/models"
"gorm.io/gorm"
)
@@ -54,7 +54,7 @@ func CreatePollForPost(tx *gorm.DB, postID uint, multi bool, maxChoices int, end
} else if maxChoices < 1 || maxChoices > len(options) {
maxChoices = len(options)
}
poll := model.Poll{PostID: postID, Multi: multi, MaxChoices: maxChoices, EndsAt: endsAt}
poll := models.Poll{PostID: postID, Multi: multi, MaxChoices: maxChoices, EndsAt: endsAt}
if err := tx.Create(&poll).Error; err != nil {
return err
}
@@ -66,7 +66,7 @@ func CreatePollForPost(tx *gorm.DB, postID uint, multi bool, maxChoices int, end
if len([]rune(text)) > 64 {
return errors.New("投票选项最多 64 字")
}
row := model.PollOption{PostID: postID, Text: text, SortOrder: i}
row := models.PollOption{PostID: postID, Text: text, SortOrder: i}
if err := tx.Create(&row).Error; err != nil {
return err
}
@@ -131,8 +131,8 @@ func parsePollEndsAt(raw string) (*time.Time, error) {
// closePollIfExpired 若已过截止时间则自动关闭投票
func closePollIfExpired(postID uint) error {
var poll model.Poll
if err := model.DB.Where("post_id = ?", postID).First(&poll).Error; err != nil {
var poll models.Poll
if err := models.DB.Where("post_id = ?", postID).First(&poll).Error; err != nil {
return err
}
if poll.Closed || poll.EndsAt == nil {
@@ -141,7 +141,7 @@ func closePollIfExpired(postID uint) error {
if time.Now().Before(*poll.EndsAt) {
return nil
}
res := model.DB.Model(&poll).Where("post_id = ? AND closed = ?", postID, false).Update("closed", true)
res := models.DB.Model(&poll).Where("post_id = ? AND closed = ?", postID, false).Update("closed", true)
return res.Error
}
@@ -150,12 +150,12 @@ func GetPollView(postID, viewerID uint) (*PollView, error) {
if err := closePollIfExpired(postID); err != nil {
return nil, err
}
var poll model.Poll
if err := model.DB.Where("post_id = ?", postID).First(&poll).Error; err != nil {
var poll models.Poll
if err := models.DB.Where("post_id = ?", postID).First(&poll).Error; err != nil {
return nil, err
}
var opts []model.PollOption
if err := model.DB.Where("post_id = ?", postID).Order("sort_order ASC, id ASC").Find(&opts).Error; err != nil {
var opts []models.PollOption
if err := models.DB.Where("post_id = ?", postID).Order("sort_order ASC, id ASC").Find(&opts).Error; err != nil {
return nil, err
}
total := 0
@@ -165,8 +165,8 @@ func GetPollView(postID, viewerID uint) (*PollView, error) {
showResults := poll.Closed
var myIDs []uint
if viewerID > 0 {
var votes []model.PollVote
model.DB.Where("post_id = ? AND user_id = ?", postID, viewerID).Find(&votes)
var votes []models.PollVote
models.DB.Where("post_id = ? AND user_id = ?", postID, viewerID).Find(&votes)
for _, v := range votes {
myIDs = append(myIDs, v.OptionID)
}
@@ -196,15 +196,15 @@ func VotePoll(postID, userID uint, optionIDs []uint) error {
if err := closePollIfExpired(postID); err != nil {
return err
}
var poll model.Poll
if err := model.DB.Where("post_id = ?", postID).First(&poll).Error; err != nil {
var poll models.Poll
if err := models.DB.Where("post_id = ?", postID).First(&poll).Error; err != nil {
return err
}
if poll.Closed {
return ErrPollClosed
}
var existing int64
model.DB.Model(&model.PollVote{}).Where("post_id = ? AND user_id = ?", postID, userID).Count(&existing)
models.DB.Model(&models.PollVote{}).Where("post_id = ? AND user_id = ?", postID, userID).Count(&existing)
if existing > 0 {
return ErrPollAlreadyVoted
}
@@ -223,18 +223,18 @@ func VotePoll(postID, userID uint, optionIDs []uint) error {
return ErrPollInvalidVote
}
seen[oid] = true
var opt model.PollOption
if err := model.DB.Where("id = ? AND post_id = ?", oid, postID).First(&opt).Error; err != nil {
var opt models.PollOption
if err := models.DB.Where("id = ? AND post_id = ?", oid, postID).First(&opt).Error; err != nil {
return ErrPollInvalidVote
}
}
return model.DB.Transaction(func(tx *gorm.DB) error {
return models.DB.Transaction(func(tx *gorm.DB) error {
for _, oid := range optionIDs {
v := model.PollVote{PostID: postID, OptionID: oid, UserID: userID}
v := models.PollVote{PostID: postID, OptionID: oid, UserID: userID}
if err := tx.Create(&v).Error; err != nil {
return err
}
if err := tx.Model(&model.PollOption{}).Where("id = ?", oid).
if err := tx.Model(&models.PollOption{}).Where("id = ?", oid).
UpdateColumn("vote_count", gorm.Expr("vote_count + 1")).Error; err != nil {
return err
}
@@ -248,7 +248,7 @@ func ClosePoll(postID, userID uint, isAdmin bool, postAuthorID uint) error {
if !isAdmin && userID != postAuthorID {
return ErrPermissionDenied
}
res := model.DB.Model(&model.Poll{}).Where("post_id = ?", postID).Update("closed", true)
res := models.DB.Model(&models.Poll{}).Where("post_id = ?", postID).Update("closed", true)
if res.Error != nil {
return res.Error
}
@@ -261,20 +261,20 @@ func ClosePoll(postID, userID uint, isAdmin bool, postAuthorID uint) error {
// LockPollOptions 编辑时锁定选项(已发布帖不允许改选项文案)
func LockPollOptions(postID uint) bool {
var n int64
model.DB.Model(&model.PollVote{}).Where("post_id = ?", postID).Count(&n)
models.DB.Model(&models.PollVote{}).Where("post_id = ?", postID).Count(&n)
return n > 0
}
// EnsurePollExists 检查投票帖是否有 poll 记录
func EnsurePollExists(postID uint) bool {
var n int64
model.DB.Model(&model.Poll{}).Where("post_id = ?", postID).Count(&n)
models.DB.Model(&models.Poll{}).Where("post_id = ?", postID).Count(&n)
return n > 0
}
// DeletePollData 删帖时清理投票数据
func DeletePollData(tx *gorm.DB, postID uint) {
tx.Where("post_id = ?", postID).Delete(&model.PollVote{})
tx.Where("post_id = ?", postID).Delete(&model.PollOption{})
tx.Where("post_id = ?", postID).Delete(&model.Poll{})
tx.Where("post_id = ?", postID).Delete(&models.PollVote{})
tx.Where("post_id = ?", postID).Delete(&models.PollOption{})
tx.Where("post_id = ?", postID).Delete(&models.Poll{})
}