mirror of
https://gitee.com/myxzgzs/boyuehasfj-vue3-html.git
synced 2025-08-08 07:02:42 +08:00
801 lines
22 KiB
Vue
801 lines
22 KiB
Vue
![]() |
<script setup lang="ts">
|
||
|
import { ref, onMounted, computed } from 'vue';
|
||
|
import { getPageList, getBaseUrl } from '../services/api';
|
||
|
import QRCodeDisplay from '../components/QRCodeDisplay.vue';
|
||
|
import TheNavbar from '../components/TheNavbar.vue';
|
||
|
import SearchBar from '../components/SearchBar.vue';
|
||
|
|
||
|
interface PageItem {
|
||
|
id: number;
|
||
|
formatId: string;
|
||
|
title: string;
|
||
|
content: string;
|
||
|
pageType: string;
|
||
|
pageUrl: string;
|
||
|
createTime: string;
|
||
|
updateTime: string;
|
||
|
status: number;
|
||
|
sortOrder: number;
|
||
|
viewCount: number;
|
||
|
author?: string;
|
||
|
keywords?: string;
|
||
|
description?: string;
|
||
|
attachmentUrl?: string;
|
||
|
}
|
||
|
|
||
|
// 移除默认数据,只使用后端提供的真实数据
|
||
|
const lawList = ref<PageItem[]>([]);
|
||
|
const caseList = ref<PageItem[]>([]);
|
||
|
const formList = ref<PageItem[]>([]);
|
||
|
const loading = ref({
|
||
|
law: true,
|
||
|
case: true,
|
||
|
form: true
|
||
|
});
|
||
|
|
||
|
// 根据不同类型构建不同的URL
|
||
|
const buildQRCodeUrl = (id: string, type: string): string => {
|
||
|
const baseUrl = getBaseUrl();
|
||
|
let path = '';
|
||
|
|
||
|
if (type === 'law') {
|
||
|
path = `/show.html?Id=${id}`;
|
||
|
} else if (type === 'case') {
|
||
|
path = `/showcase.html?Id=${id}`;
|
||
|
} else if (type === 'form') {
|
||
|
path = `/table.html?Id=${id}`;
|
||
|
} else {
|
||
|
path = `/show.html?Id=${id}`;
|
||
|
}
|
||
|
|
||
|
return `${baseUrl}${path}`;
|
||
|
};
|
||
|
|
||
|
// 预设的二维码链接
|
||
|
const qrCodeLinks = {
|
||
|
law: [
|
||
|
{ id: '000001', title: '法律规定1', url: buildQRCodeUrl('000001', 'law') },
|
||
|
{ id: '000002', title: '法律规定2', url: buildQRCodeUrl('000002', 'law') },
|
||
|
{ id: '000003', title: '法律规定3', url: buildQRCodeUrl('000003', 'law') },
|
||
|
],
|
||
|
case: [
|
||
|
{ id: '000001', title: '典型案例1', url: buildQRCodeUrl('000001', 'case') },
|
||
|
{ id: '000002', title: '典型案例2', url: buildQRCodeUrl('000002', 'case') },
|
||
|
{ id: '000003', title: '典型案例3', url: buildQRCodeUrl('000003', 'case') },
|
||
|
],
|
||
|
form: [
|
||
|
{ id: '000001', title: '表单下载1', url: buildQRCodeUrl('000001', 'form') },
|
||
|
{ id: '000002', title: '表单下载2', url: buildQRCodeUrl('000002', 'form') },
|
||
|
{ id: '000003', title: '表单下载3', url: buildQRCodeUrl('000003', 'form') },
|
||
|
]
|
||
|
};
|
||
|
|
||
|
// 格式化日期,处理无效日期情况
|
||
|
const formatDate = (dateStr: string | null | undefined): string => {
|
||
|
if (!dateStr) return '--/--';
|
||
|
try {
|
||
|
const date = new Date(dateStr);
|
||
|
// 检查日期是否有效
|
||
|
if (isNaN(date.getTime())) {
|
||
|
return '--/--';
|
||
|
}
|
||
|
return `${date.getMonth() + 1}/${date.getDate()}`;
|
||
|
} catch (e) {
|
||
|
console.error('日期格式化错误:', e);
|
||
|
return '--/--';
|
||
|
}
|
||
|
};
|
||
|
|
||
|
onMounted(async () => {
|
||
|
// 获取法律规定列表
|
||
|
try {
|
||
|
console.log("开始请求法律规定列表...");
|
||
|
const result = await getPageList('law', 1, 6);
|
||
|
console.log("法律规定列表请求结果:", result);
|
||
|
|
||
|
// 详细检查返回数据
|
||
|
if (!result) {
|
||
|
console.error("法律规定请求结果为空");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
console.log("法律规定返回数据类型:", typeof result);
|
||
|
console.log("法律规定返回数据结构:", Object.keys(result));
|
||
|
|
||
|
if (result && result.code === 200) {
|
||
|
if (Array.isArray(result.rows) && result.rows.length > 0) {
|
||
|
lawList.value = result.rows;
|
||
|
console.log("成功获取法律规定数据:", lawList.value);
|
||
|
} else {
|
||
|
console.warn("法律规定数据为空或格式不正确:", result);
|
||
|
console.warn("rows是否为数组:", Array.isArray(result.rows));
|
||
|
console.warn("rows长度:", result.rows ? result.rows.length : 0);
|
||
|
|
||
|
// 尝试从其他字段获取数据
|
||
|
if (result.data && Array.isArray(result.data)) {
|
||
|
lawList.value = result.data;
|
||
|
console.log("从data字段获取法律规定数据:", lawList.value);
|
||
|
} else if (result.list && Array.isArray(result.list)) {
|
||
|
lawList.value = result.list;
|
||
|
console.log("从list字段获取法律规定数据:", lawList.value);
|
||
|
} else if (Array.isArray(result)) {
|
||
|
lawList.value = result;
|
||
|
console.log("直接使用结果数组作为法律规定数据:", lawList.value);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
console.error("请求法律规定列表失败:", result?.msg || "未知错误");
|
||
|
}
|
||
|
} catch (error) {
|
||
|
console.error('获取法律规定列表失败:', error);
|
||
|
} finally {
|
||
|
loading.value.law = false;
|
||
|
}
|
||
|
|
||
|
// 获取典型案例列表
|
||
|
try {
|
||
|
console.log("开始请求典型案例列表...");
|
||
|
const result = await getPageList('case', 1, 6);
|
||
|
console.log("典型案例列表请求结果:", result);
|
||
|
|
||
|
// 详细检查返回数据
|
||
|
if (!result) {
|
||
|
console.error("典型案例请求结果为空");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
console.log("典型案例返回数据类型:", typeof result);
|
||
|
console.log("典型案例返回数据结构:", Object.keys(result));
|
||
|
|
||
|
if (result && result.code === 200) {
|
||
|
if (Array.isArray(result.rows) && result.rows.length > 0) {
|
||
|
caseList.value = result.rows;
|
||
|
console.log("成功获取典型案例数据:", caseList.value);
|
||
|
} else {
|
||
|
console.warn("典型案例数据为空或格式不正确:", result);
|
||
|
console.warn("rows是否为数组:", Array.isArray(result.rows));
|
||
|
console.warn("rows长度:", result.rows ? result.rows.length : 0);
|
||
|
|
||
|
// 尝试从其他字段获取数据
|
||
|
if (result.data && Array.isArray(result.data)) {
|
||
|
caseList.value = result.data;
|
||
|
console.log("从data字段获取典型案例数据:", caseList.value);
|
||
|
} else if (result.list && Array.isArray(result.list)) {
|
||
|
caseList.value = result.list;
|
||
|
console.log("从list字段获取典型案例数据:", caseList.value);
|
||
|
} else if (Array.isArray(result)) {
|
||
|
caseList.value = result;
|
||
|
console.log("直接使用结果数组作为典型案例数据:", caseList.value);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
console.error("请求典型案例列表失败:", result?.msg || "未知错误");
|
||
|
}
|
||
|
} catch (error) {
|
||
|
console.error('获取典型案例列表失败:', error);
|
||
|
} finally {
|
||
|
loading.value.case = false;
|
||
|
}
|
||
|
|
||
|
// 获取表单下载列表
|
||
|
try {
|
||
|
console.log("开始请求表单下载列表...");
|
||
|
const result = await getPageList('form', 1, 6);
|
||
|
console.log("表单下载列表请求结果:", result);
|
||
|
|
||
|
// 详细检查返回数据
|
||
|
if (!result) {
|
||
|
console.error("表单下载请求结果为空");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
console.log("表单下载返回数据类型:", typeof result);
|
||
|
console.log("表单下载返回数据结构:", Object.keys(result));
|
||
|
|
||
|
if (result && result.code === 200) {
|
||
|
if (Array.isArray(result.rows) && result.rows.length > 0) {
|
||
|
formList.value = result.rows;
|
||
|
console.log("成功获取表单下载数据:", formList.value);
|
||
|
} else {
|
||
|
console.warn("表单下载数据为空或格式不正确:", result);
|
||
|
console.warn("rows是否为数组:", Array.isArray(result.rows));
|
||
|
console.warn("rows长度:", result.rows ? result.rows.length : 0);
|
||
|
|
||
|
// 尝试从其他字段获取数据
|
||
|
if (result.data && Array.isArray(result.data)) {
|
||
|
formList.value = result.data;
|
||
|
console.log("从data字段获取表单下载数据:", formList.value);
|
||
|
} else if (result.list && Array.isArray(result.list)) {
|
||
|
formList.value = result.list;
|
||
|
console.log("从list字段获取表单下载数据:", formList.value);
|
||
|
} else if (Array.isArray(result)) {
|
||
|
formList.value = result;
|
||
|
console.log("直接使用结果数组作为表单下载数据:", formList.value);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
console.error("请求表单下载列表失败:", result?.msg || "未知错误");
|
||
|
}
|
||
|
} catch (error) {
|
||
|
console.error('获取表单下载列表失败:', error);
|
||
|
} finally {
|
||
|
loading.value.form = false;
|
||
|
}
|
||
|
|
||
|
// 更新二维码链接,使用实际数据
|
||
|
try {
|
||
|
if (lawList.value.length > 0) {
|
||
|
qrCodeLinks.law = lawList.value.slice(0, 3).map(item => ({
|
||
|
id: item.formatId,
|
||
|
title: item.title,
|
||
|
url: buildQRCodeUrl(item.formatId, 'law')
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
if (caseList.value.length > 0) {
|
||
|
qrCodeLinks.case = caseList.value.slice(0, 3).map(item => ({
|
||
|
id: item.formatId,
|
||
|
title: item.title,
|
||
|
url: buildQRCodeUrl(item.formatId, 'case')
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
if (formList.value.length > 0) {
|
||
|
qrCodeLinks.form = formList.value.slice(0, 3).map(item => ({
|
||
|
id: item.formatId,
|
||
|
title: item.title,
|
||
|
url: buildQRCodeUrl(item.formatId, 'form')
|
||
|
}));
|
||
|
}
|
||
|
console.log("二维码链接已更新:", qrCodeLinks);
|
||
|
} catch (error) {
|
||
|
console.error('更新二维码链接失败:', error);
|
||
|
}
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
<template>
|
||
|
<div class="home">
|
||
|
<TheNavbar />
|
||
|
|
||
|
<header class="header">
|
||
|
<div class="container">
|
||
|
<h1>淮安市司法局百问百答</h1>
|
||
|
<p class="subtitle">法律法规、典型案例、表单下载</p>
|
||
|
</div>
|
||
|
</header>
|
||
|
|
||
|
<div class="container main-container">
|
||
|
<!-- 主要内容区域 -->
|
||
|
<div class="content-row">
|
||
|
<!-- 法律规定区块 -->
|
||
|
<div class="content-card">
|
||
|
<div class="card-header">
|
||
|
<h2><i class="card-icon law-icon"></i>法律规定</h2>
|
||
|
<router-link to="/hasfjlaw" class="view-more">查看更多</router-link>
|
||
|
</div>
|
||
|
<div v-if="loading.law" class="loading">
|
||
|
<div class="spinner"></div>
|
||
|
<span>加载中...</span>
|
||
|
</div>
|
||
|
<div v-else-if="lawList.length === 0" class="empty">暂无法律规定</div>
|
||
|
<ul v-else class="content-list">
|
||
|
<li v-for="item in lawList.slice(0, 6)" :key="item.formatId">
|
||
|
<router-link :to="`/show.html?Id=${item.formatId}`" class="list-item-link">
|
||
|
<span class="item-dot"></span>
|
||
|
{{ item.title }}
|
||
|
</router-link>
|
||
|
<span class="date">{{ formatDate(item.createTime) }}</span>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
|
||
|
<!-- 典型案例区块 -->
|
||
|
<div class="content-card">
|
||
|
<div class="card-header">
|
||
|
<h2><i class="card-icon case-icon"></i>典型案例</h2>
|
||
|
<router-link to="/hasfjcase" class="view-more">查看更多</router-link>
|
||
|
</div>
|
||
|
<div v-if="loading.case" class="loading">
|
||
|
<div class="spinner"></div>
|
||
|
<span>加载中...</span>
|
||
|
</div>
|
||
|
<div v-else-if="caseList.length === 0" class="empty">暂无典型案例</div>
|
||
|
<ul v-else class="content-list">
|
||
|
<li v-for="item in caseList.slice(0, 6)" :key="item.formatId">
|
||
|
<router-link :to="`/showcase.html?Id=${item.formatId}`" class="list-item-link">
|
||
|
<span class="item-dot"></span>
|
||
|
{{ item.title }}
|
||
|
</router-link>
|
||
|
<span class="date">{{ formatDate(item.createTime) }}</span>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
|
||
|
<!-- 表单下载区块 -->
|
||
|
<div class="content-card">
|
||
|
<div class="card-header">
|
||
|
<h2><i class="card-icon form-icon"></i>表单下载</h2>
|
||
|
<router-link to="/hasfjform" class="view-more">查看更多</router-link>
|
||
|
</div>
|
||
|
<div v-if="loading.form" class="loading">
|
||
|
<div class="spinner"></div>
|
||
|
<span>加载中...</span>
|
||
|
</div>
|
||
|
<div v-else-if="formList.length === 0" class="empty">暂无表单</div>
|
||
|
<ul v-else class="content-list">
|
||
|
<li v-for="item in formList.slice(0, 6)" :key="item.formatId">
|
||
|
<router-link :to="`/table.html?Id=${item.formatId}`" class="list-item-link">
|
||
|
<span class="item-dot"></span>
|
||
|
{{ item.title }}
|
||
|
</router-link>
|
||
|
<span class="date">{{ formatDate(item.createTime) }}</span>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<!-- 二维码区域 -->
|
||
|
<div class="qrcode-section">
|
||
|
<div class="section-header">
|
||
|
<h2><i class="section-icon qrcode-icon"></i>二维码入口</h2>
|
||
|
<router-link to="/qrcodes" class="view-more">查看更多</router-link>
|
||
|
</div>
|
||
|
<div class="qrcode-list">
|
||
|
<!-- 法律规定二维码 -->
|
||
|
<div class="qrcode-group">
|
||
|
<h3>法律规定</h3>
|
||
|
<div class="qrcode-container">
|
||
|
<QRCodeDisplay
|
||
|
v-for="item in qrCodeLinks.law"
|
||
|
:key="item.id"
|
||
|
:url="item.url"
|
||
|
:title="item.title"
|
||
|
:id="item.id"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<!-- 典型案例二维码 -->
|
||
|
<div class="qrcode-group">
|
||
|
<h3>典型案例</h3>
|
||
|
<div class="qrcode-container">
|
||
|
<QRCodeDisplay
|
||
|
v-for="item in qrCodeLinks.case"
|
||
|
:key="item.id"
|
||
|
:url="item.url"
|
||
|
:title="item.title"
|
||
|
:id="item.id"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<!-- 表单下载二维码 -->
|
||
|
<div class="qrcode-group">
|
||
|
<h3>表单下载</h3>
|
||
|
<div class="qrcode-container">
|
||
|
<QRCodeDisplay
|
||
|
v-for="item in qrCodeLinks.form"
|
||
|
:key="item.id"
|
||
|
:url="item.url"
|
||
|
:title="item.title"
|
||
|
:id="item.id"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<footer class="footer">
|
||
|
<div class="container">
|
||
|
<p>© 2025 博越科技. 版权所有.</p>
|
||
|
</div>
|
||
|
</footer>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<style scoped>
|
||
|
.home {
|
||
|
min-height: 100vh;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
html, body {
|
||
|
overflow-y: auto !important;
|
||
|
height: auto !important;
|
||
|
position: static !important;
|
||
|
}
|
||
|
|
||
|
.header {
|
||
|
background-color: var(--color-primary);
|
||
|
color: white;
|
||
|
padding: 3rem 0;
|
||
|
text-align: center;
|
||
|
margin-bottom: 0;
|
||
|
position: relative;
|
||
|
overflow: hidden;
|
||
|
background-image: linear-gradient(135deg, #0072ff 0%, #00c6ff 100%);
|
||
|
width: 100%;
|
||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
||
|
}
|
||
|
|
||
|
.header::before {
|
||
|
content: '';
|
||
|
position: absolute;
|
||
|
top: 0;
|
||
|
left: 0;
|
||
|
right: 0;
|
||
|
bottom: 0;
|
||
|
background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjxkZWZzPjxwYXR0ZXJuIGlkPSJwYXR0ZXJuIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSkiPjxyZWN0IGlkPSJwYXR0ZXJuLWJhY2tncm91bmQiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InRyYW5zcGFyZW50Ij48L3JlY3Q+PHBhdGggZD0iTSAwIDAgTCAxMCAwIiBzdHJva2U9IiNmZmZmZmYxMCIgc3Ryb2tlLXdpZHRoPSIxIj48L3BhdGg+PC9wYXR0ZXJuPjwvZGVmcz48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI3BhdHRlcm4pIj48L3JlY3Q+PC9zdmc+');
|
||
|
opacity: 0.4;
|
||
|
z-index: 1;
|
||
|
}
|
||
|
|
||
|
.header .container {
|
||
|
position: relative;
|
||
|
z-index: 2;
|
||
|
max-width: 1200px;
|
||
|
padding: 0 2rem;
|
||
|
margin: 0 auto;
|
||
|
}
|
||
|
|
||
|
.header h1 {
|
||
|
font-size: 2.6rem;
|
||
|
margin-bottom: 1rem;
|
||
|
font-weight: 700;
|
||
|
letter-spacing: 1px;
|
||
|
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||
|
}
|
||
|
|
||
|
.subtitle {
|
||
|
font-size: 1.5rem;
|
||
|
opacity: 0.9;
|
||
|
max-width: 700px;
|
||
|
margin: 0 auto;
|
||
|
line-height: 1.4;
|
||
|
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
||
|
}
|
||
|
|
||
|
.main-container {
|
||
|
max-width: 1200px;
|
||
|
margin: 0 auto;
|
||
|
padding: 2rem 1rem;
|
||
|
width: 100%;
|
||
|
flex: 1;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
gap: 2rem;
|
||
|
}
|
||
|
|
||
|
.content-row {
|
||
|
display: flex;
|
||
|
flex-wrap: wrap;
|
||
|
gap: 1.5rem;
|
||
|
justify-content: space-between;
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
.content-card {
|
||
|
flex: 1;
|
||
|
min-width: 300px;
|
||
|
background-color: white;
|
||
|
border-radius: 12px;
|
||
|
overflow: hidden;
|
||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
||
|
padding: 1.5rem;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.card-header {
|
||
|
display: flex;
|
||
|
justify-content: space-between;
|
||
|
align-items: center;
|
||
|
margin-bottom: 1.5rem;
|
||
|
padding-bottom: 1rem;
|
||
|
border-bottom: 2px solid #f0f0f0;
|
||
|
position: relative;
|
||
|
z-index: 1;
|
||
|
}
|
||
|
|
||
|
.card-header h2 {
|
||
|
font-size: 1.5rem;
|
||
|
color: var(--color-text);
|
||
|
font-weight: 600;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
margin: 0;
|
||
|
}
|
||
|
|
||
|
.card-icon {
|
||
|
display: inline-block;
|
||
|
width: 24px;
|
||
|
height: 24px;
|
||
|
margin-right: 10px;
|
||
|
background-size: contain;
|
||
|
background-repeat: no-repeat;
|
||
|
background-position: center;
|
||
|
}
|
||
|
|
||
|
.law-icon {
|
||
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%230072ff' viewBox='0 0 16 16'%3E%3Cpath d='M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zM4.5 7.5a.5.5 0 0 1 0 1H3.5a.5.5 0 0 1 0-1h1zm2 0a.5.5 0 0 1 0 1h-1a.5.5 0 0 1 0-1h1zm1 0a.5.5 0 0 1 0 1V8h1v.5a.5.5 0 0 1 0 1V8h1v.5a.5.5 0 1 1 0 1V8a.5.5 0 0 1-.5-.5H9v.5a.5.5 0 0 1-1 0V8h-1v.5zM8 9a.5.5 0 0 1 0 1H4.5a.5.5 0 0 1 0-1zm2.5 0a.5.5 0 0 1 0 1h-1a.5.5 0 0 1 0-1z'/%3E%3C/svg%3E");
|
||
|
}
|
||
|
|
||
|
.case-icon {
|
||
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%230072ff' viewBox='0 0 16 16'%3E%3Cpath d='M5.5 2A3.5 3.5 0 0 0 2 5.5v5A3.5 3.5 0 0 0 5.5 14h5a3.5 3.5 0 0 0 3.5-3.5V8a.5.5 0 0 1 1 0v2.5a4.5 4.5 0 0 1-4.5 4.5h-5A4.5 4.5 0 0 1 1 10.5v-5A4.5 4.5 0 0 1 5.5 1H8a.5.5 0 0 1 0 1z'/%3E%3Cpath d='M16 3a3 3 0 1 1-6 0 3 3 0 0 1 6 0'/%3E%3C/svg%3E");
|
||
|
}
|
||
|
|
||
|
.form-icon {
|
||
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%230072ff' viewBox='0 0 16 16'%3E%3Cpath d='M13 0H6a2 2 0 0 0-2 2 2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h7a2 2 0 0 0 2-2 2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m0 13V4a2 2 0 0 0-2-2H5a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1M3 4a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1z'/%3E%3C/svg%3E");
|
||
|
}
|
||
|
|
||
|
.section-icon, .qrcode-icon {
|
||
|
display: inline-block;
|
||
|
width: 24px;
|
||
|
height: 24px;
|
||
|
margin-right: 10px;
|
||
|
background-size: contain;
|
||
|
background-repeat: no-repeat;
|
||
|
background-position: center;
|
||
|
}
|
||
|
|
||
|
.qrcode-icon {
|
||
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%230072ff' viewBox='0 0 16 16'%3E%3Cpath d='M2 2h2v2H2V2Z'/%3E%3Cpath d='M6 0v6H0V0h6ZM5 1H1v4h4V1ZM4 12H2v2h2v-2Z'/%3E%3Cpath d='M6 10v6H0v-6h6Zm-5 1v4h4v-4H1Zm11-9h2v2h-2V2Z'/%3E%3Cpath d='M10 0v6h6V0h-6Zm5 1v4h-4V1h4ZM8 1V0h1v2H8v2H7V1h1Zm0 5V4h1v2H8ZM6 8V7h1V6h1v2h1V7h5v1h-4v1H7V8H6Zm0 0v1H2V8H1v1H0V7h3v1h3Zm10 1h-1V7h1v2Zm-1 0h-1v2h2v-1h-1V9Zm-4 0h2v1h-1v1h-1V9Zm2 3v-1h-1v1h-1v1H9v1h3v-2h1Zm0 0h3v1h-2v1h-1v-2Zm-4-1v1h1v-2H7v1h2Z'/%3E%3Cpath d='M7 12h1v3h4v1H7v-4Zm9 2v2h-3v-1h2v-1h1Z'/%3E%3C/svg%3E");
|
||
|
}
|
||
|
|
||
|
.view-more {
|
||
|
color: var(--color-primary);
|
||
|
text-decoration: none;
|
||
|
font-size: 0.9rem;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
transition: transform 0.3s;
|
||
|
white-space: nowrap;
|
||
|
}
|
||
|
|
||
|
.view-more::after {
|
||
|
content: '→';
|
||
|
margin-left: 5px;
|
||
|
display: inline-block;
|
||
|
}
|
||
|
|
||
|
.view-more:hover {
|
||
|
transform: translateX(5px);
|
||
|
}
|
||
|
|
||
|
.loading, .empty {
|
||
|
text-align: center;
|
||
|
padding: 2rem;
|
||
|
color: var(--color-text-light);
|
||
|
font-size: 1rem;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
flex: 1;
|
||
|
}
|
||
|
|
||
|
.spinner {
|
||
|
width: 30px;
|
||
|
height: 30px;
|
||
|
border: 3px solid rgba(0, 123, 255, 0.1);
|
||
|
border-radius: 50%;
|
||
|
border-top-color: var(--color-primary);
|
||
|
animation: spin 1s ease-in-out infinite;
|
||
|
margin-bottom: 1rem;
|
||
|
}
|
||
|
|
||
|
@keyframes spin {
|
||
|
to { transform: rotate(360deg); }
|
||
|
}
|
||
|
|
||
|
.content-list {
|
||
|
list-style: none;
|
||
|
padding: 0;
|
||
|
margin: 0;
|
||
|
flex: 1;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.content-list li {
|
||
|
padding: 0.7rem 0;
|
||
|
border-bottom: 1px dashed #eee;
|
||
|
display: flex;
|
||
|
justify-content: space-between;
|
||
|
align-items: center;
|
||
|
transition: all 0.3s;
|
||
|
}
|
||
|
|
||
|
.content-list li:hover {
|
||
|
background-color: rgba(0, 123, 255, 0.05);
|
||
|
padding-left: 10px;
|
||
|
padding-right: 10px;
|
||
|
}
|
||
|
|
||
|
.content-list li:last-child {
|
||
|
border-bottom: none;
|
||
|
}
|
||
|
|
||
|
.list-item-link {
|
||
|
color: var(--color-text);
|
||
|
text-decoration: none;
|
||
|
transition: all 0.3s;
|
||
|
flex: 1;
|
||
|
overflow: hidden;
|
||
|
text-overflow: ellipsis;
|
||
|
white-space: nowrap;
|
||
|
position: relative;
|
||
|
padding-left: 15px;
|
||
|
font-size: 1rem;
|
||
|
display: block;
|
||
|
}
|
||
|
|
||
|
.item-dot {
|
||
|
position: absolute;
|
||
|
left: 0;
|
||
|
top: 50%;
|
||
|
transform: translateY(-50%);
|
||
|
width: 6px;
|
||
|
height: 6px;
|
||
|
border-radius: 50%;
|
||
|
background-color: var(--color-primary);
|
||
|
display: block;
|
||
|
}
|
||
|
|
||
|
.list-item-link:hover {
|
||
|
color: var(--color-primary);
|
||
|
transform: translateX(5px);
|
||
|
}
|
||
|
|
||
|
.date {
|
||
|
color: var(--color-text-light);
|
||
|
font-size: 0.85rem;
|
||
|
margin-left: 1rem;
|
||
|
white-space: nowrap;
|
||
|
}
|
||
|
|
||
|
.qrcode-section {
|
||
|
margin: 0;
|
||
|
background-color: white;
|
||
|
border-radius: 12px;
|
||
|
padding: 2rem;
|
||
|
width: 100%;
|
||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
||
|
}
|
||
|
|
||
|
.section-header {
|
||
|
display: flex;
|
||
|
justify-content: space-between;
|
||
|
align-items: center;
|
||
|
margin-bottom: 1.8rem;
|
||
|
padding-bottom: 1rem;
|
||
|
border-bottom: 2px solid #f0f0f0;
|
||
|
}
|
||
|
|
||
|
.section-header h2 {
|
||
|
font-size: 1.8rem;
|
||
|
font-weight: 600;
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
margin: 0;
|
||
|
}
|
||
|
|
||
|
.qrcode-list {
|
||
|
display: flex;
|
||
|
flex-wrap: wrap;
|
||
|
gap: 2rem;
|
||
|
}
|
||
|
|
||
|
.qrcode-group {
|
||
|
flex: 1;
|
||
|
min-width: 300px;
|
||
|
}
|
||
|
|
||
|
.qrcode-group h3 {
|
||
|
margin-bottom: 1.5rem;
|
||
|
color: var(--color-text);
|
||
|
font-size: 1.4rem;
|
||
|
position: relative;
|
||
|
padding-left: 18px;
|
||
|
}
|
||
|
|
||
|
.qrcode-group h3::before {
|
||
|
content: '';
|
||
|
position: absolute;
|
||
|
left: 0;
|
||
|
top: 50%;
|
||
|
transform: translateY(-50%);
|
||
|
width: 6px;
|
||
|
height: 20px;
|
||
|
background-color: var(--color-primary);
|
||
|
border-radius: 3px;
|
||
|
}
|
||
|
|
||
|
.qrcode-container {
|
||
|
display: flex;
|
||
|
flex-wrap: wrap;
|
||
|
gap: 2rem;
|
||
|
justify-content: flex-start;
|
||
|
}
|
||
|
|
||
|
.footer {
|
||
|
margin-top: auto;
|
||
|
background-color: #2c3e50;
|
||
|
padding: 2rem 0;
|
||
|
text-align: center;
|
||
|
color: rgba(255, 255, 255, 0.8);
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
.footer p {
|
||
|
margin: 0;
|
||
|
font-size: 1.1rem;
|
||
|
}
|
||
|
|
||
|
/* 移动端首页搜索框 */
|
||
|
.mobile-home-search {
|
||
|
display: none !important;
|
||
|
}
|
||
|
|
||
|
/* 响应式布局 */
|
||
|
@media (max-width: 992px) {
|
||
|
.content-row {
|
||
|
flex-direction: column;
|
||
|
}
|
||
|
|
||
|
.content-card {
|
||
|
width: 100%;
|
||
|
}
|
||
|
|
||
|
.qrcode-group {
|
||
|
width: 100%;
|
||
|
margin-bottom: 2rem;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@media (max-width: 768px) {
|
||
|
.header {
|
||
|
padding: 2rem 0;
|
||
|
}
|
||
|
|
||
|
.header h1 {
|
||
|
font-size: 2rem;
|
||
|
}
|
||
|
|
||
|
.subtitle {
|
||
|
font-size: 1.2rem;
|
||
|
}
|
||
|
|
||
|
.content-card {
|
||
|
padding: 1rem;
|
||
|
}
|
||
|
|
||
|
.qrcode-section {
|
||
|
padding: 1.5rem;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@media (max-width: 576px) {
|
||
|
.header h1 {
|
||
|
font-size: 1.6rem;
|
||
|
}
|
||
|
|
||
|
.subtitle {
|
||
|
font-size: 1rem;
|
||
|
}
|
||
|
|
||
|
.card-header h2,
|
||
|
.section-header h2 {
|
||
|
font-size: 1.3rem;
|
||
|
}
|
||
|
|
||
|
.qrcode-group h3 {
|
||
|
font-size: 1.2rem;
|
||
|
}
|
||
|
}
|
||
|
</style>
|