feat: 注册准则阅读控制 + Footer 合规信息

准则阅读(三层控制):
- registration.show_guidelines — 弹窗/复选框模式
- registration.force_guidelines — 是否强制倒计时+滚动
- registration.guidelines_timer — 倒计时秒数

Footer 合规(8 字段,空值不显示,链接纯手写):
- site.operator_name / site.icp_number / site.icp_license
- site.police_number / site.wenwangwen / site.algorithm_filing
- site.privacy_url / site.terms_url
- 新增 safeHTML 模板函数输出不转义 HTML
This commit is contained in:
2026-06-21 23:50:52 +08:00
parent 0014bdb9ff
commit 1933ea86b4
9 changed files with 271 additions and 28 deletions

View File

@ -38,7 +38,16 @@
</label>
<span class="remember-hint">非共享设备推荐</span>
</div>
{{if .ShowGuidelinesModal}}
<p class="guidelines-link">点击注册即表示同意 <a href="#" id="openGuidelines">《{{.SiteName}} 社区用户准则》</a></p>
{{else}}
<div class="form-group guidelines-checkbox-group">
<label class="guidelines-checkbox-label">
<input type="checkbox" id="guidelinesAgreed">
我已阅读并同意<a href="#" id="openGuidelines">《{{.SiteName}} 社区用户准则》</a>
</label>
</div>
{{end}}
<button type="submit" class="submit-btn" id="submitBtn">注 册</button>
</form>
{{else}}
@ -56,7 +65,7 @@
</main>
<!-- 社区准则模态框 -->
<div class="modal-overlay" id="modalOverlay">
<div class="modal-overlay" id="modalOverlay" data-force-guidelines="{{.ForceGuidelines}}" data-guidelines-timer="{{.GuidelinesTimer}}">
<div class="modal">
<div class="modal-header">
<h3>{{.SiteName}} 社区用户准则</h3>
@ -67,15 +76,21 @@
</div>
<div class="modal-footer">
<div id="modalEnforce">
{{if .ForceGuidelines}}
<div class="timer" id="timer">
<span id="timerLabel">剩余阅读时间</span>
<span class="count" id="timerCount">60</span>
<span class="count" id="timerCount">{{.GuidelinesTimer}}</span>
<span id="timerUnit"></span>
<span id="timerDone" style="display:none">✓ 阅读时间已满足</span>
</div>
<span class="scroll-hint" id="scrollHint">▼ 请滚动至底部完成阅读</span>
{{end}}
</div>
{{if .ForceGuidelines}}
<button class="confirm-btn" id="confirmBtn" disabled>我已完整阅读并同意</button>
{{else}}
<button class="confirm-btn" id="confirmBtn">我已阅读并同意</button>
{{end}}
<button class="confirm-btn" id="previewCloseBtn" style="display:none">关 闭</button>
</div>
</div>

View File

@ -1,6 +1,19 @@
<footer>
<div class="container footer-content">
<p class="copyright">&copy; {{.CopyrightStart}}-{{.CurrentYear}} {{.SiteName}}{{if .Framework}} | {{.Framework}}{{end}}{{if .CanAccessAdmin}} | <a href="/admin">管理面板</a>{{end}}</p>
{{$hasCompliance := or .OperatorName .ICPNumber .ICPLicense .PoliceNumber .WenWangWen .AlgorithmFiling .PrivacyURL .TermsURL}}
{{if $hasCompliance}}
<p class="footer-compliance">
{{if .PrivacyURL}}{{if ne .PrivacyURL ""}}{{safeHTML .PrivacyURL}}{{end}}{{end}}
{{if .TermsURL}}{{if ne .TermsURL ""}} | {{safeHTML .TermsURL}}{{end}}{{end}}
{{if .OperatorName}}{{if ne .OperatorName ""}} | {{.OperatorName}}{{end}}{{end}}
{{if .ICPNumber}}{{if ne .ICPNumber ""}} | {{safeHTML .ICPNumber}}{{end}}{{end}}
{{if .ICPLicense}}{{if ne .ICPLicense ""}} | {{safeHTML .ICPLicense}}{{end}}{{end}}
{{if .PoliceNumber}}{{if ne .PoliceNumber ""}} | {{safeHTML .PoliceNumber}}{{end}}{{end}}
{{if .WenWangWen}}{{if ne .WenWangWen ""}} | {{safeHTML .WenWangWen}}{{end}}{{end}}
{{if .AlgorithmFiling}}{{if ne .AlgorithmFiling ""}} | {{safeHTML .AlgorithmFiling}}{{end}}{{end}}
</p>
{{end}}
</div>
</footer>
<script src="/static/js/common.js?v={{assetV "/static/js/common.js"}}" nonce="{{.CSPNonce}}"></script>