- 评论区有效@提及渲染为蓝色链接跳转/space/{uid},无效@保持纯文本
- 输入@触发悬浮窗,根据输入实时搜索用户(含头像+等级)
- 无匹配时显示未搜索到用户,选中后插入为@用户名 格式(尾部空格)
- 悬浮窗定位于输入光标上方,不遮挡输入内容
- 后端Comment新增Mentions字段,批量加载提及映射供前端判断
- SearchUsers/parseMentions 统一限制LV2+用户
- 所有默认头像由首字符文字改为统一SVG人形图标(nav/home/space/mention等7处)
59 lines
2.8 KiB
Go
59 lines
2.8 KiB
Go
package model
|
||
|
||
import "time"
|
||
|
||
// Comment 评论模型
|
||
type Comment struct {
|
||
ID uint `gorm:"primarykey" json:"id"`
|
||
PostID uint `gorm:"index;not null" json:"post_id"`
|
||
RootID uint `gorm:"index;not null" json:"root_id"` // 根评论ID,顶级评论指向自身
|
||
ParentID *uint `gorm:"index" json:"parent_id"` // 父评论ID,NULL=顶级评论
|
||
ReplyToUID uint `gorm:"default:0" json:"reply_to_uid"` // 被回复者UID
|
||
Body string `gorm:"type:text;not null" json:"body"` // 评论内容(纯文本 + 图片URL)
|
||
IsDeleted bool `gorm:"default:false;index" json:"is_deleted"`
|
||
LikesCount int `gorm:"default:0" json:"likes_count"`
|
||
DislikesCount int `gorm:"default:0" json:"dislikes_count"` // 仅后台可见
|
||
UserID uint `gorm:"index;not null" json:"user_id"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
|
||
// 非数据库字段(联表查询填充)
|
||
AuthorName string `gorm:"-:migration;<-:false;column:author_name" json:"author_name,omitempty"`
|
||
AuthorAvatar string `gorm:"-:migration;<-:false;column:author_avatar" json:"author_avatar,omitempty"`
|
||
AuthorLevel int `gorm:"-:migration;<-:false;column:author_level" json:"author_level,omitempty"`
|
||
// ReplyToName 被回复者当前显示名(JOIN users 获取,动态解析,改名后自动更新)
|
||
ReplyToName string `gorm:"-:migration;<-:false" json:"reply_to_name,omitempty"`
|
||
// RepliesCount 回复数(非DB字段,查询填充)
|
||
RepliesCount int `gorm:"-:migration;<-:false" json:"replies_count,omitempty"`
|
||
// Mentions 有效@提及映射 username -> uid(非DB字段,批量查询填充)
|
||
// 前端据此判断 @username 是否为有效提及并生成链接
|
||
Mentions map[string]uint `gorm:"-" json:"mentions,omitempty"`
|
||
}
|
||
|
||
// CommentMention @提及映射(绑定UID,不是username,支持改名后自动更新显示名)
|
||
type CommentMention struct {
|
||
ID uint `gorm:"primarykey" json:"id"`
|
||
CommentID uint `gorm:"uniqueIndex:idx_comment_uid,priority:1;not null" json:"comment_id"`
|
||
UID uint `gorm:"uniqueIndex:idx_comment_uid,priority:2;not null" json:"uid"`
|
||
}
|
||
|
||
// UserSearchResult @搜索用户结果
|
||
type UserSearchResult struct {
|
||
UID uint `json:"uid"`
|
||
Username string `json:"username"`
|
||
Level int `json:"level"`
|
||
Avatar string `json:"avatar"`
|
||
}
|
||
|
||
// AdminCommentRow 后台评论列表行
|
||
type AdminCommentRow struct {
|
||
ID uint `json:"id"`
|
||
PostID uint `json:"post_id"`
|
||
PostTitle string `json:"post_title"`
|
||
Body string `json:"body"`
|
||
AuthorName string `json:"author_name"`
|
||
IsDeleted bool `json:"is_deleted"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|