Ready for Review
As a 小程序用户, I want 看到与tcb-shop-demo设计一致的现代化首页UI, so that 我能获得更好的视觉体验和更直观的商品浏览体验
mini/src/components/tdesign/icon/index.tsx - Icon组件 (对照: mini/tdesign/icon/)mini/src/components/tdesign/search/index.tsx - Search组件 (对照: mini/tdesign/search/)mini/src/components/tdesign/swiper/index.tsx - Swiper组件 (对照: mini/tdesign/swiper/)mini/src/components/tdesign/toast/index.tsx - Toast组件 (对照: mini/tdesign/toast/)mini/src/components/tdesign/tabs/index.tsx - Tabs组件 (对照: mini/tdesign/tabs/)mini/src/components/goods-card/index.tsx 商品卡片组件tcb-shop-demo/components/goods-card/index.wxml 实现商品卡片布局mini/src/components/goods-list/index.tsx 商品列表组件tcb-shop-demo/components/goods-list/index.wxml 实现列表结构mini/src/pages/index/index.tsx 首页组件tcb-shop-demo/pages/home/home.wxml 实现页面结构mini/src/pages/index/index.tsxmini/src/components/mini/src/components/tdesign/ (自定义React组件)mini/tdesign/ (原生小程序组件,供参考)mini/src/tcb-theme.cssmini/src/layouts/tab-bar-layout.tsxtcb-shop-demo/pages/home/home.wxmltcb-shop-demo/pages/home/home.wxsstcb-shop-demo/pages/home/home.jstcb-shop-demo/components/goods-list/index.wxmltcb-shop-demo/components/goods-card/index.wxmltcb-shop-demo/components/goods-card/index.wxssmini/src/tcb-theme.css 中完整集成linear-gradient(#fff, #f5f5f5)Search组件 (mini/src/components/tdesign/search/index.tsx)
import { useState } from 'react'
import { View, Input } from '@tarojs/components'
import TDesignIcon from '../icon'
interface SearchProps {
placeholder?: string
disabled?: boolean
shape?: 'round' | 'square'
value?: string
onChange?: (value: string) => void
onFocus?: () => void
onBlur?: () => void
onSubmit?: (value: string) => void
}
export default function TDesignSearch({
placeholder = '搜索商品',
disabled = false,
shape = 'round',
value = '',
onChange,
onFocus,
onBlur,
onSubmit
}: SearchProps) {
const [focused, setFocused] = useState(false)
const handleInput = (e) => {
onChange?.(e.detail.value)
}
const handleFocus = () => {
setFocused(true)
onFocus?.()
}
const handleBlur = () => {
setFocused(false)
onBlur?.()
}
const handleConfirm = (e) => {
onSubmit?.(e.detail.value)
}
return (
<View className={`tdesign-search tdesign-search--${shape}`}>
<View className={`tdesign-search__input-box ${focused ? 'tdesign-search__input-box--focused' : ''}`}>
<TDesignIcon name="search" size="32rpx" color="#fa550f" />
<Input
type="text"
placeholder={placeholder}
disabled={disabled}
value={value}
onInput={handleInput}
onFocus={handleFocus}
onBlur={handleBlur}
onConfirm={handleConfirm}
className="tdesign-search__input"
/>
</View>
</View>
)
}
Icon组件 (mini/src/components/tdesign/icon/index.tsx)
import { View } from '@tarojs/components'
interface IconProps {
name: string
size?: string
color?: string
}
export default function TDesignIcon({ name, size = '32rpx', color = '#fa550f' }: IconProps) {
return (
<View
className={`tdesign-icon tdesign-icon--${name}`}
style={{ fontSize: size, color }}
>
{/* 使用Unicode或SVG图标 */}
</View>
)
}
Swiper组件 (mini/src/components/tdesign/swiper/index.tsx)
import { useState } from 'react'
import { Swiper, SwiperItem, Image } from '@tarojs/components'
interface SwiperProps {
images: string[]
autoplay?: boolean
interval?: number
indicatorDots?: boolean
}
export default function TDesignSwiper({
images = [],
autoplay = true,
interval = 3000,
indicatorDots = true
}: SwiperProps) {
return (
<Swiper
className="tdesign-swiper"
autoplay={autoplay}
interval={interval}
indicatorDots={indicatorDots}
indicatorColor="#999"
indicatorActiveColor="#fa550f"
>
{images.map((image, index) => (
<SwiperItem key={index}>
<Image src={image} mode="aspectFill" className="tdesign-swiper__image" />
</SwiperItem>
))}
</Swiper>
)
}
tests/ 文件夹,按组件和页面组织npm test - 运行所有测试npm run test:components - 运行组件测试npm run test:pages - 运行页面测试npm run test:coverage - 运行覆盖率测试tests/components/ 中创建单元测试tests/pages/ 中创建集成测试| Date | Version | Description | Author |
|---|---|---|---|
| 2025-11-20 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
This section is populated by the development agent during implementation
mini/src/components/tdesign/search/index.tsx - Search组件mini/src/components/tdesign/icon/index.tsx - Icon组件mini/src/components/tdesign/swiper/index.tsx - Swiper组件mini/src/components/tdesign/toast/index.tsx - Toast组件mini/src/components/tdesign/tabs/index.tsx - Tabs组件mini/src/components/goods-card/index.tsx - 商品卡片组件mini/tdesign/search/ 目录结构和功能mini/tdesign/icon/ 目录结构和功能mini/tdesign/swiper/ 目录结构和功能mini/tdesign/toast/ 目录结构和功能mini/tdesign/tabs/ 目录结构和功能tcb-shop-demo/components/goods-card/ 目录结构和功能mini/src/components/goods-list/index.tsx - 商品列表组件mini/src/components/goods-list/index.css - 商品列表组件样式tcb-shop-demo/components/goods-list/ 目录结构和功能mini/src/pages/index/index.tsx - 首页组件mini/src/pages/index/index.css - 首页样式mini/src/components/tdesign/search/index.tsx - TDesign Search 组件mini/src/components/tdesign/icon/index.tsx - TDesign Icon 组件mini/src/components/tdesign/swiper/index.tsx - TDesign Swiper 组件mini/src/components/tdesign/toast/index.tsx - TDesign Toast 组件mini/src/components/tdesign/tabs/index.tsx - TDesign Tabs 组件mini/src/components/goods-card/index.tsx - 商品卡片组件mini/src/components/goods-card/index.css - 商品卡片组件样式mini/src/components/goods-list/index.tsx - 商品列表组件mini/src/components/goods-list/index.css - 商品列表组件样式mini/src/pages/index/index.tsx - 首页组件(重构)mini/src/pages/index/index.css - 首页样式(重构)mini/src/components/tdesign/search/index.css - Search 组件样式mini/src/components/tdesign/swiper/index.css - Swiper 组件样式mini/src/components/tdesign/toast/index.css - Toast 组件样式mini/src/components/tdesign/tabs/index.css - Tabs 组件样式mini/src/tcb-theme.css - 移除组件样式,保留主题变量和工具类mini/src/components/tdesign/search/index.tsx - 添加 CSS 导入mini/src/components/tdesign/swiper/index.tsx - 添加 CSS 导入mini/src/components/tdesign/toast/index.tsx - 添加 CSS 导入mini/src/components/tdesign/tabs/index.tsx - 添加 CSS 导入mini/src/pages/index/index.tsx - 同步tcb-shop-demo轮播图优化(高度300rpx)mini/src/pages/index/index.css - 同步tcb-shop-demo轮播图样式简化docs/stories/001.004.homepage-ui-refactor.md - 更新任务状态和开发记录i-heroicons-magnifying-glass-20-solid)index.css 文件中,主题变量和工具类放在 mini/src/tcb-theme.css 中tdesign- 前缀避免与 Tailwind CSS 类名冲突pnpm typecheck | grep 过滤检查特定组件编译错误index.css 文件tcb-theme.css 中移除了所有组件特定样式import './index.css' 导入自己的样式Results from QA Agent QA review of the completed story implementation