AIDaohang/templates/settings.html
2025-07-06 23:23:23 +08:00

709 lines
40 KiB
HTML

{% extends "base.html" %}
{% block title %}系统设置{% endblock %}
{% block content %}
<div class="card">
<div class="card-body">
<form method="POST" enctype="multipart/form-data" class="needs-validation" novalidate>
<!-- 主题设置 -->
<div class="card mb-4 border-light shadow-sm">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-palette me-2"></i>显示设置</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6 mb-3">
<label for="theme" class="form-label">主题设置</label>
<select name="theme" id="theme" class="form-select" required>
<option value="auto" {% if settings.theme == 'auto' %}selected{% endif %}>自动(跟随系统)</option>
<option value="light" {% if settings.theme == 'light' %}selected{% endif %}>明亮模式</option>
<option value="dark" {% if settings.theme == 'dark' %}selected{% endif %}>暗黑模式</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="card_style" class="form-label">卡片样式</label>
<select name="card_style" id="card_style" class="form-select" required>
<option value="normal" {% if settings.card_style == 'normal' %}selected{% endif %}>正常大小</option>
<option value="compact" {% if settings.card_style == 'compact' %}selected{% endif %}>紧凑模式</option>
</select>
</div>
</div>
</div>
</div>
<!-- 网站标题与Logo -->
<div class="card mb-4 border-light shadow-sm">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-heading me-2"></i>网站标题与Logo</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6 mb-3">
<label for="site_title" class="form-label">网站标题</label>
<input type="text" class="form-control" id="site_title" name="site_title"
value="{{ settings.site_title }}" required>
</div>
<div class="col-md-6 mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="show_logo" name="show_logo"
{% if settings.show_logo %}checked{% endif %}>
<label class="form-check-label" for="show_logo">在标题左侧显示Logo</label>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Logo类型</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="logo_type" id="logo_type_icon"
value="icon" {% if settings.logo_type == 'icon' %}checked{% endif %}>
<label class="form-check-label" for="logo_type_icon">使用图标</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="logo_type" id="logo_type_image"
value="image" {% if settings.logo_type == 'image' %}checked{% endif %}>
<label class="form-check-label" for="logo_type_image">使用图片</label>
</div>
</div>
<!-- 图标选择 -->
<div id="logoIconSection" class="mb-3" style="{% if settings.logo_type != 'icon' %}display:none;{% endif %}">
<label class="form-label">选择图标</label>
<div class="input-group">
<span class="input-group-text"><i class="fas {{ settings.logo_icon }}"></i></span>
<select class="form-select" name="logo_icon" id="logo_icon">
{% for icon, name in icons.items() %}
<option value="{{ icon }}" {% if icon.endswith(settings.logo_icon) %}selected{% endif %}>
{{ name }} ({{ icon }})
</option>
{% endfor %}
</select>
</div>
</div>
<!-- 图片选择 -->
<div id="logoImageSection" style="{% if settings.logo_type != 'image' %}display:none;{% endif %}">
<div class="mb-3">
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="logo_image_type" id="logo_image_none" value="none"
{% if not settings.logo_image %}checked{% endif %}>
<label class="form-check-label" for="logo_image_none">使用默认图片</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="logo_image_type" id="logo_image_existing" value="existing"
{% if settings.logo_image %}checked{% endif %}>
<label class="form-check-label" for="logo_image_existing">选择已上传的Logo</label>
<input type="hidden" name="selected_logo" id="selected_logo" value="{{ settings.logo_image.split('/')[-1] if settings.logo_image else '' }}">
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" data-bs-toggle="modal" data-bs-target="#logoModal">
<i class="fas fa-image me-1"></i>选择Logo
</button>
</div>
</div>
{% if settings.logo_image and settings.logo_type == 'image' %}
<div class="current-logo mt-3">
<p class="mb-1"><strong>当前Logo预览:</strong></p>
<img src="{{ settings.logo_image }}" style="max-width: 100px; max-height: 100px;" class="img-thumbnail">
</div>
{% endif %}
</div>
</div>
</div>
<!-- 明亮模式背景设置 -->
<div class="card mb-4 border-light shadow-sm">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-sun me-2"></i>明亮模式背景</h5>
</div>
<div class="card-body">
<div class="mb-3">
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="bg_type" id="bg_none" value="none"
{% if settings.bg_image == 'none' %}checked{% endif %}>
<label class="form-check-label" for="bg_none">不使用背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="bg_type" id="bg_default" value="default"
{% if settings.bg_image == '/static/background_light.jpg' or (not settings.bg_image or settings.bg_image == '') %}checked{% endif %}>
<label class="form-check-label" for="bg_default">使用默认明亮背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="bg_type" id="bg_existing" value="existing"
{% if settings.bg_image and settings.bg_image != '/static/background_light.jpg' and settings.bg_image != 'none' and not settings.bg_image.endswith('.mp4') %}checked{% endif %}>
<label class="form-check-label" for="bg_existing">选择已上传的背景图片</label>
<input type="hidden" name="selected_bg" id="selected_bg" value="{{ settings.bg_image.split('/')[-1] if settings.bg_image and settings.bg_image != '/static/background_light.jpg' and settings.bg_image != 'none' and not settings.bg_image.endswith('.mp4') else '' }}">
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" data-bs-toggle="modal" data-bs-target="#bgModal">
<i class="fas fa-image me-1"></i>选择背景图片
</button>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="bg_type" id="bg_video" value="video"
{% if settings.bg_image and settings.bg_image.endswith('.mp4') %}checked{% endif %}>
<label class="form-check-label" for="bg_video">选择已上传的背景视频</label>
<input type="hidden" name="selected_video" id="selected_video" value="{{ settings.bg_image.split('/')[-1] if settings.bg_image and settings.bg_image.endswith('.mp4') else '' }}">
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" data-bs-toggle="modal" data-bs-target="#videoModal">
<i class="fas fa-video me-1"></i>选择背景视频
</button>
</div>
</div>
{% if settings.bg_image and settings.bg_image != '/static/background_light.jpg' and settings.bg_image != 'none' %}
<div class="current-bg mt-3">
<p class="mb-1"><strong>当前背景预览:</strong></p>
{% if settings.bg_image.endswith('.mp4') %}
<video width="300" height="150" controls class="img-thumbnail">
<source src="{{ settings.bg_image }}" type="video/mp4">
您的浏览器不支持视频预览
</video>
{% else %}
<img src="{{ settings.bg_image }}" style="max-width: 300px; max-height: 150px;" class="img-thumbnail">
{% endif %}
</div>
{% endif %}
</div>
</div>
<!-- 暗黑模式背景设置 -->
<div class="card mb-4 border-light shadow-sm">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-moon me-2"></i>暗黑模式背景</h5>
</div>
<div class="card-body">
<div class="mb-3">
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="dark_bg_type" id="dark_bg_none" value="none"
{% if settings.dark_bg_image == 'none' %}checked{% endif %}>
<label class="form-check-label" for="dark_bg_none">不使用背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="dark_bg_type" id="dark_bg_default" value="default"
{% if settings.dark_bg_image == '/static/background_dark.jpg' or (not settings.dark_bg_image or settings.dark_bg_image == '') %}checked{% endif %}>
<label class="form-check-label" for="dark_bg_default">使用默认暗黑背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="dark_bg_type" id="dark_bg_existing" value="existing"
{% if settings.dark_bg_image and settings.dark_bg_image != '/static/background_dark.jpg' and settings.dark_bg_image != 'none' and not settings.dark_bg_image.endswith('.mp4') %}checked{% endif %}>
<label class="form-check-label" for="dark_bg_existing">选择已上传的背景图片</label>
<input type="hidden" name="selected_dark_bg" id="selected_dark_bg" value="{{ settings.dark_bg_image.split('/')[-1] if settings.dark_bg_image and settings.dark_bg_image != '/static/background_dark.jpg' and settings.dark_bg_image != 'none' and not settings.dark_bg_image.endswith('.mp4') else '' }}">
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" data-bs-toggle="modal" data-bs-target="#darkBgModal">
<i class="fas fa-image me-1"></i>选择背景图片
</button>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="dark_bg_type" id="dark_bg_video" value="video"
{% if settings.dark_bg_image and settings.dark_bg_image.endswith('.mp4') %}checked{% endif %}>
<label class="form-check-label" for="dark_bg_video">选择已上传的背景视频</label>
<input type="hidden" name="selected_dark_video" id="selected_dark_video" value="{{ settings.dark_bg_image.split('/')[-1] if settings.dark_bg_image and settings.dark_bg_image.endswith('.mp4') else '' }}">
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" data-bs-toggle="modal" data-bs-target="#darkVideoModal">
<i class="fas fa-video me-1"></i>选择背景视频
</button>
</div>
</div>
{% if settings.dark_bg_image and settings.dark_bg_image != '/static/background_dark.jpg' and settings.dark_bg_image != 'none' %}
<div class="current-bg mt-3">
<p class="mb-1"><strong>当前背景预览:</strong></p>
{% if settings.dark_bg_image.endswith('.mp4') %}
<video width="300" height="150" controls class="img-thumbnail">
<source src="{{ settings.dark_bg_image }}" type="video/mp4">
您的浏览器不支持视频预览
</video>
{% else %}
<img src="{{ settings.dark_bg_image }}" style="max-width: 300px; max-height: 150px;" class="img-thumbnail">
{% endif %}
</div>
{% endif %}
</div>
</div>
<div class="card mb-4 border-light shadow-sm">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-user me-2"></i>游客设置</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6 mb-3">
<label for="guest_theme" class="form-label">游客默认主题</label>
<select name="guest_theme" id="guest_theme" class="form-select">
<option value="auto" {% if guest_settings.theme == 'auto' %}selected{% endif %}>自动(跟随系统)</option>
<option value="light" {% if guest_settings.theme == 'light' %}selected{% endif %}>明亮模式</option>
<option value="dark" {% if guest_settings.theme == 'dark' %}selected{% endif %}>暗黑模式</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="guest_card_style" class="form-label">游客卡片样式</label>
<select name="guest_card_style" id="guest_card_style" class="form-select">
<option value="normal" {% if guest_settings.card_style == 'normal' %}selected{% endif %}>正常大小</option>
<option value="compact" {% if guest_settings.card_style == 'compact' %}selected{% endif %}>紧凑模式</option>
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label">游客明亮模式背景</label>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="guest_bg_type" id="guest_bg_none" value="none"
{% if guest_settings.bg_image == 'none' %}checked{% endif %}>
<label class="form-check-label" for="guest_bg_none">无背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="guest_bg_type" id="guest_bg_default" value="default"
{% if guest_settings.bg_image == '/static/background_light.jpg' %}checked{% endif %}>
<label class="form-check-label" for="guest_bg_default">默认背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="guest_bg_type" id="guest_bg_system" value="system"
{% if guest_settings.bg_image not in ['none', '/static/background_light.jpg'] %}checked{% endif %}>
<label class="form-check-label" for="guest_bg_system">使用系统设置背景</label>
</div>
</div>
<div class="mb-3">
<label class="form-label">游客暗黑模式背景</label>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="guest_dark_bg_type" id="guest_dark_bg_none" value="none"
{% if guest_settings.dark_bg_image == 'none' %}checked{% endif %}>
<label class="form-check-label" for="guest_dark_bg_none">无背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="guest_dark_bg_type" id="guest_dark_bg_default" value="default"
{% if guest_settings.dark_bg_image == '/static/background_dark.jpg' %}checked{% endif %}>
<label class="form-check-label" for="guest_dark_bg_default">默认背景</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" name="guest_dark_bg_type" id="guest_dark_bg_system" value="system"
{% if guest_settings.dark_bg_image not in ['none', '/static/background_dark.jpg'] %}checked{% endif %}>
<label class="form-check-label" for="guest_dark_bg_system">使用系统设置背景</label>
</div>
</div>
</div>
</div>
<!-- 修改密码 -->
<div class="card mb-4 border-light shadow-sm">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="fas fa-lock me-2"></i>安全设置</h5>
</div>
<div class="card-body">
<div class="card border-warning">
<div class="card-header bg-warning text-dark">
<i class="fas fa-key me-2"></i>修改管理员密码
</div>
<div class="card-body">
<div class="mb-3">
<label for="old_password" class="form-label">当前密码</label>
<input type="password" class="form-control" id="old_password" name="old_password">
</div>
<div class="mb-3">
<label for="new_password" class="form-label">新密码</label>
<input type="password" class="form-control" id="new_password" name="new_password">
</div>
<div class="mb-3">
<label for="confirm_password" class="form-label">确认新密码</label>
<input type="password" class="form-control" id="confirm_password" name="confirm_password">
</div>
<div class="alert alert-info mb-0">
<i class="fas fa-info-circle me-2"></i>如果不修改密码,请留空这些字段
</div>
</div>
</div>
</div>
</div>
<div class="d-flex justify-content-between mt-4">
<a href="{{ url_for('index') }}" class="btn btn-secondary">
<i class="fas fa-arrow-left me-2"></i>返回首页
</a>
<button type="submit" class="btn btn-primary">
<i class="fas fa-save me-2"></i>保存设置
</button>
</div>
</form>
</div>
</div>
<!-- Logo选择模态框 -->
<div class="modal fade" id="logoModal" tabindex="-1" aria-labelledby="logoModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="logoModalLabel">选择Logo</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
{% for attachment in attachments if attachment.type == 'logo' %}
<div class="col-md-3 mb-3">
<div class="card h-100 cursor-pointer" onclick="selectLogo('{{ attachment.filename }}')">
<img src="{{ url_for('uploaded_logo', filename=attachment.filename) }}"
class="card-img-top img-thumbnail"
style="height: 100px; object-fit: contain;">
</div>
</div>
{% endfor %}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<!-- 明亮模式背景图片选择模态框 -->
<div class="modal fade" id="bgModal" tabindex="-1" aria-labelledby="bgModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="bgModalLabel">选择明亮模式背景图片</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
{% for attachment in attachments if attachment.type == 'background' %}
<div class="col-md-4 mb-3">
<div class="card h-100 cursor-pointer" onclick="selectBg('{{ attachment.filename }}')">
<img src="{{ url_for('uploaded_background', filename=attachment.filename) }}"
class="card-img-top img-thumbnail"
style="height: 150px; object-fit: cover;">
</div>
</div>
{% endfor %}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<!-- 明亮模式背景视频选择模态框 -->
<div class="modal fade" id="videoModal" tabindex="-1" aria-labelledby="videoModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="videoModalLabel">选择明亮模式背景视频</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
{% for attachment in attachments if attachment.type == 'video' %}
<div class="col-md-6 mb-3">
<div class="card h-100 cursor-pointer" onclick="selectVideo('{{ attachment.filename }}')">
<video class="card-img-top img-thumbnail" style="height: 150px; object-fit: cover;" muted>
<source src="{{ url_for('uploaded_video', filename=attachment.filename) }}" type="video/mp4">
</video>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<!-- 暗黑模式背景图片选择模态框 -->
<div class="modal fade" id="darkBgModal" tabindex="-1" aria-labelledby="darkBgModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="darkBgModalLabel">选择暗黑模式背景图片</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
{% for attachment in attachments if attachment.type == 'background' %}
<div class="col-md-4 mb-3">
<div class="card h-100 cursor-pointer" onclick="selectDarkBg('{{ attachment.filename }}')">
<img src="{{ url_for('uploaded_background', filename=attachment.filename) }}"
class="card-img-top img-thumbnail"
style="height: 150px; object-fit: cover;">
</div>
</div>
{% endfor %}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<!-- 暗黑模式背景视频选择模态框 -->
<div class="modal fade" id="darkVideoModal" tabindex="-1" aria-labelledby="darkVideoModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="darkVideoModalLabel">选择暗黑模式背景视频</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
{% for attachment in attachments if attachment.type == 'video' %}
<div class="col-md-6 mb-3">
<div class="card h-100 cursor-pointer" onclick="selectDarkVideo('{{ attachment.filename }}')">
<video class="card-img-top img-thumbnail" style="height: 150px; object-fit: cover;" muted>
<source src="{{ url_for('uploaded_video', filename=attachment.filename) }}" type="video/mp4">
</video>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<script>
// 全局选择函数
function selectLogo(filename) {
document.getElementById('selected_logo').value = filename;
document.getElementById('logo_image_existing').checked = true;
document.getElementById('logo_image_none').checked = false;
// 更新预览
const previewContainer = document.querySelector('.current-logo');
if (!previewContainer) {
// 如果预览容器不存在,创建一个
const logoImageSection = document.getElementById('logoImageSection');
const previewDiv = document.createElement('div');
previewDiv.className = 'current-logo mt-3';
previewDiv.innerHTML = `
<p class="mb-1"><strong>当前Logo预览:</strong></p>
<img src="/upload/logo/${filename}" style="max-width: 100px; max-height: 100px;" class="img-thumbnail">
`;
logoImageSection.appendChild(previewDiv);
} else {
// 更新现有预览
previewContainer.querySelector('img').src = `/upload/logo/${filename}`;
}
// 使用原生 JavaScript 关闭模态框
const logoModal = bootstrap.Modal.getInstance(document.getElementById('logoModal'));
logoModal.hide();
}
function selectBg(filename) {
document.getElementById('selected_bg').value = filename;
document.getElementById('bg_existing').checked = true;
document.getElementById('bg_none').checked = false;
document.getElementById('bg_default').checked = false;
document.getElementById('bg_video').checked = false;
// 更新预览
const previewContainer = document.querySelector('.current-bg');
if (!previewContainer) {
const bgSection = document.querySelector('input[name="bg_type"]').closest('.card');
const previewDiv = document.createElement('div');
previewDiv.className = 'current-bg mt-3';
previewDiv.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<img src="/upload/background/${filename}" style="max-width: 300px; max-height: 150px;" class="img-thumbnail">
`;
bgSection.querySelector('.card-body').appendChild(previewDiv);
} else {
previewContainer.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<img src="/upload/background/${filename}" style="max-width: 300px; max-height: 150px;" class="img-thumbnail">
`;
}
const bgModal = bootstrap.Modal.getInstance(document.getElementById('bgModal'));
bgModal.hide();
}
function selectVideo(filename) {
document.getElementById('selected_video').value = filename;
document.getElementById('bg_video').checked = true;
document.getElementById('bg_none').checked = false;
document.getElementById('bg_default').checked = false;
document.getElementById('bg_existing').checked = false;
// 更新预览
const previewContainer = document.querySelector('.current-bg');
if (!previewContainer) {
const bgSection = document.querySelector('input[name="bg_type"]').closest('.card');
const previewDiv = document.createElement('div');
previewDiv.className = 'current-bg mt-3';
previewDiv.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<video width="300" height="150" controls class="img-thumbnail">
<source src="/upload/video/${filename}" type="video/mp4">
您的浏览器不支持视频预览
</video>
`;
bgSection.querySelector('.card-body').appendChild(previewDiv);
} else {
previewContainer.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<video width="300" height="150" controls class="img-thumbnail">
<source src="/upload/video/${filename}" type="video/mp4">
您的浏览器不支持视频预览
</video>
`;
}
const videoModal = bootstrap.Modal.getInstance(document.getElementById('videoModal'));
videoModal.hide();
}
function selectDarkBg(filename) {
document.getElementById('selected_dark_bg').value = filename;
document.getElementById('dark_bg_existing').checked = true;
document.getElementById('dark_bg_none').checked = false;
document.getElementById('dark_bg_default').checked = false;
document.getElementById('dark_bg_video').checked = false;
const previewContainer = document.querySelectorAll('.current-bg')[1];
if (!previewContainer) {
const darkBgSection = document.querySelector('input[name="dark_bg_type"]').closest('.card');
const previewDiv = document.createElement('div');
previewDiv.className = 'current-bg mt-3';
previewDiv.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<img src="/upload/background/${filename}" style="max-width: 300px; max-height: 150px;" class="img-thumbnail">
`;
darkBgSection.querySelector('.card-body').appendChild(previewDiv);
} else {
previewContainer.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<img src="/upload/background/${filename}" style="max-width: 300px; max-height: 150px;" class="img-thumbnail">
`;
}
const darkBgModal = bootstrap.Modal.getInstance(document.getElementById('darkBgModal'));
darkBgModal.hide();
}
function selectDarkVideo(filename) {
document.getElementById('selected_dark_video').value = filename;
document.getElementById('dark_bg_video').checked = true;
document.getElementById('dark_bg_none').checked = false;
document.getElementById('dark_bg_default').checked = false;
document.getElementById('dark_bg_existing').checked = false;
const previewContainer = document.querySelectorAll('.current-bg')[1];
if (!previewContainer) {
const darkBgSection = document.querySelector('input[name="dark_bg_type"]').closest('.card');
const previewDiv = document.createElement('div');
previewDiv.className = 'current-bg mt-3';
previewDiv.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<video width="300" height="150" controls class="img-thumbnail">
<source src="/upload/video/${filename}" type="video/mp4">
您的浏览器不支持视频预览
</video>
`;
darkBgSection.querySelector('.card-body').appendChild(previewDiv);
} else {
previewContainer.innerHTML = `
<p class="mb-1"><strong>当前背景预览:</strong></p>
<video width="300" height="150" controls class="img-thumbnail">
<source src="/upload/video/${filename}" type="video/mp4">
您的浏览器不支持视频预览
</video>
`;
}
const darkVideoModal = bootstrap.Modal.getInstance(document.getElementById('darkVideoModal'));
darkVideoModal.hide();
}
document.addEventListener('DOMContentLoaded', function() {
// 明亮模式背景
const bgRadios = document.querySelectorAll('input[name="bg_type"]');
bgRadios.forEach(radio => {
radio.addEventListener('change', function() {
document.getElementById('selected_bg').disabled = this.value !== 'existing';
document.getElementById('selected_video').disabled = this.value !== 'video';
});
});
// 暗黑模式背景
const darkBgRadios = document.querySelectorAll('input[name="dark_bg_type"]');
darkBgRadios.forEach(radio => {
radio.addEventListener('change', function() {
document.getElementById('selected_dark_bg').disabled = this.value !== 'existing';
document.getElementById('selected_dark_video').disabled = this.value !== 'video';
});
});
// Logo图片类型
const logoImageRadios = document.querySelectorAll('input[name="logo_image_type"]');
logoImageRadios.forEach(radio => {
radio.addEventListener('change', function() {
document.getElementById('selected_logo').disabled = this.value !== 'existing';
});
});
// 动态显示/隐藏logo设置部分
document.querySelectorAll('input[name="logo_type"]').forEach(radio => {
radio.addEventListener('change', function() {
document.getElementById('logoIconSection').style.display = this.value === 'icon' ? 'block' : 'none';
document.getElementById('logoImageSection').style.display = this.value === 'image' ? 'block' : 'none';
});
});
// 表单验证
const forms = document.querySelectorAll('.needs-validation');
forms.forEach(form => {
form.addEventListener('submit', function(event) {
if (!form.checkValidity()) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
});
</script>
<style>
.card-header {
font-weight: 600;
}
.form-check-label {
font-weight: 500;
}
.current-bg img, .current-logo img, .current-bg video {
border: 2px solid #dee2e6;
}
.img-thumbnail {
background-color: #f8f9fa;
}
.cursor-pointer {
cursor: pointer;
}
.cursor-pointer:hover {
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
transform: translateY(-2px);
transition: all 0.2s ease-in-out;
}
.card .card-header {
border-bottom: 1px solid rgba(0,0,0,.125);
}
.card .card-body {
padding: 1.5rem;
}
.card .card-header.bg-light {
background-color: #abcbeb !important;
}
.card .card-header h5 {
font-size: 1.1rem;
color: #495057;
}
.card.mb-4 {
margin-bottom: 1.5rem!important;
}
</style>
{% endblock %}