feat: SSR 私信与通知(/messages)
会话列表、读写、未读角标与全部已读;系统会话只读;用户主页可发起私信。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
<nav class="j13-nav">
|
||||
{{if .LoggedIn}}
|
||||
<a href="/compose">发帖</a>
|
||||
<a href="/messages">私信{{if gt .UnreadCount 0}} <span class="j13-badge">{{.UnreadCount}}</span>{{end}}</a>
|
||||
<a href="/favorites">收藏</a>
|
||||
<a href="/profile">{{.ViewerName}}</a>
|
||||
{{if .IsAdmin}}<a href="/admin/dashboard">后台</a>{{end}}
|
||||
|
||||
@@ -2,5 +2,5 @@ package templates
|
||||
|
||||
import "embed"
|
||||
|
||||
//go:embed *.tmpl base/*.tmpl home/*.tmpl post/*.tmpl shared/*.tmpl status/*.tmpl auth/*.tmpl admin/*.tmpl profile/*.tmpl user/*.tmpl favorites/*.tmpl
|
||||
//go:embed *.tmpl base/*.tmpl home/*.tmpl post/*.tmpl shared/*.tmpl status/*.tmpl auth/*.tmpl admin/*.tmpl profile/*.tmpl user/*.tmpl favorites/*.tmpl messages/*.tmpl
|
||||
var FS embed.FS
|
||||
|
||||
40
templates/messages/list.tmpl
Normal file
40
templates/messages/list.tmpl
Normal file
@@ -0,0 +1,40 @@
|
||||
{{define "messages/list"}}
|
||||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<main class="j13-main j13-messages">
|
||||
<h1>私信与通知</h1>
|
||||
{{template "base/alert" .}}
|
||||
<p class="j13-muted">
|
||||
未读 {{.UnreadTotal}}
|
||||
(私信 {{.UnreadDM}} · 通知 {{.UnreadNotify}})
|
||||
{{if gt .UnreadTotal 0}}
|
||||
<form method="post" action="/messages/read-all" class="j13-inline-form">
|
||||
<input type="hidden" name="_csrf" value="{{.CSRF}}"/>
|
||||
<button type="submit" class="j13-linkbtn">全部标已读</button>
|
||||
</form>
|
||||
{{end}}
|
||||
</p>
|
||||
|
||||
{{if .Conversations}}
|
||||
<ul class="j13-msg-list">
|
||||
{{range .Conversations}}
|
||||
<li class="j13-msg-item{{if gt .Unread 0}} is-unread{{end}}">
|
||||
<a href="/messages/with/{{.PeerID}}">
|
||||
<strong>{{.PeerName}}</strong>
|
||||
{{if gt .Unread 0}}<span class="j13-badge">{{.Unread}}</span>{{end}}
|
||||
<span class="j13-msg-item__preview">{{.Preview}}</span>
|
||||
<span class="j13-muted">{{.UpdatedLabel}}</span>
|
||||
</a>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
<nav class="j13-pager">
|
||||
{{if .HasPrev}}<a href="/messages?page={{.PrevPage}}">上一页</a>{{end}}
|
||||
{{if .HasMore}}<a href="/messages?page={{.NextPage}}">下一页</a>{{end}}
|
||||
</nav>
|
||||
{{else}}
|
||||
<p class="j13-empty">暂无会话。可在用户主页点击「发私信」开始对话。</p>
|
||||
{{end}}
|
||||
</main>
|
||||
{{template "base/footer" .}}
|
||||
{{end}}
|
||||
39
templates/messages/thread.tmpl
Normal file
39
templates/messages/thread.tmpl
Normal file
@@ -0,0 +1,39 @@
|
||||
{{define "messages/thread"}}
|
||||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<main class="j13-main j13-messages">
|
||||
<p><a href="/messages">← 返回会话列表</a></p>
|
||||
<h1>{{.PeerName}}</h1>
|
||||
{{if .IsSystem}}<p class="j13-muted">系统通知(只读)</p>{{else}}<p class="j13-muted"><a href="/user/{{.PeerID}}">查看主页</a></p>{{end}}
|
||||
{{template "base/alert" .}}
|
||||
|
||||
{{if .HasOlder}}
|
||||
<p><a href="/messages/with/{{.PeerID}}?before={{.OlderBefore}}">加载更早消息</a></p>
|
||||
{{end}}
|
||||
|
||||
{{if .Messages}}
|
||||
<ul class="j13-msg-thread">
|
||||
{{range .Messages}}
|
||||
<li class="j13-msg-bubble{{if .FromSelf}} is-self{{end}}{{if .IsSystem}} is-system{{end}}">
|
||||
{{if .Subject}}<div class="j13-msg-bubble__subj">{{.Subject}}</div>{{end}}
|
||||
<div class="j13-msg-bubble__body">{{.Content}}</div>
|
||||
<div class="j13-muted">{{.CreatedLabel}}{{if .Kind}} · {{.Kind}}{{end}}</div>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<p class="j13-empty">还没有消息。{{if .CanReply}}发送第一条私信开始对话。{{end}}</p>
|
||||
{{end}}
|
||||
|
||||
{{if .CanReply}}
|
||||
<form method="post" action="/messages/with/{{.PeerID}}" class="j13-form j13-msg-compose">
|
||||
<input type="hidden" name="_csrf" value="{{.CSRF}}"/>
|
||||
<label>回复
|
||||
<textarea name="content" rows="4" required maxlength="4000">{{.Draft}}</textarea>
|
||||
</label>
|
||||
<button type="submit">发送</button>
|
||||
</form>
|
||||
{{end}}
|
||||
</main>
|
||||
{{template "base/footer" .}}
|
||||
{{end}}
|
||||
@@ -12,7 +12,8 @@
|
||||
<h1>{{if .Nickname}}{{.Nickname}}{{else}}{{.Username}}{{end}}</h1>
|
||||
<p class="j13-muted">@{{.Username}} · Lv.{{.Level}} · 积分 {{.Points}}</p>
|
||||
{{if .Signature}}<p class="j13-user-sig">{{.Signature}}</p>{{end}}
|
||||
{{if .IsSelf}}<p><a href="/profile">编辑资料</a></p>{{end}}
|
||||
{{if .IsSelf}}<p><a href="/profile">编辑资料</a></p>
|
||||
{{else if .LoggedIn}}<p><a href="/messages/with/{{.UserID}}">发私信</a></p>{{end}}
|
||||
</div>
|
||||
</header>
|
||||
{{template "base/alert" .}}
|
||||
|
||||
Reference in New Issue
Block a user