站名回到刚才浏览的子站;排行榜改为 tab 切换,每页 10 条

This commit is contained in:
qianyu committed 2026-09-04 13:32:33 +08:00
1 parent f0a5a83164
commit d5345e2c4a
4 files changed
+46 -23

No files matched your search

+5
View File
@@ -54,6 +54,7 @@ type Base struct {
MeID int64 // Me 的 ID(模板里比较用,未登录为 0)
InApp bool // App 内置浏览器(X/微信等)
HasBGM bool // static/bgm.m4a 存在才渲染背景音乐
HomePath string // 左上角站名点回哪:刚才浏览的子站(cookie bhome),否则主站
NoIndex bool // 未收录的子站不让搜索引擎收录
Desc string // 页面描述(站点页用站名 + 口号)
OGImage string // 分享缩略图(站点页用 X 头像)
@@ -219,6 +220,10 @@ func (a *App) base(r *http.Request) Base {
if b.Me != nil {
b.MeID = b.Me.ID
}
b.HomePath = "/"
if s := cookieVal(r, "bhome"); s != "" && validSlug(s) {
b.HomePath = "/" + s
}
return b
}
+7 -1
View File
@@ -75,6 +75,12 @@ func (a *App) handleRoot(w http.ResponseWriter, r *http.Request) {
func (a *App) renderSite(w http.ResponseWriter, r *http.Request, status int, site *Site, errMsg, nick, xh, amount, message string) {
visitor := a.visitor(w, r)
// 记住「现在在逛哪个碗」:之后点左上角站名、看完排行榜都回到这里,而不是一律跳回总舵
if site.IsMain() {
a.setCookie(w, "bhome", "", -1)
} else {
a.setCookie(w, "bhome", site.Slug, 24*3600)
}
p := sitePage{Base: a.base(r), Site: site, Presets: a.cfg.PresetAmounts,
Ready: site.PaymentReady(), Err: errMsg, Nick: nick, XHandle: xh, Amount: amount, Message: message,
MinAmount: fmtE8(a.cfg.MinAmountE8), MaxAmount: fmtE8(a.cfg.MaxAmountE8), CoinsPerDay: a.cfg.CoinsPerDay}
@@ -525,7 +531,7 @@ type rankPage struct {
PgDonors, PgDonorsWeek, PgSites, PgSitesWeek, PgPopular Pager
}
const rankPageSize = 35
const rankPageSize = 10
var rankParams = []string{"da", "dw", "ba", "bw", "pp"}
+1 -1
View File
@@ -244,7 +244,7 @@ footer a{color:var(--muted)}
{{if .HasBGM}}<audio id="bgm" src="/static/bgm.m4a" loop preload="none" playsinline></audio>{{end}}
<div class="page">
<nav class="nav">
<a class="brand" href="/">{{template "coin"}}<span>{{.SiteTitle}}</span></a>
<a class="brand" href="{{.HomePath}}"{{if ne .HomePath "/"}} title="回到刚才看的碗"{{end}}>{{template "coin"}}<span>{{.SiteTitle}}</span></a>
<span class="sp"></span>
<button class="sfx" id="sfxBtn" type="button" aria-label="声音开关" title="声音">🔊</button>
<a class="link navrank" href="/rank" aria-label="排行榜" title="排行榜"><span>排行榜</span></a>
+33 -21
View File
@@ -1,24 +1,30 @@
{{define "title"}}排行榜 · {{.SiteTitle}}{{end}}
{{define "content"}}
<div class="layout cols2">
<section class="card px" id="donors">
<h2>🏆 全站施主榜 <span class="sub">HIGH SCORE · 所有要饭站加起来 · {{.PgDonors.Total}} 人</span></h2>
<div class="toggle" data-for="donors"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="wk donors-all">{{template "gdonorlist" (dict "Rows" .Donors "Start" .PgDonors.Offset)}}{{template "pager" .PgDonors}}</div>
<div class="wk donors-week" hidden>{{template "gdonorlist" (dict "Rows" .DonorsWeek "Start" .PgDonorsWeek.Offset)}}{{template "pager" .PgDonorsWeek}}</div>
<div style="max-width:760px;margin:0 auto">
<section class="card px">
<div class="tabs" role="tablist">
<button class="tab on" type="button" role="tab" id="t-donors" aria-controls="p-donors" aria-selected="true" data-t="donors">🏆 施主榜</button>
<button class="tab" type="button" role="tab" id="t-beggars" aria-controls="p-beggars" aria-selected="false" data-t="beggars">🥣 乞丐榜</button>
<button class="tab" type="button" role="tab" id="t-popular" aria-controls="p-popular" aria-selected="false" data-t="popular">🪙 人气榜</button>
</div>
<div class="panel on" id="p-donors" role="tabpanel" aria-labelledby="t-donors">
<div class="hint" style="margin-bottom:8px">HIGH SCORE · 所有要饭站加起来 · 共 {{.PgDonors.Total}} 位施主</div>
<div class="toggle" data-for="donors"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="wk donors-all">{{template "gdonorlist" (dict "Rows" .Donors "Start" .PgDonors.Offset)}}{{template "pager" .PgDonors}}</div>
<div class="wk donors-week" hidden>{{template "gdonorlist" (dict "Rows" .DonorsWeek "Start" .PgDonorsWeek.Offset)}}{{template "pager" .PgDonorsWeek}}</div>
</div>
<div class="panel" id="p-beggars" role="tabpanel" aria-labelledby="t-beggars">
<div class="hint" style="margin-bottom:8px">要到最多的要饭站 · 共 {{.PgSites.Total}} 个</div>
<div class="toggle" data-for="beggars"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="wk beggars-all">{{template "gsitelist" (dict "Rows" .Sites "By" "amount" "Me" .MeID "Start" .PgSites.Offset)}}{{template "pager" .PgSites}}</div>
<div class="wk beggars-week" hidden>{{template "gsitelist" (dict "Rows" .SitesWeek "By" "amount" "Me" .MeID "Start" .PgSitesWeek.Offset)}}{{template "pager" .PgSitesWeek}}</div>
</div>
<div class="panel" id="p-popular" role="tabpanel" aria-labelledby="t-popular">
<div class="hint" style="margin-bottom:8px">收到钢镚最多(免费投)· 共 {{.PgPopular.Total}} 个</div>
{{template "gsitelist" (dict "Rows" .Popular "By" "coins" "Me" .MeID "Start" .PgPopular.Offset)}}{{template "pager" .PgPopular}}
</div>
</section>
<div style="display:grid;gap:18px">
<section class="card px" id="beggars">
<h2>🥣 乞丐榜 <span class="sub">要到最多的要饭站 · {{.PgSites.Total}} 个</span></h2>
<div class="toggle" data-for="beggars"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="wk beggars-all">{{template "gsitelist" (dict "Rows" .Sites "By" "amount" "Me" .MeID "Start" .PgSites.Offset)}}{{template "pager" .PgSites}}</div>
<div class="wk beggars-week" hidden>{{template "gsitelist" (dict "Rows" .SitesWeek "By" "amount" "Me" .MeID "Start" .PgSitesWeek.Offset)}}{{template "pager" .PgSitesWeek}}</div>
</section>
<section class="card px" id="popular">
<h2>🪙 人气榜 <span class="sub">收到钢镚最多(免费投)</span></h2>
{{template "gsitelist" (dict "Rows" .Popular "By" "coins" "Me" .MeID "Start" .PgPopular.Offset)}}{{template "pager" .PgPopular}}
</section>
</div>
{{if ne .HomePath "/"}}<div class="center" style="margin-top:14px"><a class="btn sec" href="{{.HomePath}}">← 回到刚才看的碗</a></div>{{end}}
</div>
{{end}}
{{define "gdonorlist"}}{{if .Rows}}<ul class="list">
@@ -38,7 +44,13 @@
</li>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">🏚</div>还没有人上榜</div>{{end}}{{end}}
{{define "scripts"}}<script>
document.querySelectorAll('.toggle').forEach(function(tg){var k=tg.dataset.for;tg.querySelectorAll('button').forEach(function(b){b.addEventListener('click',function(){tg.querySelectorAll('button').forEach(function(x){x.classList.toggle('on',x===b)});document.querySelector('.'+k+'-all').hidden=b.dataset.w!=='all';document.querySelector('.'+k+'-week').hidden=b.dataset.w!=='week'})})});
// 翻页链接带 #xxx-week 锚点时,回来自动切到「本周」并定位到该榜
(function(){var m=/^#(donors|beggars)-week$/.exec(location.hash);if(!m)return;var tg=document.querySelector('.toggle[data-for="'+m[1]+'"] button[data-w="week"]');if(tg){tg.click();var sec=document.getElementById(m[1]);if(sec)sec.scrollIntoView()}})();
(function(){
var tabs=document.querySelectorAll('.tab'),panels=document.querySelectorAll('.panel');
function show(t){tabs.forEach(function(x){var on=x.dataset.t===t;x.classList.toggle('on',on);x.setAttribute('aria-selected',on?'true':'false')});panels.forEach(function(p){p.classList.toggle('on',p.id==='p-'+t)})}
tabs.forEach(function(t){t.addEventListener('click',function(){show(t.dataset.t);try{history.replaceState(null,'','#'+t.dataset.t)}catch(e){}})});
document.querySelectorAll('.toggle').forEach(function(tg){var k=tg.dataset.for;tg.querySelectorAll('button').forEach(function(b){b.addEventListener('click',function(){tg.querySelectorAll('button').forEach(function(x){x.classList.toggle('on',x===b)});document.querySelector('.'+k+'-all').hidden=b.dataset.w!=='all';document.querySelector('.'+k+'-week').hidden=b.dataset.w!=='week'})})});
// 锚点决定打开哪个榜:#beggars / #donors-week(翻页链接带着它,翻完回来还在原来的榜和「本周」)
var m=/^#(donors|beggars|popular)(-week)?$/.exec(location.hash);
if(m){show(m[1]);if(m[2]){var wb=document.querySelector('.toggle[data-for="'+m[1]+'"] button[data-w="week"]');if(wb)wb.click()}}
})();
</script>{{end}}