+
+
+
+
营销节点
+
把时间感也做成页面的一部分
+
+ 这些节点能帮助用户快速想到“最近该做什么图”。比起单纯展示日期,更像是一个素材站自己的选题提醒。
+
+
+
+
+
按最近营销节奏排序
+
+ }
+ onClick={() => scroll('left')}
+ />
+ }
+ onClick={() => scroll('right')}
+ />
+
+
+
+
{festivals.map((item, index) => (
-
-
{item.emoji}
+
{item.icon}
-
{item.name}
-
{item.date} {item.weekday}
-
-
-
{item.daysLeft}
-
天后
+
+
{item.name}
+ {item.daysLeft} 天后
+
+
+ {item.date} · {item.weekday}
+
+
适合提前布局专题与节日视觉
))}
-
}
- onClick={() => scroll('right')}
- />
);
diff --git a/frontend/src/components/Footer.css b/frontend/src/components/Footer.css
index 5d09aa5..de70930 100644
--- a/frontend/src/components/Footer.css
+++ b/frontend/src/components/Footer.css
@@ -1,159 +1,240 @@
-.footer {
- margin-top: auto;
-}
-
-.footer-main {
- background: #f5f5f5;
- padding: 40px 0;
-}
-
-.footer-container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 0 20px;
-}
-
-.footer-links-group {
- display: flex;
- gap: 24px;
- margin-bottom: 12px;
-}
-
-.footer-link {
- color: #666;
- font-size: 14px;
- transition: color 0.2s;
-}
-
-.footer-link:hover {
- color: #ff5a5a;
-}
-
-.footer-contact {
- margin-bottom: 20px;
-}
-
-.contact-title {
- font-size: 14px;
- color: #333;
- margin: 0 0 12px;
- font-weight: 500;
-}
-
-.email-input {
- background: white;
- border-radius: 8px;
- max-width: 360px;
-}
-
-.email-input .ant-input {
- color: #666;
-}
-
-.footer-qrcodes {
- display: flex;
- gap: 24px;
-}
-
-.qrcode-item {
- text-align: center;
-}
-
-.qrcode-placeholder {
- width: 100px;
- height: 100px;
- background: white;
- border-radius: 8px;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: 8px;
- border: 1px solid #e8e8e8;
-}
-
-.qrcode-icon {
- font-size: 48px;
- color: #ccc;
-}
-
-.qrcode-text {
- font-size: 12px;
- color: #999;
-}
-
-.footer-partners {
- margin-top: 30px;
- padding-top: 20px;
- border-top: 1px solid #e8e8e8;
- display: flex;
- flex-wrap: wrap;
- gap: 12px 20px;
-}
-
-.partner-link {
- font-size: 12px;
- color: #999;
- transition: color 0.2s;
-}
-
-.partner-link:hover {
- color: #ff5a5a;
-}
-
-.footer-bottom {
- background: #3d3d3d;
- padding: 20px 0;
-}
-
-.copyright-text {
- color: #999;
- font-size: 12px;
- line-height: 1.8;
- margin: 0 0 8px;
-}
-
-.email-link {
- color: #ff5a5a;
-}
-
-.email-link:hover {
- text-decoration: underline;
-}
-
-.copyright-links {
- color: #999;
- font-size: 12px;
- margin: 0;
-}
-
-.copyright-links a {
- color: #999;
- transition: color 0.2s;
-}
-
-.copyright-links a:hover {
- color: #ff5a5a;
-}
-
-@media (max-width: 768px) {
- .footer-main {
- padding: 30px 0;
- }
-
- .footer-links-group {
- justify-content: center;
- }
-
- .footer-qrcodes {
- justify-content: center;
- }
-
- .footer-partners {
- justify-content: center;
- }
-
- .copyright-text,
- .copyright-links {
- text-align: center;
- }
-}
+.footer {
+ padding: 0 20px 24px;
+}
+
+.footer-shell {
+ max-width: 1400px;
+ margin: 0 auto;
+ border-radius: 32px;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at top right, rgba(244, 178, 84, 0.14), transparent 26%),
+ linear-gradient(180deg, rgba(255, 251, 246, 0.96), rgba(250, 243, 236, 0.96));
+ border: 1px solid rgba(233, 221, 212, 0.92);
+ box-shadow: 0 22px 48px rgba(66, 42, 26, 0.08);
+}
+
+.footer-main {
+ display: grid;
+ grid-template-columns: 1.15fr 0.95fr 0.9fr;
+ gap: 28px;
+ padding: 34px 32px 28px;
+}
+
+.footer-brand {
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+}
+
+.footer-logo {
+ display: inline-flex;
+ align-items: center;
+ gap: 12px;
+ width: fit-content;
+ text-decoration: none;
+}
+
+.footer-logo-icon {
+ width: 46px;
+ height: 28px;
+}
+
+.footer-logo strong {
+ display: block;
+ color: #261f19;
+ font-size: 24px;
+}
+
+.footer-logo span {
+ color: #8b7f73;
+ font-size: 12px;
+}
+
+.footer-brand-text {
+ margin: 0;
+ color: #6f645a;
+ line-height: 1.9;
+}
+
+.footer-contact-card {
+ display: grid;
+ grid-template-columns: 44px minmax(0, 1fr);
+ gap: 14px;
+ padding: 16px;
+ border-radius: 22px;
+ background: rgba(255, 255, 255, 0.8);
+ border: 1px solid rgba(236, 223, 213, 0.94);
+}
+
+.footer-contact-card .anticon {
+ width: 44px;
+ height: 44px;
+ border-radius: 16px;
+ display: grid;
+ place-items: center;
+ background: #fff1e9;
+ color: #ef6a5b;
+ font-size: 18px;
+}
+
+.footer-contact-card span {
+ display: block;
+ color: #8b7f73;
+ font-size: 12px;
+ margin-bottom: 4px;
+}
+
+.footer-contact-card a {
+ color: #261f19;
+ font-size: 16px;
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.footer-links {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 18px;
+}
+
+.footer-link-group h4 {
+ margin: 0 0 12px;
+ color: #261f19;
+ font-size: 16px;
+}
+
+.footer-link-group {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.footer-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px 14px;
+ border-radius: 18px;
+ border: 1px solid rgba(236, 223, 213, 0.94);
+ background: rgba(255, 255, 255, 0.76);
+ color: #5f5449;
+ cursor: pointer;
+ transition: all 0.22s ease;
+ text-align: left;
+}
+
+.footer-link:hover {
+ border-color: rgba(239, 106, 91, 0.32);
+ color: #ef6a5b;
+ background: #fff4ef;
+}
+
+.footer-link .anticon {
+ font-size: 16px;
+}
+
+.footer-qr {
+ display: grid;
+ gap: 14px;
+}
+
+.footer-qr-card {
+ padding: 18px;
+ border-radius: 22px;
+ border: 1px solid rgba(236, 223, 213, 0.94);
+ background: rgba(255, 255, 255, 0.82);
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.footer-qr-icon {
+ width: 52px;
+ height: 52px;
+ border-radius: 18px;
+ background: linear-gradient(135deg, #fff1e9 0%, #ffe0d2 100%);
+ color: #ef6a5b;
+ display: grid;
+ place-items: center;
+ font-size: 24px;
+}
+
+.footer-qr-card strong {
+ color: #261f19;
+ font-size: 16px;
+}
+
+.footer-qr-card span {
+ color: #83776b;
+ font-size: 13px;
+ line-height: 1.7;
+}
+
+.footer-bottom {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 18px 32px 24px;
+ border-top: 1px solid rgba(233, 221, 212, 0.92);
+}
+
+.copyright-text,
+.copyright-links {
+ margin: 0;
+ color: #8a7d70;
+ font-size: 12px;
+ line-height: 1.8;
+}
+
+.email-link {
+ color: #ef6a5b;
+ margin-left: 4px;
+}
+
+.copyright-links {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px 14px;
+}
+
+.copyright-links a {
+ color: #7c6f63;
+}
+
+@media (max-width: 1100px) {
+ .footer-main {
+ grid-template-columns: 1fr;
+ }
+
+ .footer-links {
+ grid-template-columns: 1fr 1fr;
+ }
+}
+
+@media (max-width: 768px) {
+ .footer {
+ padding: 0 12px 16px;
+ }
+
+ .footer-shell {
+ border-radius: 26px;
+ }
+
+ .footer-main {
+ padding: 22px 18px 18px;
+ }
+
+ .footer-links {
+ grid-template-columns: 1fr;
+ }
+
+ .footer-bottom {
+ padding: 16px 18px 20px;
+ }
+
+ .copyright-links {
+ flex-direction: column;
+ gap: 4px;
+ }
+}
diff --git a/frontend/src/components/Footer.jsx b/frontend/src/components/Footer.jsx
index d3e03f5..6eafd28 100644
--- a/frontend/src/components/Footer.jsx
+++ b/frontend/src/components/Footer.jsx
@@ -1,107 +1,137 @@
-import { Row, Col, Input, Button, Divider } from 'antd';
-import { MailOutlined, QrcodeOutlined } from '@ant-design/icons';
-import { useNavigate } from 'react-router-dom';
-import './Footer.css';
-
-const Footer = () => {
- const navigate = useNavigate();
-
- const navLinks = [
- { title: '网站协议', url: '/protocol' },
- { title: '支付协议', url: '/pay-protocol' },
- { title: '版权声明', url: '/copyright' },
- ];
-
- const navLinks2 = [
- { title: '帮助中心', url: '/help' },
- { title: '供稿必读', url: '/upload-guide' },
- ];
-
- const handleLinkClick = (url) => {
- navigate(url);
- };
-
- return (
-
- );
-};
-
-export default Footer;
+import {
+ MailOutlined,
+ SafetyCertificateOutlined,
+ FileTextOutlined,
+ QuestionCircleOutlined,
+ UploadOutlined,
+ GlobalOutlined,
+ MessageOutlined,
+} from '@ant-design/icons';
+import { useNavigate } from 'react-router-dom';
+import './Footer.css';
+
+const Footer = () => {
+ const navigate = useNavigate();
+
+ const productLinks = [
+ { title: '网站协议', url: '/protocol', icon:
},
+ { title: '支付协议', url: '/pay-protocol', icon:
},
+ { title: '版权声明', url: '/copyright', icon:
},
+ ];
+
+ const helpLinks = [
+ { title: '帮助中心', url: '/help', icon:
},
+ { title: '供稿必读', url: '/upload-guide', icon:
},
+ ];
+
+ const handleLinkClick = (url) => {
+ navigate(url);
+ };
+
+ return (
+
+ );
+};
+
+export default Footer;
diff --git a/frontend/src/pages/CategoryDetail.css b/frontend/src/pages/CategoryDetail.css
index 0ead4cb..a587896 100644
--- a/frontend/src/pages/CategoryDetail.css
+++ b/frontend/src/pages/CategoryDetail.css
@@ -1,121 +1,154 @@
-.category-detail-page {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
-}
-
-.category-detail-hero {
- height: 350px;
- position: relative;
- display: flex;
- align-items: center;
- justify-content: center;
- color: white;
-}
-
-.category-detail-overlay {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.3);
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 20px;
-}
-
-.back-btn {
- position: absolute;
- top: 90px;
- left: 40px;
- background: rgba(255, 255, 255, 0.9);
- border: none;
- color: #333;
- font-weight: 500;
- height: 40px;
- padding: 0 20px;
- transition: all 0.3s ease;
-}
-
-.back-btn:hover {
- background: white !important;
- color: #ff5a5a !important;
- transform: translateX(-5px);
-}
-
-.category-detail-content {
- text-align: center;
- animation: fadeInUp 0.8s ease;
-}
-
-.category-detail-title {
- font-size: 56px;
- font-weight: 700;
- margin: 0;
- text-shadow: 2px 2px 20px rgba(0, 0, 0, 0.3);
- animation: scaleIn 0.6s ease;
-}
-
-.category-detail-count {
- font-size: 20px;
- margin-top: 16px;
- opacity: 0.95;
- text-shadow: 1px 1px 10px rgba(0, 0, 0, 0.2);
-}
-
-.category-detail-works {
- flex: 1;
- padding: 40px 0;
- background: #f8f9fa;
-}
-
-@keyframes fadeInUp {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-@keyframes scaleIn {
- from {
- opacity: 0;
- transform: scale(0.8);
- }
- to {
- opacity: 1;
- transform: scale(1);
- }
-}
-
-@media (max-width: 768px) {
- .category-detail-hero {
- height: 250px;
- }
-
- .back-btn {
- top: 70px;
- left: 20px;
- height: 36px;
- padding: 0 16px;
- font-size: 14px;
- }
-
- .category-detail-title {
- font-size: 36px;
- }
-
- .category-detail-count {
- font-size: 16px;
- }
-
- .category-detail-works {
- padding: 30px 0;
- }
-}
+.category-detail-page {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ background:
+ radial-gradient(circle at top left, rgba(239, 106, 91, 0.08), transparent 24%),
+ linear-gradient(180deg, #fffdf9 0%, #f8f2eb 100%);
+}
+
+.category-detail-hero {
+ position: relative;
+ min-height: 360px;
+ margin: 88px 20px 0;
+ border-radius: 34px;
+ overflow: hidden;
+ box-shadow: 0 28px 64px rgba(66, 42, 26, 0.14);
+}
+
+.category-detail-overlay {
+ min-height: 360px;
+ padding: 28px 32px 34px;
+ background:
+ linear-gradient(120deg, rgba(16, 14, 12, 0.18), transparent 36%),
+ linear-gradient(180deg, rgba(32, 23, 17, 0.1), rgba(32, 23, 17, 0.24));
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ color: #fff;
+}
+
+.back-btn.ant-btn {
+ position: absolute;
+ top: 24px;
+ left: 24px;
+ height: 42px;
+ padding: 0 18px;
+ border-radius: 16px;
+ border: none;
+ background: rgba(255, 255, 255, 0.18);
+ color: #fff;
+ backdrop-filter: blur(12px);
+}
+
+.back-btn.ant-btn:hover {
+ color: #fff !important;
+ background: rgba(255, 255, 255, 0.24) !important;
+}
+
+.category-detail-content {
+ max-width: 840px;
+}
+
+.category-detail-kicker {
+ display: inline-flex;
+ margin-bottom: 14px;
+ padding: 8px 12px;
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.18);
+ border: 1px solid rgba(255, 255, 255, 0.22);
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+}
+
+.category-detail-title {
+ margin: 0;
+ font-size: clamp(40px, 6vw, 64px);
+ line-height: 1.05;
+}
+
+.category-detail-desc {
+ max-width: 680px;
+ margin: 14px 0 0;
+ font-size: 16px;
+ line-height: 1.85;
+ color: rgba(255, 255, 255, 0.9);
+}
+
+.category-detail-stats {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 14px;
+ margin-top: 24px;
+}
+
+.category-stat {
+ display: grid;
+ grid-template-columns: 44px minmax(0, 1fr);
+ gap: 12px;
+ padding: 16px;
+ border-radius: 20px;
+ background: rgba(255, 255, 255, 0.16);
+ border: 1px solid rgba(255, 255, 255, 0.18);
+ backdrop-filter: blur(10px);
+}
+
+.category-stat .anticon {
+ width: 44px;
+ height: 44px;
+ border-radius: 16px;
+ display: grid;
+ place-items: center;
+ background: rgba(255, 255, 255, 0.18);
+ font-size: 18px;
+}
+
+.category-stat strong {
+ display: block;
+ font-size: 22px;
+}
+
+.category-stat span {
+ display: block;
+ margin-top: 4px;
+ font-size: 12px;
+ color: rgba(255, 255, 255, 0.78);
+}
+
+.category-detail-works {
+ flex: 1;
+ padding: 26px 0 18px;
+}
+
+@media (max-width: 900px) {
+ .category-detail-stats {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 768px) {
+ .category-detail-hero {
+ margin: 82px 12px 0;
+ min-height: 320px;
+ border-radius: 28px;
+ }
+
+ .category-detail-overlay {
+ min-height: 320px;
+ padding: 24px 18px 24px;
+ }
+
+ .back-btn.ant-btn {
+ top: 18px;
+ left: 18px;
+ }
+
+ .category-detail-title {
+ font-size: 38px;
+ }
+
+ .category-detail-desc {
+ font-size: 14px;
+ }
+}
diff --git a/frontend/src/pages/CategoryDetail.jsx b/frontend/src/pages/CategoryDetail.jsx
index 03cf0f7..8a1c7a6 100644
--- a/frontend/src/pages/CategoryDetail.jsx
+++ b/frontend/src/pages/CategoryDetail.jsx
@@ -1,56 +1,113 @@
-import { useParams, useNavigate } from 'react-router-dom';
-import { Button } from 'antd';
-import { LeftOutlined } from '@ant-design/icons';
-import Header from '../components/Header';
-import Footer from '../components/Footer';
-import Works from '../components/Works';
-import './CategoryDetail.css';
-
-const CategoryDetail = () => {
- const { name } = useParams();
- const navigate = useNavigate();
-
- // 分类数据映射
- const categoryData = {
- '文化墙': { count: '6572', gradient: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' },
- '周年庆': { count: '15868', gradient: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)' },
- '直播': { count: '35429', gradient: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)' },
- '包装': { count: '9533', gradient: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)' },
- '科技': { count: '44921', gradient: 'linear-gradient(135deg, #0c3483 0%, #a2b6df 100%)' },
- '活动': { count: '408131', gradient: 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)' },
- '医美': { count: '223068', gradient: 'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)' },
- '邀请函': { count: '15361', gradient: 'linear-gradient(135deg, #d299c2 0%, #fef9d7 100%)' },
- };
-
- const category = categoryData[name];
-
- return (
-
-
-
-
-
-
}
- className="back-btn"
- onClick={() => navigate('/')}
- >
- 返回首页
-
-
-
{name}
-
共 {category?.count} 张作品
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default CategoryDetail;
+import { useParams, useNavigate } from 'react-router-dom';
+import { Button } from 'antd';
+import { LeftOutlined, AppstoreOutlined, FireOutlined, EyeOutlined } from '@ant-design/icons';
+import Header from '../components/Header';
+import Footer from '../components/Footer';
+import Works from '../components/Works';
+import './CategoryDetail.css';
+
+const CategoryDetail = () => {
+ const { name } = useParams();
+ const navigate = useNavigate();
+
+ const categoryData = {
+ 文化墙: {
+ count: '6572',
+ gradient: 'linear-gradient(135deg, #d9755d 0%, #f2bb7c 100%)',
+ description: '适合企业形象、品牌理念和空间场景布置的长图与信息展示素材。',
+ },
+ 周年庆: {
+ count: '15868',
+ gradient: 'linear-gradient(135deg, #e17baa 0%, #f7c46c 100%)',
+ description: '围绕纪念日、店庆、品牌里程碑等主题的高频视觉物料。',
+ },
+ 直播: {
+ count: '35429',
+ gradient: 'linear-gradient(135deg, #4a8ee8 0%, #57d3e2 100%)',
+ description: '直播预告、封面、流程页和互动氛围图的整套素材集合。',
+ },
+ 包装: {
+ count: '9533',
+ gradient: 'linear-gradient(135deg, #2f8f73 0%, #86d6b2 100%)',
+ description: '包装延展、产品展示和品牌包装视觉的常用内容。',
+ },
+ 科技: {
+ count: '44921',
+ gradient: 'linear-gradient(135deg, #4356a8 0%, #7eb0da 100%)',
+ description: '偏未来感、信息感和产品感表达的科技类视觉素材。',
+ },
+ 活动: {
+ count: '408131',
+ gradient: 'linear-gradient(135deg, #ffb38a 0%, #ef6a5b 100%)',
+ description: '最适合首页承接的热门分类之一,覆盖促销、开业和节点营销素材。',
+ },
+ 医美: {
+ count: '223068',
+ gradient: 'linear-gradient(135deg, #f0a6b4 0%, #f7d6df 100%)',
+ description: '轻医美、抗衰、项目卖点和机构宣传类视觉内容。',
+ },
+ 邀请函: {
+ count: '15361',
+ gradient: 'linear-gradient(135deg, #a87ab8 0%, #ead9f3 100%)',
+ description: '会议、婚礼、活动和品牌邀约相关的正式视觉模板。',
+ },
+ };
+
+ const category = categoryData[name] || {
+ count: '0',
+ gradient: 'linear-gradient(135deg, #d9755d 0%, #f2bb7c 100%)',
+ description: '当前分类正在持续补充中,可以先浏览已上线的作品内容。',
+ };
+
+ return (
+
+
+
+
+
+
} className="back-btn" onClick={() => navigate('/')}>
+ 返回首页
+
+
+
+
分类精选
+
{name}
+
{category.description}
+
+
+
+
+
+ {category.count}
+ 作品总量
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default CategoryDetail;