💎 程序员摸鱼指南:用AI打造电商网站的效率革命

521 阅读5分钟

📱 前言

嘿,各位宝子们!今天咱们不讲枯燥的编程理论,不搞复杂的算法,就聊点实在的 —— 如何用AI帮我们偷懒写代码!是不是听起来就很香?没错,我要带大家用 Cursor ,蹭蹭几下就搞定一个多功能电商网站

想想看,以前写个网站可能要一周,现在只需要拿起咖啡☕,跟AI小助手唠嗑半小时,就能搞定。这波操作,简直就是程序员界的"躺平致富"了啊!🤑

🛠️ 准备工作

首先,确保你的装备齐全:

  • Cursor编辑器(内置Claude/GPT,写代码贼溜)
  • Next.js的基础知识(不会?没关系,AI会教你)
  • 一颗摸鱼的心❤️

🚀 Step 1: 创建项目

打开终端,输入以下魔法咒语:

npx create-next-app@latest .

这时,AI会问你一系列问题,就像相亲大妈问你的条件一样,建议这么回答:

✅ 想好项目名称了吗? › eshop
✅ 要用TypeScript吗? › 当然要!类型安全才是真爱!
✅ 要用ESLint吗? › 必须的,代码规范人人夸
✅ 要用Tailwind CSS吗? › 是的,懒人必备CSS框架
✅ 要用src/目录吗? › 要,组织代码更清晰
✅ 要用App Router吗? › 必须的,紧跟Next.js潮流
✅ 自定义导入别名? › @/*

这时候,AI就开始偷偷摸摸地下载一堆东西,比你双十一剁手还快!

🔄 Step 2: 启动开发服务器

npm run dev

这个命令让你的网站在本地"活"起来,像是给它注入了灵魂一样!打开 http://localhost:3000 ,哇!一个基础的模板已经出现了!

image.png

💬 Step 3: 和AI对话,创建购物车功能

这才是重头戏!打开Cursor,加载你的项目,然后开始和AI聊天:

我: 嘿,AI助手,我需要一个电商网站的购物车功能,你能帮我设计一下吗?

AI: 当然可以!我们需要创建一个购物车上下文来管理状态,一个产品类型定义,以及相关组件。我来帮你实现这些。

首先,让我们创建产品类型定义文件:

// src/types/product.ts
export interface Product {
  id: string;
  name: string;
  price: number;
  originalPrice?: number; // 原价,用于显示折扣
  description: string;
  images: string[]; // 支持多图
  thumbnailUrl: string; // 缩略图
  category: string;
  tags: string[];
  inventory: {
    inStock: boolean;
    quantity: number;
  };
  rating: {
    average: number; // 1-5星
    count: number;   // 评价数量
  };
  specifications?: Record<string, string>; // 产品规格
  createdAt: string; // ISO日期字符串
  updatedAt: string;
}

我: 很棒!现在我们需要一个购物车上下文。

AI: 好的,下面是购物车上下文的实现:

// src/context/CartContext.tsx
"use client";

import { createContext, useContext, useEffect, useState, ReactNode } from 'react';
import { Product } from '@/types/product';

// 购物车项目类型
export type CartItem = {
  product: Product;
  quantity: number;
};

// 购物车上下文类型
type CartContextType = {
  items: CartItem[];
  addToCart: (product: Product, quantity?: number) => void;
  removeFromCart: (productId: string) => void;
  updateQuantity: (productId: string, quantity: number) => void;
  clearCart: () => void;
  totalItems: number;
  totalPrice: number;
};

// 创建购物车上下文
const CartContext = createContext<CartContextType | undefined>(undefined);

// 购物车提供者组件
export const CartProvider = ({ children }: CartProviderProps) => {
  const [items, setItems] = useState<CartItem[]>([]);
  
  // 从localStorage加载购物车数据
  useEffect(() => {
    const storedCart = localStorage.getItem('cart');
    if (storedCart) {
      try {
        setItems(JSON.parse(storedCart));
      } catch (error) {
        console.error('Failed to parse cart from localStorage:', error);
      }
    }
  }, []);
  
  // 添加商品到购物车
  const addToCart = (product: Product, quantity = 1) => {
    setItems(prevItems => {
      const existingItem = prevItems.find(item => item.product.id === product.id);
      
      if (existingItem) {
        // 如果商品已存在,增加数量
        return prevItems.map(item => 
          item.product.id === product.id 
            ? { ...item, quantity: item.quantity + quantity } 
            : item
        );
      } else {
        // 如果商品不存在,添加新商品
        return [...prevItems, { product, quantity }];
      }
    });
  };
  
  // 购物车其他功能省略...
  
  return (
    <CartContext.Provider value={{
      items, addToCart, removeFromCart, updateQuantity, clearCart, totalItems, totalPrice
    }}>
      {children}
    </CartContext.Provider>
  );
};

// 使用购物车的自定义Hook
export const useCart = () => {
  const context = useContext(CartContext);
  if (context === undefined) {
    throw new Error('useCart must be used within a CartProvider');
  }
  return context;
};

🎯 Step 4: 产品卡片组件

产品卡片是电商网站的灵魂,AI帮我们生成了一个颜值和功能并存的组件:

// src/components/ProductCard.tsx
import React from 'react';
import Image from 'next/image';
import { Product } from '@/types/product';
import StarRating from './StarRating';
import { useCart } from '@/context/CartContext';
import { ShoppingCartIcon } from './icons';

interface ProductCardProps {
  product: Product;
}

const ProductCard: React.FC<ProductCardProps> = ({ product }) => {
  const { addToCart } = useCart();
  
  // 计算折扣百分比
  const discountPercentage = product.originalPrice ? 
    Math.round(((product.originalPrice - product.price) / product.originalPrice) * 100) : 0;
  
  // 处理添加到购物车
  const handleAddToCart = () => {
    addToCart(product, 1);
    // 添加产品卡片动画效果
    const card = document.getElementById(`product-card-${product.id}`);
    if (card) {
      card.classList.add('scale-105');
      setTimeout(() => {
        card.classList.remove('scale-105');
      }, 200);
    }
  };
  
  return (
    <div className="group relative bg-white rounded-lg shadow-sm overflow-hidden transition-all duration-300 hover:shadow-md hover:scale-[1.02] flex flex-col h-full">
      {/* 折扣标签 */}
      {discountPercentage > 0 && (
        <div className="absolute top-2 right-2 bg-red-500 text-white text-xs font-bold px-2 py-1 rounded-full z-10">
          -{discountPercentage}%
        </div>
      )}
      
      {/* 图片容器 */}
      <div className="relative aspect-w-1 aspect-h-1 overflow-hidden">
        <Image 
          src={product.thumbnailUrl} 
          alt={product.name}
          fill
          className="object-cover object-center transition-transform duration-500 group-hover:scale-110"
          sizes="(max-width: 640px) 100vw, (max-width: 768px) 50vw, 33vw"
        />
      </div>
      
      {/* 产品信息 */}
      <div className="p-4 flex flex-col flex-grow">
        <div className="flex-grow">
          <h3 className="text-sm font-medium text-gray-700 mb-1">{product.name}</h3>
          <StarRating rating={product.rating.average} count={product.rating.count} />
          
          <div className="mt-2 mb-4">
            <span className="text-lg font-semibold text-gray-900">¥{product.price}</span>
            {product.originalPrice && (
              <span className="ml-2 text-sm text-gray-500 line-through">¥{product.originalPrice}</span>
            )}
          </div>
        </div>
        
        {/* 添加到购物车按钮 */}
        <button
          onClick={handleAddToCart}
          className="w-full bg-indigo-600 text-white py-2 px-4 rounded-md flex items-center justify-center hover:bg-indigo-700 transition-colors"
        >
          <ShoppingCartIcon className="w-5 h-5 mr-2" />
          <span>加入购物车</span>
        </button>
      </div>
    </div>
  );
};

这个组件自带折扣标签、评分系统、动画效果,可以说是相当智能了!

🧩 遇到的问题与解决

开发的道路上总会有坑,我们也不例外。比如,我们在Next.js 13的App Router中遇到了这个错误:

Error: ./src/context/CartContext.tsx:1:10
createContext hook only works in a client component

和AI聊了几句:

我: 这个错误怎么解决呀?

AI: 这是因为Next.js的App Router中,组件默认是服务器组件,但createContext只能在客户端组件中使用。只需在文件顶部添加"use client"指令:

"use client";

import { createContext, useContext, useEffect, useState, ReactNode } from 'react';

添加后,问题立刻解决了!看,有AI在,bug都不是事!🐛

🔮 CSS问题解决

我们还遇到了一个CSS问题,@theme inline语法报错:

Unknown at rule @theme

AI立刻给出了解决方案,将其替换为标准CSS变量定义:

:root {
  --color-background: var(--background);
  --color-foreground: var(--foreground);
  --font-sans: var(--font-geist-sans);
  --font-mono: var(--font-geist-mono);
}

问题解决得如此优雅,连我这个CSS苦手都忍不住拍手叫好!👏

🚀 最后一步:展示成果

代码写完了,接下来就是"炫耀时间"!

image.png

现在只是构筑好了基础架构,剩下的就由各位大佬们自由发挥啦!

💎 总结与思考

通过这种方式开发网站,我们实现了:

  • ⏱️ 大幅减少开发时间,从几天到几十分钟
  • 💪 无需深厚的技术背景,AI帮你搞定复杂代码
  • 🧠 学习最新的开发技术和设计模式

AI编程时代已经来临,它不是来替代我们的,而是帮助我们更好地释放创造力。当AI帮我们处理繁琐的代码细节时,我们可以把精力放在更有创意的工作上。

以前,编程是"人工智能";现在,编程是"人+人工智能"。这个时代,不会和AI协作的程序员,可能将面临被会用AI的程序员取代的风险!

🔗 相关资源