head>
<链接 关系="样式表" 链接地址="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<样式>
/* ============================================================
全局重置 & 基础 (原样保留)
============================================================ */
* {
margin: 0;
内边距: 0;
box-sizing: border-box;
}
:根 {
--gold-1: #bf953f;
--gold-2: #fcf6ba;
--gold-3: #b38728;
--gold-4: #fbf5b7;
--gold-glow: rgba(191, 149, 63, 0.35);
--bg-deep: #0a0806;
--bg-card: rgba(18, 15, 12, 0.70);
--border-gold-subtle: rgba(191, 149, 63, 0.18);
--text-primary: #f5f0eb;
--text-secondary: #a89888;
--radius: 18px;
--transition: 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
--shadow-card: 0 12px 50px rgba(0, 0, 0, 0.5);
--highlight-glow: rgba(251, 191, 36, 0.15);
--highlight-border: rgba(251, 191, 36, 0.35);
--highlight-bg: rgba(251, 191, 36, 0.04);
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', sans-serif;
background: var(--bg-deep);
color: var(--text-primary);
min-height: 100vh;
overflow-x: hidden;
position: relative;
}
body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
radial-gradient(ellipse at 50% 0%, rgba(191, 149, 63, 0.10) 0%, transparent 60%),
radial-gradient(ellipse at 80% 80%, rgba(120, 80, 30, 0.06) 0%, transparent 50%),
radial-gradient(ellipse at 20% 100%, rgba(60, 40, 20, 0.04) 0%, transparent 40%),
#0a0806;
z-index: 0;
pointer-events: none;
}
body::after {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.035'/%3E%3C/svg%3E");
opacity: 0.3;
pointer-events: none;
z-index: 0;
}
::-webkit-scrollbar {
width: 5px;
}
::-webkit-scrollbar-track {
background: #0a0806;
}
::-webkit-scrollbar-thumb {
background: var(--gold-3);
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--gold-1);
}
#particles-canvas {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
}
.app-wrapper {
position: relative;
z-index: 1;
display: flex;
min-height: 100vh;
}
/* ============================================================
左侧面板 (伸缩式)
============================================================ */
.side-panel {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 380px;
background: rgba(10, 8, 6, 0.92);
backdrop-filter: blur(20px);
border-right: 1px solid rgba(191, 149, 63, 0.15);
z-index: 100;
transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
transform: translateX(0);
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 4px 0 60px rgba(0, 0, 0, 0.6);
}
.side-panel.collapsed {
transform: translateX(-100%);
box-shadow: none;
}
.panel-toggle-fixed {
position: fixed;
top: 50%;
left: 380px;
transform: translateY(-50%);
width: 44px;
height: 80px;
background: linear-gradient(135deg, rgba(191, 149, 63, 0.2), rgba(10, 8, 6, 0.9));
border: 1px solid rgba(191, 149, 63, 0.2);
border-left: none;
border-radius: 0 12px 12px 0;
color: var(--gold-1);
font-size: 20px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: 150;
transition: left 0.5s cubic-bezier(0.22, 1, 0.36, 1), background 0.5s, color 0.5s;
backdrop-filter: blur(8px);
}
.side-panel.collapsed~.panel-toggle-fixed {
left: 0;
}
.panel-toggle-fixed:hover {
background: rgba(191, 149, 63, 0.25);
color: var(--gold-2);
box-shadow: 0 0 30px rgba(191, 149, 63, 0.1);
}
.panel-toggle-fixed .fa-chevron-left,
.panel-toggle-fixed .fa-chevron-right {
transition: opacity 0.3s;
}
.panel-toggle-fixed .fa-chevron-right {
display: none;
}
.side-panel.collapsed~.panel-toggle-fixed .fa-chevron-left {
display: none;
}
.side-panel.collapsed~.panel-toggle-fixed .fa-chevron-right {
display: inline-block;
}
.panel-header {
padding: 24px 28px 16px;
border-bottom: 1px solid rgba(191, 149, 63, 0.08);
flex-shrink: 0;
}
.panel-header h2 {
font-family: 'Playfair Display', serif;
font-size: 22px;
font-weight: 700;
background: linear-gradient(135deg, var(--gold-2), var(--gold-1), var(--gold-3));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: 1px;
}
.panel-header p {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
letter-spacing: 0.5px;
}
.panel-body {
padding: 20px 28px 28px;
flex: 1;
overflow-y: auto;
}
.panel-body .form-group {
margin-bottom: 18px;
}
.panel-body .form-group label {
display: block;
font-size: 13px;
font-weight: 500;
color: var(--text-secondary);
margin-bottom: 6px;
letter-spacing: 0.3px;
}
.panel-body .form-group label i {
color: var(--gold-1);
margin-right: 6px;
width: 16px;
}
.panel-body .form-group input,
.panel-body .form-group select {
width: 100%;
padding: 10px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(191, 149, 63, 0.15);
border-radius: 10px;
color: var(--text-primary);
font-size: 14px;
font-family: 'Inter', sans-serif;
transition: var(--transition);
outline: none;
}
.panel-body .form-group input:focus,
.panel-body .form-group select:focus {
border-color: var(--gold-1);
box-shadow: 0 0 25px rgba(191, 149, 63, 0.06);
background: rgba(255, 255, 255, 0.06);
}
.panel-body .form-group input::placeholder {
color: rgba(168, 152, 136, 0.4);
}
.panel-body .form-group select option {
background: #1a1510;
color: var(--text-primary);
}
.btn-submit {
width: 100%;
padding: 12px;
background: linear-gradient(135deg, var(--gold-1), var(--gold-3));
border: none;
border-radius: 10px;
color: #0a0806;
font-size: 16px;
font-weight: 600;
font-family: 'Inter', sans-serif;
cursor: pointer;
transition: var(--transition);
box-shadow: 0 0 30px rgba(191, 149, 63, 0.1);
letter-spacing: 0.5px;
margin-top: 6px;
}
.btn-submit:hover {
transform: translateY(-2px);
box-shadow: 0 8px 40px rgba(191, 149, 63, 0.2);
}
.btn-submit:active {
transform: scale(0.98);
}
.panel-footer {
padding: 14px 28px;
border-top: 1px solid rgba(191, 149, 63, 0.06);
flex-shrink: 0;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: var(--text-secondary);
}
.panel-footer span {
color: var(--gold-1);
}
.btn-clear-all {
background: transparent;
border: 1px solid rgba(191, 149, 63, 0.1);
color: var(--text-secondary);
padding: 4px 14px;
border-radius: 20px;
font-size: 12px;
cursor: pointer;
transition: var(--transition);
font-family: 'Inter', sans-serif;
}
.btn-clear-all:hover {
border-color: rgba(191, 149, 63, 0.3);
color: var(--gold-1);
}
/* ============================================================
主内容区域
============================================================ */
.main-content {
flex: 1;
margin-left: 380px;
padding: 20px 32px 40px;
transition: margin-left 0.5s cubic-bezier(0.22, 1, 0.36, 1);
min-height: 100vh;
position: relative;
}
.side-panel.collapsed~.main-content {
margin-left: 0;
}
/* ============================================================
顶部导航
============================================================ */
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 0 24px;
border-bottom: 1px solid rgba(191, 149, 63, 0.08);
margin-bottom: 28px;
flex-wrap: wrap;
gap: 14px;
}
.navbar-brand {
display: flex;
align-items: center;
gap: 14px;
text-decoration: none;
}
.navbar-brand .logo-icon {
width: 44px;
height: 44px;
background: linear-gradient(135deg, var(--gold-1), var(--gold-3));
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
color: #0a0806;
box-shadow: 0 0 30px rgba(191, 149, 63, 0.2);
transition: var(--transition);
}
.navbar-brand:hover .logo-icon {
transform: scale(1.05) rotate(-2deg);
box-shadow: 0 0 50px rgba(191, 149, 63, 0.3);
}
.navbar-brand .brand-text {
font-family: 'Playfair Display', serif;
font-weight: 700;
font-size: 24px;
letter-spacing: 2px;
background: linear-gradient(135deg, var(--gold-2), var(--gold-1), var(--gold-3), var(--gold-2));
background-size: 300% 300%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: goldShine 6s ease-in-out infinite alternate;
}
@keyframes goldShine {
0% {
background-position: 0% 50%;
}
100% {
background-position: 100% 50%;
}
}
.navbar-brand .brand-sub {
font-size: 11px;
color: var(--text-secondary);
letter-spacing: 4px;
font-weight: 300;
-webkit-text-fill-color: var(--text-secondary);
}
.navbar-right {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
}
.navbar-date {
font-size: 13px;
color: var(--text-secondary);
padding: 6px 18px;
border-radius: 30px;
border: 1px solid rgba(191, 149, 63, 0.12);
backdrop-filter: blur(8px);
background: rgba(255, 255, 255, 0.02);
}
.navbar-date i {
color: var(--gold-1);
margin-right: 8px;
}
/* ============================================================
统计卡片 (5个)
============================================================ */
.stats-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 18px;
margin-bottom: 28px;
}
@media (max-width: 1200px) {
.stats-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 768px) {
.stats-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 480px) {
.stats-grid {
grid-template-columns: 1fr;
}
}
.stat-card {
position: relative;
background: var(--bg-card);
backdrop-filter: blur(12px);
border: 1px solid rgba(191, 149, 63, 0.10);
border-radius: var(--radius);
padding: 18px 20px 16px;
transition: var(--transition);
cursor: default;
overflow: hidden;
}
.stat-card::before {
content: '';
position: absolute;
inset: -2px;
border-radius: var(--radius);
padding: 2px;
background: linear-gradient(135deg, rgba(191, 149, 63, 0.12), rgba(191, 149, 63, 0.02), rgba(191, 149, 63, 0.12));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
animation: borderBreathe 4.8s ease-in-out infinite;
}
.stat-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at 50% 0%, rgba(191, 149, 63, 0.05), transparent 70%);
pointer-events: none;
animation: glowBreathe 4.8s ease-in-out infinite;
border-radius: var(--radius);
}
@keyframes borderBreathe {
0%,
100% {
opacity: 0.3;
transform: scale(1);
}
50% {
opacity: 1;
transform: scale(1.015);
}
}
@keyframes glowBreathe {
0%,
100% {
opacity: 0.2;
transform: scale(0.98);
}
50% {
opacity: 0.7;
transform: scale(1);
}
}
.stat-card:hover {
transform: translateY(-4px);
border-color: rgba(191, 149, 63, 0.25);
box-shadow: var(--shadow-card);
}
.stat-card .stat-label {
font-size: 12px;
font-weight: 500;
color: var(--text-secondary);
letter-spacing: 0.6px;
text-transform: uppercase;
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 6px;
position: relative;
z-index: 2;
}
.stat-card .stat-label i {
color: var(--gold-1);
font-size: 13px;
}
.stat-card .stat-value {
font-family: 'Playfair Display', serif;
font-size: 30px;
font-weight: 700;
letter-spacing: 0.3px;
line-height: 1.1;
position: relative;
z-index: 2;
background: linear-gradient(135deg, #f5f0eb 20%, var(--gold-2) 80%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.stat-card .stat-sub {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
position: relative;
z-index: 2;
}
.stat-card .stat-icon-bg {
position: absolute;
right: 12px;
bottom: 12px;
font-size: 48px;
opacity: 0.04;
color: var(--gold-1);
z-index: 0;
}
/* ============================================================
年度汇总卡片 (按年份逐行显示)
============================================================ */
.summary-card {
position: relative;
background: var(--bg-card);
backdrop-filter: blur(12px);
border: 1px solid rgba(191, 149, 63, 0.08);
border-radius: var(--radius);
padding: 18px 24px 16px;
margin-bottom: 28px;
transition: var(--transition);
overflow: hidden;
}
.summary-card::before {
content: '';
position: absolute;
inset: -2px;
border-radius: var(--radius);
padding: 2px;
background: linear-gradient(135deg, rgba(191, 149, 63, 0.08), rgba(191, 149, 63, 0.01), rgba(191, 149, 63, 0.08));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
animation: borderBreathe 5.2s ease-in-out infinite 0.3s;
}
.summary-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at 70% 30%, rgba(191, 149, 63, 0.03), transparent 60%);
pointer-events: none;
animation: glowBreathe 5.2s ease-in-out infinite 0.3s;
border-radius: var(--radius);
}
.summary-card:hover {
border-color: rgba(191, 149, 63, 0.18);
box-shadow: var(--shadow-card);
}
.summary-card .card-title {
font-family: 'Playfair Display', serif;
font-size: 17px;
font-weight: 600;
color: var(--text-primary);
letter-spacing: 0.3px;
margin-bottom: 12px;
position: relative;
z-index: 2;
}
.summary-card .card-title i {
color: var(--gold-1);
margin-right: 10px;
}
.summary-rows-container {
position: relative;
z-index: 2;
}
.summary-year-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0;
border-bottom: 1px solid rgba(191, 149, 63, 0.06);
padding: 10px 0;
}
.summary-year-row:last-child {
border-bottom: none;
}
.summary-item {
flex: 1 0 0;
text-align: center;
padding: 4px 2px;
min-width: 60px;
border-right: 1px solid rgba(191, 149, 63, 0.06);
}
.summary-item:last-child {
border-right: none;
}
.summary-item .s-label {
font-size: 10px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
display: block;
margin-bottom: 2px;
}
.summary-item .s-value {
font-family: 'Playfair Display', serif;
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
}
.summary-item .s-value.gold {
color: var(--gold-1);
}
.summary-item .s-value.green {
color: #7ddfb0;
}
.summary-item .s-value.red {
color: #f87171;
}
.summary-item .s-value.year-value {
font-size: 22px;
font-weight: 700;
color: var(--gold-2);
letter-spacing: 1px;
}
@media (max-width: 768px) {
.summary-item .s-value {
font-size: 15px;
}
.summary-item .s-label {
font-size: 9px;
}
.summary-year-row {
gap: 4px 0;
}
.summary-item {
flex: 1 0 20%;
border-right: none;
border-bottom: 1px solid rgba(191, 149, 63, 0.04);
padding: 6px 2px;
}
.summary-item .s-value.year-value {
font-size: 18px;
}
}
@media (max-width: 480px) {
.summary-item {
flex: 1 0 33%;
}
}
/* ============================================================
双栏:来源分布 + 月度趋势
============================================================ */
.charts-row {
display: grid;
grid-template-columns: 1fr 1.8fr;
gap: 22px;
margin-bottom: 28px;
}
@media (max-width: 1024px) {
.charts-row {
grid-template-columns: 1fr;
}
}
.chart-card {
position: relative;
background: var(--bg-card);
backdrop-filter: blur(12px);
border: 1px solid rgba(191, 149, 63, 0.08);
border-radius: var(--radius);
padding: 20px 22px 18px;
transition: var(--transition);
overflow: hidden;
}
.chart-card::before {
content: '';
position: absolute;
inset: -2px;
border-radius: var(--radius);
padding: 2px;
background: linear-gradient(135deg, rgba(191, 149, 63, 0.08), rgba(191, 149, 63, 0.01), rgba(191, 149, 63, 0.08));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
animation: borderBreathe 4.6s ease-in-out infinite 0.6s;
}
.chart-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at 40% 20%, rgba(191, 149, 63, 0.03), transparent 60%);
pointer-events: none;
animation: glowBreathe 4.6s ease-in-out infinite 0.6s;
border-radius: var(--radius);
}
.chart-card:hover {
border-color: rgba(191, 149, 63, 0.18);
box-shadow: var(--shadow-card);
}
.chart-card .card-title {
font-family: 'Playfair Display', serif;
font-size: 17px;
font-weight: 600;
color: var(--text-primary);
letter-spacing: 0.3px;
margin-bottom: 14px;
position: relative;
z-index: 2;
}
.chart-card .card-title i {
color: var(--gold-1);
margin-right: 10px;
}
.chart-container {
width: 100%;
height: 210px;
position: relative;
z-index: 2;
}
.chart-container canvas {
width: 100% !important;
height: 100% !important;
}
/* ============================================================
收入记录表格
============================================================ */
.table-section {
position: relative;
background: var(--bg-card);
backdrop-filter: blur(12px);
border: 1px solid rgba(191, 149, 63, 0.08);
border-radius: var(--radius);
padding: 20px 22px 18px;
transition: var(--transition);
overflow: hidden;
}
.table-section::before {
content: '';
position: absolute;
inset: -2px;
border-radius: var(--radius);
padding: 2px;
background: linear-gradient(135deg, rgba(191, 149, 63, 0.08), rgba(191, 149, 63, 0.01), rgba(191, 149, 63, 0.08));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
animation: borderBreathe 5s ease-in-out infinite 0.8s;
}
.table-section::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at 60% 80%, rgba(191, 149, 63, 0.03), transparent 60%);
pointer-events: none;
animation: glowBreathe 5s ease-in-out infinite 0.8s;
border-radius: var(--radius);
}
.table-section .table-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
flex-wrap: wrap;
gap: 12px;
position: relative;
z-index: 2;
}
.table-section .table-header .card-title {
font-family: 'Playfair Display', serif;
font-size: 17px;
font-weight: 600;
color: var(--text-primary);
letter-spacing: 0.3px;
}
.table-section .table-header .card-title i {
color: var(--gold-1);
margin-right: 10px;
}
.table-section .table-header .record-count {
font-size: 13px;
color: var(--text-secondary);
}
.table-section .table-header .record-count span {
color: var(--gold-1);
font-weight: 600;
}
.table-wrap {
overflow-x: auto;
position: relative;
z-index: 2;
}
.table-wrap table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
min-width: 900px;
}
.table-wrap table th {
text-align: left;
padding: 10px 12px;
color: var(--text-secondary);
font-weight: 500;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 1px solid rgba(191, 149, 63, 0.06);
}
.table-wrap table td {
padding: 10px 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
color: var(--text-primary);
vertical-align: middle;
transition: background 0.4s ease;
}
.table-wrap table tr:hover td {
background: rgba(191, 149, 63, 0.03);
}
.table-wrap table tr.row-partial td {
border-left: 3px solid #fbbf24;
background: rgba(251, 191, 36, 0.03);
box-shadow: inset 0 0 30px rgba(251, 191, 36, 0.02);
}
.table-wrap table tr.row-partial:hover td {
background: rgba(251, 191, 36, 0.06);
}
.table-wrap table tr.row-unpaid td {
border-left: 3px solid #f87171;
background: rgba(248, 113, 113, 0.03);
box-shadow: inset 0 0 30px rgba(248, 113, 113, 0.02);
}
.table-wrap table tr.row-unpaid:hover td {
background: rgba(248, 113, 113, 0.06);
}
.table-wrap table tr.row-paid td {
border-left: 3px solid transparent;
}
.table-wrap table .status-badge {
display: inline-block;
padding: 2px 12px;
border-radius: 20px;
font-size: 11px;
font-weight: 500;
background: rgba(125, 223, 176, 0.06);
color: #7ddfb0;
border: 1px solid rgba(125, 223, 176, 0.08);
}
.table-wrap table .status-badge.partial {
color: #fbbf24;
background: rgba(251, 191, 36, 0.06);
border-color: rgba(251, 191, 36, 0.08);
}
.table-wrap table .status-badge.unpaid {
color: #f87171;
background: rgba(248, 113, 113, 0.06);
border-color: rgba(248, 113, 113, 0.08);
}
.table-wrap table .action-btn {
background: transparent;
border: none;
color: var(--text-secondary);
cursor: pointer;
padding: 4px 8px;
border-radius: 6px;
transition: var(--transition);
font-size: 14px;
}
.table-wrap table .action-btn:hover {
color: var(--gold-1);
background: rgba(191, 149, 63, 0.08);
}
.table-wrap table .action-btn.danger:hover {
color: #f87171;
background: rgba(248, 113, 113, 0.08);
}
.source-tag {
display: inline-block;
padding: 2px 12px;
border-radius: 12px;
font-size: 11px;
font-weight: 500;
border: 1px solid transparent;
}
.source-tag.技术标 {
background: rgba(191, 149, 63, 0.15);
color: #fcf6ba;
border-color: rgba(191, 149, 63, 0.2);
}
.source-tag.方案 {
background: rgba(96, 165, 250, 0.15);
color: #93c5fd;
border-color: rgba(96, 165, 250, 0.2);
}
.source-tag.咨询 {
background: rgba(74, 222, 128, 0.12);
color: #6ee7b7;
border-color: rgba(74, 222, 128, 0.15);
}
.source-tag.设计 {
background: rgba(196, 181, 253, 0.12);
color: #c4b5fd;
border-color: rgba(196, 181, 253, 0.15);
}
.source-tag.其他 {
background: rgba(168, 152, 136, 0.15);
color: #c4b5a0;
border-color: rgba(168, 152, 136, 0.15);
}
.empty-state {
text-align: center;
padding: 40px 20px;
color: var(--text-secondary);
font-size: 14px;
position: relative;
z-index: 2;
}
.empty-state i {
font-size: 40px;
color: rgba(191, 149, 63, 0.15);
margin-bottom: 12px;
display: block;
}
.footer {
margin-top: 32px;
padding-top: 22px;
border-top: 1px solid rgba(191, 149, 63, 0.06);
text-align: center;
font-size: 12px;
color: var(--text-secondary);
letter-spacing: 0.5px;
position: relative;
z-index: 2;
}
.footer span {
color: var(--gold-1);
margin: 0 6px;
}
.btn-export {
background: rgba(191, 149, 63, 0.1);
border: 1px solid rgba(191, 149, 63, 0.25);
color: var(--gold-1);
padding: 6px 16px;
border-radius: 20px;
font-size: 12px;
cursor: pointer;
transition: var(--transition);
font-family: 'Inter', sans-serif;
display: inline-flex;
align-items: center;
gap: 6px;
margin-left: 8px;
}
.btn-export:hover {
background: rgba(191, 149, 63, 0.2);
color: var(--gold-2);
border-color: var(--gold-1);
}
/* 响应式 */
@media (max-width: 1024px) {
.side-panel {
width: 340px;
}
.panel-toggle-fixed {
left: 340px;
}
.side-panel.collapsed~.panel-toggle-fixed {
left: 0;
}
.main-content {
margin-left: 340px;
}
.side-panel.collapsed~.main-content {
margin-left: 0;
}
}
@media (max-width: 768px) {
.side-panel {
width: 300px;
}
.panel-toggle-fixed {
left: 300px;
width: 40px;
height: 70px;
}
.side-panel.collapsed~.panel-toggle-fixed {
left: 0;
}
.main-content {
margin-left: 0;
padding: 12px 14px 30px;
}
.side-panel.collapsed~.main-content {
margin-left: 0;
}
.navbar {
flex-direction: column;
align-items: stretch;
}
.navbar-right {
justify-content: space-between;
}
.stats-grid {
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.stat-card .stat-value {
font-size: 24px;
}
}
@media (max-width: 480px) {
.side-panel {
width: 280px;
}
.panel-toggle-fixed {
left: 280px;
width: 36px;
height: 60px;
font-size: 16px;
}
.side-panel.collapsed~.panel-toggle-fixed {
left: 0;
}
.main-content {
margin-left: 0;
padding: 8px 10px 20px;
}
.side-panel.collapsed~.main-content {
margin-left: 0;
}
.stats-grid {
grid-template-columns: 1fr;
}
}
.editing-mode .btn-submit {
background: linear-gradient(135deg, #fbbf24, #f59e0b);
}
.editing-mode .panel-header h2::after {
content: ' ✎ 编辑中';
font-size: 14px;
color: #fbbf24;
-webkit-text-fill-color: #fbbf24;
margin-left: 8px;
}
🔒
请输入密码
此页面已加密,请输入访问密码
❌ 密码错误,请重试
🔒
请输入密码
此页面已加密,请输入访问密码
❌ 密码错误,请重试
年度汇总
年份
2026
合同总额
¥91,020
已收
¥77,020
未收
¥14,000
回收率
84.6%
零钱通转入
¥73,500
同比增长
+42.4%
年份
2025
合同总额
¥63,900
已收
¥63,900
未收
¥0
回收率
100.0%
零钱通转入
¥60,500
同比增长
--
| 日期 | 来源 | 名称 | 合同金额 | 收款状态 | 已收金额 | 零钱通转入 | 零钱通备注 | 操作 |
| 2026-08-16 |
技术标 |
许涵炜四季华庭小区(1主2陪) |
¥4,000 |
未收款 |
¥0 |
¥0 |
- |
|
| 2026-08-07 |
技术标 |
许涵炜盛昱府小区(1主2陪) |
¥4,000 |
已收款 |
¥4,000 |
¥4,000 |
无 |
|
| 2026-07-31 |
技术标 |
许涵炜中山壹品小区(1主2陪) |
¥5,000 |
已收款 |
¥5,000 |
¥5,000 |
无 |
|
| 2026-07-12 |
技术标 |
许涵炜金甬铁路物流园剥土(1主2陪) |
¥5,000 |
已收款 |
¥5,000 |
¥5,000 |
无 |
|
| 2026-07-10 |
其他 |
周向东打凿 |
¥20,000 |
已收款 |
¥20,000 |
¥20,000 |
无 |
|
| 2026-06-23 |
技术标 |
许涵炜水岸名院小区(1主1陪) |
¥3,000 |
已收款 |
¥3,000 |
¥3,000 |
无 |
|
| 2026-06-23 |
技术标 |
许涵炜桂语江南小区(2主1陪) |
¥5,000 |
已收款 |
¥5,000 |
¥5,000 |
无 |
|
| 2026-06-10 |
其他 |
韦溯源 中山项目场布模型 |
¥3,000 |
已收款 |
¥3,000 |
¥2,500 |
500给妈妈买手表 |
|
| 2026-05-31 |
设计 |
卢剑杰 金华荣浩厂房设计费 |
¥20,000 |
部分收款 |
¥10,000 |
¥10,000 |
无 |
|
| 2026-05-22 |
方案 |
严总外架及模板方案 |
¥3,000 |
已收款 |
¥3,000 |
¥3,000 |
无 |
|
| 2026-05-20 |
技术标 |
许涵炜六石水利 (1主1陪) |
¥3,000 |
已收款 |
¥3,000 |
¥3,000 |
无 |
|
| 2026-05-20 |
技术标 |
许涵炜红椿新苑小区(1主) |
¥2,000 |
已收款 |
¥2,000 |
¥2,000 |
无 |
|
| 2026-04-10 |
咨询 |
义乌工商学院专家费 |
¥960 |
已收款 |
¥960 |
¥0 |
在建行卡上 |
|
| 2026-04-10 |
咨询 |
义乌工商学院专家费2 |
¥1,760 |
已收款 |
¥1,760 |
¥0 |
在建行卡上 |
|
| 2026-03-26 |
技术标 |
许涵炜金象科技技术标 |
¥11,000 |
已收款 |
¥11,000 |
¥11,000 |
无 |
|
| 2026-03-01 |
其他 |
公司内刊稿费 |
¥300 |
已收款 |
¥300 |
¥0 |
零用花掉了 |
|
| 2025-12-31 |
方案 |
何晓亮中吉乌铁路方案 |
¥5,400 |
已收款 |
¥5,400 |
¥5,000 |
400零用花掉了 |
|
| 2025-12-31 |
咨询 |
卢剑杰现金 |
¥1,000 |
已收款 |
¥1,000 |
¥0 |
现金钱包里 |
|
| 2025-12-30 |
设计 |
卢剑杰义乌设计费 |
¥15,000 |
已收款 |
¥15,000 |
¥15,000 |
无 |
|
| 2025-12-10 |
方案 |
东白山鹊桥会雕塑外架方案 |
¥2,000 |
已收款 |
¥2,000 |
¥0 |
零用花掉了 |
|
| 2025-08-20 |
其他 |
QC公司奖金 |
¥11,000 |
已收款 |
¥11,000 |
¥11,000 |
无 |
|
| 2025-08-09 |
方案 |
范向伟吉米赛斯高支模 |
¥4,000 |
已收款 |
¥4,000 |
¥4,000 |
无 |
|
| 2025-08-08 |
咨询 |
文化艺术中心恐龙深化图 |
¥1,500 |
已收款 |
¥1,500 |
¥1,500 |
无 |
|
| 2025-06-11 |
其他 |
视界观中心医院遮阳帘动画 |
¥6,000 |
已收款 |
¥6,000 |
¥6,000 |
无 |
|
| 2025-04-28 |
方案 |
范向伟金华工地方案 |
¥10,000 |
已收款 |
¥10,000 |
¥10,000 |
无 |
|
| 2025-03-12 |
其他 |
视界观文化艺术中心遮阳帘动画 |
¥8,000 |
已收款 |
¥8,000 |
¥8,000 |
无 |
|