Cursorへの自然言語指示のみで、EcoMarketの商品一覧コンポーネントを自動生成
import React, { useState, useEffect } from 'react';
import { Card, Badge, Button } from '../components/ui';
import { fetchProducts } from '../api/products';
const ProductList = ({ categoryFilter }) => {
const [products, setProducts] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const loadProducts = async () => {
setLoading(true);
try {
const data = await fetchProducts(categoryFilter);
setProducts(data);
} catch (error) {
console.error('商品の読み込みに失敗しました', error);
} finally {
setLoading(false);
}
};
loadProducts();
}, [categoryFilter]);
// 💡 Cursor AI提案: Suspenseを使った非同期データ取得に改善できます
return (
<div className="eco-products grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{loading ? (
Array(6).fill().map((_, i) => (
<Card key={`skeleton-${i}`} className="animate-pulse" />
))
) : (
products.map(product => (
<Card key={product.id} className="product-card">
<img src={product.image} alt={product.name} className="mb-2 rounded-t" />
<div className="p-4">
<Badge color={product.inStock ? 'green' : 'red'}>
{product.inStock ? '在庫あり' : '在庫なし'}
</Badge>
<h3 className="text-lg font-semibold mt-2">{product.name}</h3>
<p className="text-gray-600">¥{product.price.toLocaleString()}</p>
<Button onClick={() => addToCart(product)}
disabled={!product.inStock}>
カートに追加
</Button>
</div>
</Card>
))
)}
</div>
);
};
export default ProductList;
コンポーネント設計の自動提案
MVCパターンに適したコード構造を自動生成
リアルタイム最適化提案
パフォーマンス向上のためのコード改善を自動提案
生成UI プレビュー
自動レンダリングエコバッグ(オーガニック素材)
¥1,980
ステンレスボトル(保温)
¥3,480
竹製食器セット
¥2,480
Kiroの設計書を読み込ませるだけで、必要なAPIルート・コントローラを自動生成
// EcoMarket API - 商品管理コントローラ
const Product = require('../models/Product');
const { validationResult } = require('express-validator');
const logger = require('../utils/logger');
/**
* 商品一覧を取得
* @param {Object} req - Expressリクエストオブジェクト
* @param {Object} res - Expressレスポンスオブジェクト
*/
exports.getProducts = async (req, res) => {
try {
const { category, sort, limit = 20, page = 1 } = req.query;
const skip = (page - 1) * limit;
// クエリビルダー
let query = {};
if (category) query.category = category;
// ソート条件
let sortOption = {};
if (sort === 'price_asc') sortOption = { price: 1 };
else if (sort === 'price_desc') sortOption = { price: -1 };
else sortOption = { createdAt: -1 }; // デフォルトは新着順
// DBクエリ実行
const products = await Product.find(query)
.sort(sortOption)
.skip(skip)
.limit(Number(limit));
// 総件数取得(ページネーション用)
const total = await Product.countDocuments(query);
res.status(200).json({
success: true,
data: products,
pagination: {
total,
page: Number(page),
pages: Math.ceil(total / limit)
}
});
} catch (err) {
logger.error(`商品一覧取得エラー: ${err.message}`);
res.status(500).json({
success: false,
error: '商品情報の取得に失敗しました'
});
}
};
セキュリティ対策自動実装
バリデーション、エラーハンドリングを自動付加
APIスキーマ自動生成
OpenAPI/Swagger形式のAPIドキュメント自動作成
SE向けAI開発技術レクチャーシリーズ
© 2025 Tech Innovation Team