- {news.excerpt} -
+ ++ {news.excerpt} +
+- 相关新闻 -
-相关新闻
++ {related.title} +
+{related.excerpt}
- {related.title} -
-- {related.excerpt} -
-News
++ 新闻动态 +
++ 了解睿新致远最新动态,把握行业发展脉搏 +
+没有找到相关新闻
-没有找到相关新闻
+
+
{newsItem.title}
-
+
{newsItem.excerpt}
-{product.category}
diff --git a/src/app/(marketing)/products/layout.tsx b/src/app/(marketing)/products/layout.tsx
new file mode 100644
index 0000000..b8149a6
--- /dev/null
+++ b/src/app/(marketing)/products/layout.tsx
@@ -0,0 +1,11 @@
+import { Metadata } from 'next';
+import { COMPANY_INFO } from '@/lib/constants';
+
+export const metadata: Metadata = {
+ title: `产品 - ${COMPANY_INFO.shortName}`,
+ description: `自主研发的企业级产品,助力企业高效运营,实现数字化转型。${COMPANY_INFO.shortName}提供ERP、CRM、BI、CMS等产品。`,
+};
+
+export default function ProductsLayout({ children }: { children: React.ReactNode }) {
+ return children;
+}
diff --git a/src/app/(marketing)/products/page.tsx b/src/app/(marketing)/products/page.tsx
index 269f7c6..82b63db 100644
--- a/src/app/(marketing)/products/page.tsx
+++ b/src/app/(marketing)/products/page.tsx
@@ -6,12 +6,14 @@ import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { ArrowRight } from 'lucide-react';
import { motion } from 'framer-motion';
+import { PageNav } from '@/components/layout/page-nav';
export default function ProductsPage() {
return (
+
Products
- 产品服务
+ 产品
自主研发的企业级产品,助力企业高效运营,实现数字化转型
diff --git a/src/app/(marketing)/services/[id]/client.tsx b/src/app/(marketing)/services/[id]/client.tsx
index 121047a..3b175a2 100644
--- a/src/app/(marketing)/services/[id]/client.tsx
+++ b/src/app/(marketing)/services/[id]/client.tsx
@@ -2,17 +2,16 @@
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
-import { BackButton } from '@/components/ui/back-button';
+import { PageNav } from '@/components/layout/page-nav';
import {
CheckCircle2,
TrendingUp,
- Users,
Target,
Clock,
MessageCircle,
ArrowRight,
} from 'lucide-react';
-import { SERVICES, CASES } from '@/lib/constants';
+import { SERVICES } from '@/lib/constants';
interface ServiceDetailClientProps {
service: typeof SERVICES[number];
@@ -47,39 +46,38 @@ const challenges: Record = {
const outcomes: Record = {
software: [
- { value: '30%', label: '开发效率提升' },
- { value: '50%', label: '返工率降低' },
- { value: '100%', label: '按时交付率' },
+ { value: '30%+', label: '预期开发效率提升' },
+ { value: '50%+', label: '预期返工率降低' },
+ { value: '严格', label: '交付质量把控' },
],
data: [
- { value: '70%', label: '决策效率提升' },
{ value: '实时', label: '数据更新' },
- { value: '100+', label: '可视化报表' },
+ { value: '自助式', label: '分析模式' },
+ { value: '多维度', label: '可视化报表' },
],
consulting: [
- { value: '60%', label: '方向明确度' },
- { value: '40%', label: '试错成本降低' },
- { value: '3x', label: '转型速度提升' },
+ { value: '清晰', label: '转型方向规划' },
+ { value: '系统化', label: '技术选型评估' },
+ { value: '可落地', label: '实施路径设计' },
],
solutions: [
- { value: '50%', label: '实施周期缩短' },
- { value: '30%', label: '成本降低' },
- { value: '95%', label: '客户满意度' },
+ { value: '标准化', label: '行业方案交付' },
+ { value: '端到端', label: '全流程实施' },
+ { value: '持续化', label: '运维优化支持' },
],
};
export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
const serviceChallenges = challenges[service.id] ?? [];
const serviceOutcomes = outcomes[service.id] ?? [];
- const relatedCases = CASES.slice(0, 2);
return (
-
+
- 核心业务
+ Services
{service.title}
@@ -178,32 +176,6 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
-
-
-
-
-
- 相关案例
-
-
- {relatedCases.map((caseItem) => (
-
- {caseItem.industry}
-
- {caseItem.title}
-
-
- {caseItem.description}
-
-
- ))}
-
-
-
diff --git a/src/app/(marketing)/services/layout.tsx b/src/app/(marketing)/services/layout.tsx
new file mode 100644
index 0000000..1159a48
--- /dev/null
+++ b/src/app/(marketing)/services/layout.tsx
@@ -0,0 +1,11 @@
+import { Metadata } from 'next';
+import { COMPANY_INFO } from '@/lib/constants';
+
+export const metadata: Metadata = {
+ title: `服务 - ${COMPANY_INFO.shortName}`,
+ description: `专业技术团队,为您提供全方位的数字化解决方案。${COMPANY_INFO.shortName}涵盖软件开发、数据分析、咨询服务等核心业务。`,
+};
+
+export default function ServicesLayout({ children }: { children: React.ReactNode }) {
+ return children;
+}
diff --git a/src/app/(marketing)/services/page.tsx b/src/app/(marketing)/services/page.tsx
index 7ea30b9..a38a096 100644
--- a/src/app/(marketing)/services/page.tsx
+++ b/src/app/(marketing)/services/page.tsx
@@ -5,12 +5,14 @@ import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { ArrowRight, ArrowUpRight } from 'lucide-react';
import { motion } from 'framer-motion';
+import { PageNav } from '@/components/layout/page-nav';
export default function ServicesPage() {
return (
+
Services
- 核心业务
+ 服务
专业技术团队,为您提供全方位的数字化解决方案
diff --git a/src/app/(marketing)/solutions/[id]/client.tsx b/src/app/(marketing)/solutions/[id]/client.tsx
new file mode 100644
index 0000000..64e0dca
--- /dev/null
+++ b/src/app/(marketing)/solutions/[id]/client.tsx
@@ -0,0 +1,133 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { StaticLink } from '@/components/ui/static-link';
+import { Button } from '@/components/ui/button';
+import { PageNav } from '@/components/layout/page-nav';
+import { ArrowRight, AlertTriangle, CheckCircle2, Package } from 'lucide-react';
+import type { Solution } from '@/lib/constants/solutions';
+import type { Product } from '@/lib/constants/products';
+
+interface SolutionDetailClientProps {
+ solution: Solution;
+ relatedProducts: Product[];
+}
+
+export function SolutionDetailClient({ solution, relatedProducts }: SolutionDetailClientProps) {
+ return (
+
+
+
+
+
+
+ {solution.industry}
+
+
+ {solution.title}
+
+ {solution.subtitle}
+
+ {solution.description}
+
+
+
+
+
+
+
+
+
+
+ 行业痛点
+
+
+ {solution.challenges.map((challenge, index) => (
+
+ {challenge}
+
+ ))}
+
+
+
+
+
+
+ 解决方案
+
+
+ {solution.solutions.map((sol, index) => (
+
+
+ {index + 1}
+
+ {sol}
+
+ ))}
+
+
+
+ {relatedProducts.length > 0 && (
+
+
+
+ 相关产品
+
+
+ {relatedProducts.map((product) => (
+
+
+ {product.title}
+
+
+ {product.description}
+
+
+ ))}
+
+
+ )}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/(marketing)/solutions/[id]/page.tsx b/src/app/(marketing)/solutions/[id]/page.tsx
new file mode 100644
index 0000000..40b90ae
--- /dev/null
+++ b/src/app/(marketing)/solutions/[id]/page.tsx
@@ -0,0 +1,38 @@
+import { Metadata } from 'next';
+import { notFound } from 'next/navigation';
+import { SOLUTIONS } from '@/lib/constants/solutions';
+import { PRODUCTS } from '@/lib/constants/products';
+import { SolutionDetailClient } from './client';
+
+export async function generateStaticParams() {
+ return SOLUTIONS.map((solution) => ({
+ id: solution.id,
+ }));
+}
+
+export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise {
+ const { id } = await params;
+ const solution = SOLUTIONS.find((s) => s.id === id);
+
+ if (!solution) {
+ return { title: '解决方案未找到' };
+ }
+
+ return {
+ title: `${solution.title} - 睿新致远`,
+ description: solution.description,
+ };
+}
+
+export default async function SolutionDetailPage({ params }: { params: Promise<{ id: string }> }) {
+ const { id } = await params;
+ const solution = SOLUTIONS.find((s) => s.id === id);
+
+ if (!solution) {
+ notFound();
+ }
+
+ const relatedProducts = PRODUCTS.filter((p) => solution.relatedProducts.includes(p.id));
+
+ return ;
+}
diff --git a/src/app/(marketing)/solutions/page.tsx b/src/app/(marketing)/solutions/page.tsx
index 74c1d0e..3e96bed 100644
--- a/src/app/(marketing)/solutions/page.tsx
+++ b/src/app/(marketing)/solutions/page.tsx
@@ -5,6 +5,7 @@ import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { ArrowRight, Lightbulb, Cpu, Users, CheckCircle2 } from 'lucide-react';
import { MethodologySection } from '@/components/sections/methodology-section';
+import { PageNav } from '@/components/layout/page-nav';
const modules = [
{
@@ -30,7 +31,7 @@ const modules = [
'您不必懂技术原理,只需要看见业务在增长。',
],
values: ['业务场景深度调研', '技术方案定制开发', '敏捷交付快速迭代'],
- cta: '查看技术案例',
+ cta: '了解技术方案',
ctaVariant: 'outline' as const,
},
{
@@ -53,6 +54,7 @@ export default function SolutionsPage() {
+
- {modules.map((module, index) => (
+ {modules.map((module, index) => {
+ const anchorIds = ['consulting', 'tech', 'accompany'];
+ return (
- ))}
+ );
+ })}
diff --git a/src/app/(marketing)/team/client.tsx b/src/app/(marketing)/team/client.tsx
index 15554ae..cdf7045 100644
--- a/src/app/(marketing)/team/client.tsx
+++ b/src/app/(marketing)/team/client.tsx
@@ -1,12 +1,10 @@
'use client';
import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
-import { useRef } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
-import { PageHeader } from '@/components/ui/page-header';
import { Shield, Building2, Users, Code, Target, ArrowRight } from 'lucide-react';
+import { PageNav } from '@/components/layout/page-nav';
const TEAM_PILLARS = [
{
@@ -37,89 +35,105 @@ const TEAM_PILLARS = [
];
export function TeamClient() {
- const contentRef = useRef(null);
- const isContentInView = useInView(contentRef, { once: true, margin: '-100px' });
-
return (
-
-
-
-
- {/* 团队概述 */}
+
+
+
- 关于我们的团队
-
-
- 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
-
-
- 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
-
-
- 我们相信,优秀的技术咨询不仅需要过硬的技术能力,更需要深入理解客户的业务场景和真实需求。
- 每一位成员都是既懂技术又懂业务的复合型人才。
-
-
+ Team
+
+ 核心团队
+
+
+ 核心团队从事技术咨询、企业数字化等行业 12 年+,开发团队成员来自于多个大型传统 IT 企业
+
+
+
- {/* 团队优势 */}
-
- 团队优势
-
- {TEAM_PILLARS.map((item, idx) => {
- const Icon = item.icon;
- return (
- = 3 ? 'md:col-span-1 lg:col-start-1' : ''}
- >
-
-
-
+
+
+
+
+ 关于我们的团队
+
+
+ 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
+
+
+ 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
+
+
+ 我们相信,优秀的技术咨询不仅需要过硬的技术能力,更需要深入理解客户的业务场景和真实需求。
+ 每一位成员都是既懂技术又懂业务的复合型人才。
+
+
+
+
+
+ 团队优势
+
+ {TEAM_PILLARS.map((item, idx) => {
+ const Icon = item.icon;
+ return (
+ = 3 ? 'md:col-span-1 lg:col-start-1' : ''}
+ >
+
+
+
+
+
+ {item.title}
+ {item.description}
+
- {item.title}
- {item.description}
-
-
- );
- })}
-
-
+
+ );
+ })}
+
+
- {/* CTA */}
-
- 想与我们的团队交流?
-
-
-
-
+
+ 想与我们的团队交流?
+
+
+
+
+
);
}
diff --git a/src/app/error.tsx b/src/app/error.tsx
index c305242..d1ee083 100644
--- a/src/app/error.tsx
+++ b/src/app/error.tsx
@@ -98,7 +98,7 @@ export default function Error({
- 核心业务
+ 服务
了解我们的服务
diff --git a/src/app/globals.css b/src/app/globals.css
index e1dedbf..2bdb055 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1164,6 +1164,56 @@ body {
}
}
+/* 墨韵流光 - 旋转渐变边框 */
+@property --border-angle {
+ syntax: '';
+ initial-value: 0deg;
+ inherits: false;
+}
+
+@keyframes rotateBorder {
+ from { --border-angle: 0deg; }
+ to { --border-angle: 360deg; }
+}
+
+.ink-glow-border {
+ animation: rotateBorder 4s linear infinite;
+}
+
+.ink-glow-border::before {
+ content: '';
+ position: absolute;
+ inset: -1px;
+ border-radius: inherit;
+ padding: 1px;
+ background: conic-gradient(from var(--border-angle), var(--glow-start), var(--glow-end), var(--glow-start));
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
+ -webkit-mask-composite: xor;
+ mask-composite: exclude;
+ opacity: 0;
+ transition: opacity 0.5s ease;
+}
+
+.ink-glow-border:hover::before {
+ opacity: 1;
+}
+
+.ink-glow-border::after {
+ content: '';
+ position: absolute;
+ inset: -4px;
+ border-radius: inherit;
+ background: conic-gradient(from var(--border-angle), var(--glow-start), var(--glow-end), var(--glow-start));
+ filter: blur(12px);
+ opacity: 0;
+ transition: opacity 0.5s ease;
+ z-index: -1;
+}
+
+.ink-glow-border:hover::after {
+ opacity: 0.3;
+}
+
/* 平板端优化 (768px - 1023px) */
@media (min-width: 768px) and (max-width: 1023px) {
.container-wide,
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index 997c357..27df852 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -74,7 +74,7 @@ export default function NotFound() {
- 核心业务
+ 服务
我们的服务
@@ -87,21 +87,21 @@ export default function NotFound() {
- 产品服务
+ 产品
企业级产品
- 成功案例
- 客户故事
+ 解决方案
+ 行业方案
diff --git a/src/components/layout/footer.test.tsx b/src/components/layout/footer.test.tsx
index ebfd360..09a5006 100644
--- a/src/components/layout/footer.test.tsx
+++ b/src/components/layout/footer.test.tsx
@@ -45,9 +45,8 @@ jest.mock('@/lib/constants', () => ({
NAVIGATION: [
{ id: 'home', label: '首页', href: '/' },
{ id: 'services', label: '服务', href: '/#services' },
- { id: 'products', label: '产品', href: '/#products' },
- { id: 'cases', label: '案例', href: '/#cases' },
- { id: 'about', label: '关于', href: '/#about' },
+ { id: 'products', label: '产品', href: '/products' },
+ { id: 'about', label: '关于', href: '/about' },
{ id: 'contact', label: '联系', href: '/contact' },
],
}));
diff --git a/src/components/layout/footer.tsx b/src/components/layout/footer.tsx
index d3b6800..5f82a30 100644
--- a/src/components/layout/footer.tsx
+++ b/src/components/layout/footer.tsx
@@ -11,11 +11,10 @@ export function Footer() {
@@ -55,7 +54,7 @@ export function Footer() {
- 产品服务
+ 产品
{(MEGA_DROPDOWN_DATA.products ?? []).map((item) => (
-
@@ -111,7 +110,7 @@ export function Footer() {
-
+
© {new Date().getFullYear()} {COMPANY_INFO.name}. All rights reserved.
@@ -127,28 +126,28 @@ export function Footer() {
-
+
{COMPANY_INFO.icp}
- |
+ |
{COMPANY_INFO.police}
diff --git a/src/components/layout/header.test.tsx b/src/components/layout/header.test.tsx
index b1e73bb..2b82ecf 100644
--- a/src/components/layout/header.test.tsx
+++ b/src/components/layout/header.test.tsx
@@ -60,9 +60,8 @@ jest.mock('@/lib/constants', () => ({
NAVIGATION: [
{ id: 'home', label: '首页', href: '/' },
{ id: 'services', label: '服务', href: '/#services' },
- { id: 'products', label: '产品', href: '/#products' },
- { id: 'cases', label: '案例', href: '/#cases' },
- { id: 'about', label: '关于', href: '/#about' },
+ { id: 'products', label: '产品', href: '/products' },
+ { id: 'about', label: '关于', href: '/about' },
{ id: 'contact', label: '联系', href: '/contact' },
],
}));
@@ -104,7 +103,6 @@ describe('Header', () => {
expect(screen.getByText('首页')).toBeInTheDocument();
expect(screen.getByText('服务')).toBeInTheDocument();
expect(screen.getByText('产品')).toBeInTheDocument();
- expect(screen.getByText('案例')).toBeInTheDocument();
expect(screen.getByText('关于')).toBeInTheDocument();
expect(screen.getByText('联系')).toBeInTheDocument();
});
diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx
index 5628907..cd75eb9 100644
--- a/src/components/layout/header.tsx
+++ b/src/components/layout/header.tsx
@@ -1,9 +1,9 @@
'use client';
-import { Suspense, useState, useEffect, useCallback, useRef } from 'react';
+import { Suspense, useState, useEffect, useCallback } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import Image from 'next/image';
-import { usePathname, useSearchParams } from 'next/navigation';
+import { usePathname } from 'next/navigation';
import { Menu, X } from 'lucide-react';
import { AnimatePresence, motion } from 'framer-motion';
import { Button } from '@/components/ui/button';
@@ -11,58 +11,16 @@ import { COMPANY_INFO, NAVIGATION_V2, MEGA_DROPDOWN_DATA, type NavigationItemV2
import { MegaDropdown } from '@/components/layout/mega-dropdown';
import { useFocusTrap } from '@/hooks/use-focus-trap';
-declare global {
- interface Window {
- __isProgrammaticScroll?: boolean;
- }
-}
-
function HeaderContent() {
const [isOpen, setIsOpen] = useState(false);
const [isScrolled, setIsScrolled] = useState(false);
const [openDropdown, setOpenDropdown] = useState(null);
const pathname = usePathname();
- const searchParams = useSearchParams();
const focusTrapRef = useFocusTrap(isOpen);
- const isScrollingRef = useRef(false);
- const scrollTimeoutRef = useRef(null);
-
- const getActiveSection = useCallback(() => {
- if (pathname === '/contact') {return 'contact';}
- if (pathname === '/') {
- const section = searchParams.get('section');
- return section || 'home';
- }
- return '';
- }, [pathname, searchParams]);
-
- const activeSection = getActiveSection();
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 20);
-
- if (pathname === '/' && !isScrollingRef.current && !window.__isProgrammaticScroll) {
- const scrollPosition = window.scrollY + 100;
- const sections = ['home', 'services', 'solutions', 'products', 'cases', 'about', 'team', 'news'];
-
- for (const sectionId of sections) {
- const element = document.getElementById(sectionId);
- if (element) {
- const offsetTop = element.offsetTop;
- const offsetHeight = element.offsetHeight;
-
- if (scrollPosition >= offsetTop && scrollPosition < offsetTop + offsetHeight) {
- const currentSection = searchParams.get('section') || 'home';
- if (currentSection !== sectionId) {
- const url = sectionId === 'home' ? '/' : `/?section=${sectionId}`;
- window.history.replaceState(null, '', url);
- }
- break;
- }
- }
- }
- }
};
const handleGlobalKeyDown = (e: KeyboardEvent) => {
@@ -77,11 +35,8 @@ function HeaderContent() {
return () => {
window.removeEventListener('scroll', handleScroll);
window.removeEventListener('keydown', handleGlobalKeyDown);
- if (scrollTimeoutRef.current) {
- clearTimeout(scrollTimeoutRef.current);
- }
};
- }, [pathname, isOpen, searchParams]);
+ }, [isOpen]);
const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
if (e.key === 'Enter' || e.key === ' ') {
@@ -95,57 +50,25 @@ function HeaderContent() {
const handleNavClick = useCallback((e: React.MouseEvent, item: NavigationItemV2) => {
e.preventDefault();
-
- if (item.id === 'contact') {
- window.location.href = '/contact';
- } else if (item.id === 'home') {
- if (pathname === '/') {
- isScrollingRef.current = true;
- window.scrollTo({ top: 0, behavior: 'smooth' });
- window.history.pushState(null, '', '/');
-
- scrollTimeoutRef.current = setTimeout(() => {
- isScrollingRef.current = false;
- }, 1000);
- } else {
- window.location.href = '/';
- }
- } else {
- if (pathname === '/') {
- const scrollToSection = (retryCount = 0) => {
- const element = document.getElementById(item.id);
- if (element) {
- isScrollingRef.current = true;
- element.scrollIntoView({ behavior: 'smooth', block: 'start' });
- window.history.pushState(null, '', `/?section=${item.id}`);
-
- scrollTimeoutRef.current = setTimeout(() => {
- isScrollingRef.current = false;
- }, 1000);
- } else if (retryCount < 10) {
- setTimeout(() => scrollToSection(retryCount + 1), 100);
- }
- };
- scrollToSection();
- } else {
- window.location.href = `/?section=${item.id}`;
- }
- }
-
+ window.location.href = item.href;
setIsOpen(false);
- }, [pathname]);
+ }, []);
const isActive = useCallback((item: NavigationItemV2) => {
if (item.id === 'contact') {
return pathname === '/contact';
}
-
- if (pathname === '/') {
- return activeSection === item.id;
+ if (item.id === 'home') {
+ return pathname === '/';
}
-
- return false;
- }, [pathname, activeSection]);
+ if (item.id === 'products') {
+ return pathname === '/products' || pathname.startsWith('/products/');
+ }
+ if (item.id === 'solutions') {
+ return pathname === '/solutions' || pathname.startsWith('/solutions/');
+ }
+ return pathname === `/${item.id}`;
+ }, [pathname]);
return (
<>
@@ -169,9 +92,9 @@ function HeaderContent() {
diff --git a/src/components/layout/mega-dropdown.tsx b/src/components/layout/mega-dropdown.tsx
index 9b30c2b..7b93c9a 100644
--- a/src/components/layout/mega-dropdown.tsx
+++ b/src/components/layout/mega-dropdown.tsx
@@ -30,7 +30,14 @@ export function MegaDropdown({ label, items, isOpen, onToggle }: MegaDropdownPro
Products
- 产品服务 + 产品
自主研发的企业级产品,助力企业高效运营,实现数字化转型
diff --git a/src/app/(marketing)/services/[id]/client.tsx b/src/app/(marketing)/services/[id]/client.tsx
index 121047a..3b175a2 100644
--- a/src/app/(marketing)/services/[id]/client.tsx
+++ b/src/app/(marketing)/services/[id]/client.tsx
@@ -2,17 +2,16 @@
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
-import { BackButton } from '@/components/ui/back-button';
+import { PageNav } from '@/components/layout/page-nav';
import {
CheckCircle2,
TrendingUp,
- Users,
Target,
Clock,
MessageCircle,
ArrowRight,
} from 'lucide-react';
-import { SERVICES, CASES } from '@/lib/constants';
+import { SERVICES } from '@/lib/constants';
interface ServiceDetailClientProps {
service: typeof SERVICES[number];
@@ -47,39 +46,38 @@ const challenges: Record 核心业务 Services {caseItem.industry}
- {caseItem.description}
- Services
专业技术团队,为您提供全方位的数字化解决方案
diff --git a/src/app/(marketing)/solutions/[id]/client.tsx b/src/app/(marketing)/solutions/[id]/client.tsx
new file mode 100644
index 0000000..64e0dca
--- /dev/null
+++ b/src/app/(marketing)/solutions/[id]/client.tsx
@@ -0,0 +1,133 @@
+'use client';
+
+import { motion } from 'framer-motion';
+import { StaticLink } from '@/components/ui/static-link';
+import { Button } from '@/components/ui/button';
+import { PageNav } from '@/components/layout/page-nav';
+import { ArrowRight, AlertTriangle, CheckCircle2, Package } from 'lucide-react';
+import type { Solution } from '@/lib/constants/solutions';
+import type { Product } from '@/lib/constants/products';
+
+interface SolutionDetailClientProps {
+ solution: Solution;
+ relatedProducts: Product[];
+}
+
+export function SolutionDetailClient({ solution, relatedProducts }: SolutionDetailClientProps) {
+ return (
+
+ {solution.industry}
+ {solution.subtitle}
+ {solution.description}
+ {sol}
+ {product.description}
+
- 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
-
- 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
-
- 我们相信,优秀的技术咨询不仅需要过硬的技术能力,更需要深入理解客户的业务场景和真实需求。
- 每一位成员都是既懂技术又懂业务的复合型人才。
- Team
+ 核心团队从事技术咨询、企业数字化等行业 12 年+,开发团队成员来自于多个大型传统 IT 企业
+
+ 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
+
+ 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
+
+ 我们相信,优秀的技术咨询不仅需要过硬的技术能力,更需要深入理解客户的业务场景和真实需求。
+ 每一位成员都是既懂技术又懂业务的复合型人才。
+ {item.description} {item.description} 想与我们的团队交流? 想与我们的团队交流?
© {new Date().getFullYear()} {COMPANY_INFO.name}. All rights reserved.
@@ -127,28 +126,28 @@ export function Footer() {
{service.title}
@@ -178,32 +176,6 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
相关案例
-
- {caseItem.title}
-
-
- 核心业务
+ 服务
+ {solution.title}
+
+
+
+
+
+
+
+
+ {product.title}
+
+ 关于我们的团队
-
+ 核心团队
+
+ 团队优势
- 关于我们的团队
+ 团队优势
+ {item.title}
+ {item.title}
- 产品服务
+ 产品
{(MEGA_DROPDOWN_DATA.products ?? []).map((item) => (