feat(products): refine page copy and retarget primary CTA to /services

产品列表页文案与转化打磨:Hero 改为「自研产品矩阵 × 数字化核心系统」并聚焦
价值主张;主 CTA 由预约接待改为「了解我们的服务」并落点到 /services(次 CTA
保持 /solutions 查看行业方案);CTA 区文案「以自研产品支撑数字化落地」+ 组合
方案入口改为 /solutions。同步更新集成测试断言。
This commit is contained in:
2026-08-19 14:47:19 +08:00
parent 08f19ad6ca
commit 30018bf94a
2 changed files with 21 additions and 21 deletions
@@ -212,15 +212,15 @@ describe('ProductsContentV3 - 产品列表页集成测试', () => {
const { default: ProductsContentV3 } = await import('./products-content-v3');
render(<ProductsContentV3 products={allMockProducts} />);
expect(screen.getByText('自研产品组合')).toBeInTheDocument();
expect(screen.getByText('核心系统升级')).toBeInTheDocument();
expect(screen.getByText('自研产品矩阵')).toBeInTheDocument();
expect(screen.getByText('数字化核心系统')).toBeInTheDocument();
});
it('should render hero description text', async () => {
const { default: ProductsContentV3 } = await import('./products-content-v3');
render(<ProductsContentV3 products={allMockProducts} />);
expect(screen.getByText(/从数据智能到业务协同/)).toBeInTheDocument();
expect(screen.getByText(/从业务系统到数据智能/)).toBeInTheDocument();
});
it('should render enterprise products section', async () => {
@@ -305,8 +305,8 @@ describe('ProductsContentV3 - 产品列表页集成测试', () => {
const { default: ProductsContentV3 } = await import('./products-content-v3');
render(<ProductsContentV3 products={allMockProducts} />);
expect(screen.getByText('预约免费咨询')).toBeInTheDocument();
expect(screen.getByText('浏览行业方案')).toBeInTheDocument();
expect(screen.getByText('联系我们')).toBeInTheDocument();
expect(screen.getByText('查看行业方案')).toBeInTheDocument();
});
it('should render stats section with product count', async () => {
@@ -323,7 +323,7 @@ describe('ProductsContentV3 - 产品列表页集成测试', () => {
render(<ProductsContentV3 products={[]} />);
// Hero section should still render
expect(screen.getByText('自研产品组合')).toBeInTheDocument();
expect(screen.getByText('自研产品矩阵')).toBeInTheDocument();
// The enterprise section should still render (even without products)
expect(screen.getAllByText('企业套装').length).toBeGreaterThanOrEqual(1);
@@ -89,7 +89,7 @@ function HeroSection() {
transition={{ duration: 1.2, delay: 0.15, ease: EASE_OUT }}
className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold text-ink leading-[0.92] tracking-tighter mb-8 sm:mb-10 md:mb-12"
>
<div className="block"></div>
<div className="block"></div>
<div className="block mt-5">
<span className="relative inline-block">
<span className="text-brand font-extrabold"></span>
@@ -102,7 +102,7 @@ function HeroSection() {
/>
</span>
</div>
<div className="block mt-5"></div>
<div className="block mt-5"></div>
</motion.h1>
<motion.p
@@ -111,8 +111,8 @@ function HeroSection() {
transition={{ duration: 1, delay: 0.45, ease: EASE_OUT }}
className="text-lg sm:text-xl lg:text-2xl text-text-secondary max-w-2xl leading-relaxed mb-8 sm:mb-10 md:mb-12"
>
6
6 线
</motion.p>
<motion.div
@@ -122,8 +122,8 @@ function HeroSection() {
className="flex flex-wrap gap-6"
>
<Button size="xl" asChild>
<a href="/contact">
<a href="/services">
<ArrowRight className="w-5 h-5 ml-2" />
</a>
</Button>
@@ -398,7 +398,7 @@ function SuiteCombosSection({ products }: { products: Product[] }) {
return (
<a
key={idx}
href="/contact"
href="/solutions"
className="group p-10 lg:p-12 bg-white hover:bg-bg-secondary transition-all duration-500 overflow-hidden"
>
<div>
@@ -432,7 +432,7 @@ function SuiteCombosSection({ products }: { products: Product[] }) {
whileHover={{ x: 6 }}
transition={EASE_SPRING}
>
<span></span>
<span></span>
<ArrowRight className="w-4 h-4" />
</motion.div>
</div>
@@ -454,24 +454,24 @@ function CTASection() {
<div className="max-w-container mx-auto px-6 lg:px-10 relative z-10">
<ScrollReveal className="text-center max-w-3xl mx-auto">
<h2 className="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-bold text-ink tracking-tight leading-tight mb-6 sm:mb-8">
<br />
<span className="text-brand"></span>
<span className="text-brand"></span><br />
</h2>
<p className="text-xl text-text-secondary mb-12 max-w-2xl mx-auto leading-relaxed">
</p>
<div className="flex flex-wrap justify-center gap-6">
<Button size="xl" asChild>
<a href="/contact">
<a href="/services">
<ArrowRight className="w-5 h-5 ml-2" />
</a>
</Button>
<Button size="xl" variant="outline" asChild>
<a href="/solutions"></a>
<a href="/contact"></a>
</Button>
</div>
</ScrollReveal>