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

@ -61,6 +61,93 @@
</div>
</div>
<!-- 合规信息 -->
<div class="settings-section">
<div class="section-title">合规信息</div>
<div class="section-body">
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">运营主体</span>
<span class="setting-desc">页脚展示的运营方名称</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-operator" class="setting-input" placeholder="留空则不显示" value="{{.OperatorName}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.operator_name" data-input="setting-site-operator">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">隐私政策</span>
<span class="setting-desc">纯手写 HTML&lt;a href="/privacy"&gt;隐私政策&lt;/a&gt;</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-privacy" class="setting-input" placeholder="留空则不显示" value="{{.PrivacyURL}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.privacy_url" data-input="setting-site-privacy">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">服务条款</span>
<span class="setting-desc">纯手写 HTML&lt;a href="/terms"&gt;服务条款&lt;/a&gt;</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-terms" class="setting-input" placeholder="留空则不显示" value="{{.TermsURL}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.terms_url" data-input="setting-site-terms">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">ICP 备案</span>
<span class="setting-desc">纯手写 HTML&lt;a href="https://beian.miit.gov.cn"&gt;京ICP备XXXX号&lt;/a&gt;</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-icp" class="setting-input" placeholder="留空则不显示" value="{{.ICPNumber}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.icp_number" data-input="setting-site-icp">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">ICP 经营许可证</span>
<span class="setting-desc">纯手写 HTML留空则不显示</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-icp-license" class="setting-input" placeholder="留空则不显示" value="{{.ICPLicense}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.icp_license" data-input="setting-site-icp-license">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">公安备案</span>
<span class="setting-desc">纯手写 HTML留空则不显示</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-police" class="setting-input" placeholder="留空则不显示" value="{{.PoliceNumber}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.police_number" data-input="setting-site-police">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">文网文</span>
<span class="setting-desc">纯手写 HTML留空则不显示</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-wenwangwen" class="setting-input" placeholder="留空则不显示" value="{{.WenWangWen}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.wenwangwen" data-input="setting-site-wenwangwen">保存</button>
</div>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">算法备案</span>
<span class="setting-desc">纯手写 HTML留空则不显示</span>
</div>
<div class="setting-input-wrap">
<input type="text" id="setting-site-algorithm-filing" class="setting-input" placeholder="留空则不显示" value="{{.AlgorithmFiling}}">
<button class="btn btn-sm btn-primary btn-save" data-key="site.algorithm_filing" data-input="setting-site-algorithm-filing">保存</button>
</div>
</div>
</div>
</div>
<!-- 维护设置 -->
<div class="settings-section">
<div class="section-title">维护设置</div>
@ -92,6 +179,36 @@
<span class="toggle-slider"></span>
</label>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">弹窗显示准则</span>
<span class="setting-desc">注册时弹窗展示社区准则(关闭后仅显示复选框)</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="registration-show-guidelines" data-key="registration.show_guidelines">
<span class="toggle-slider"></span>
</label>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">强制阅读准则</span>
<span class="setting-desc">弹窗模式下要求倒计时+滚动到底部(关闭后弹窗可直接确认)</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="registration-force-guidelines" data-key="registration.force_guidelines">
<span class="toggle-slider"></span>
</label>
</div>
<div class="setting-item">
<div class="setting-info">
<span class="setting-label">阅读倒计时</span>
<span class="setting-desc">强制阅读时的倒计时秒数</span>
</div>
<div class="setting-input-wrap">
<input type="number" id="setting-guidelines-timer" class="setting-input" placeholder="60" min="1" style="width:100px" value="{{.GuidelinesTimer}}">
<button class="btn btn-sm btn-primary btn-save" data-key="registration.guidelines_timer" data-input="setting-guidelines-timer">保存</button>
</div>
</div>
</div>
</div>