- 创建 .editorconfig 文件统一代码风格配置 - 配置 .eslintrc 使用 taro/react 规则集 - 完善 .gitignore 忽略编译产物和敏感文件 - 添加 admin/article/add 页面实现文章管理功能 - 添加 dealer/apply/add 页面实现经销商申请功能 - 添加 dealer/bank/add 页面实现银行卡管理功能 - 添加 dealer/customer/add 页面实现客户管理功能 - 添加 user/address/add 页面实现用户地址管理功能 - 添加 user/chat/message/add 页面实现消息功能 - 添加 user/gift/add 页面实现礼品管理功能 - 配置各页面导航栏标题和样式 - 实现表单验证和数据提交功能 - 集成图片上传和头像选择功能 - 添加日期选择和数据校验逻辑 - 实现编辑和新增模式切换 - 集成用户权限和角色管理功能
131 lines
3.8 KiB
TypeScript
131 lines
3.8 KiB
TypeScript
import {useMemo, useState} from 'react'
|
||
import Taro from '@tarojs/taro'
|
||
import {Input, Text, View} from '@tarojs/components'
|
||
import {Search} from '@nutui/icons-react-taro'
|
||
import './find.scss'
|
||
|
||
type SiteItem = {
|
||
id: string
|
||
cityName: string
|
||
address: string
|
||
phone: string
|
||
contact: string
|
||
distanceMeter: number
|
||
}
|
||
|
||
const MOCK_SITES: SiteItem[] = [
|
||
{
|
||
id: '1',
|
||
cityName: '北京朝阳区网点',
|
||
address: '地安门西大街(南门)',
|
||
phone: '15878179339',
|
||
contact: '刘先生',
|
||
distanceMeter: 100
|
||
},
|
||
{
|
||
id: '2',
|
||
cityName: '兰州某某区网点',
|
||
address: '地安门西大街(南门)',
|
||
phone: '15878179339',
|
||
contact: '黄先生',
|
||
distanceMeter: 150
|
||
},
|
||
{
|
||
id: '3',
|
||
cityName: '合肥市某某区网点',
|
||
address: '地安门西大街(南门)',
|
||
phone: '15878179339',
|
||
contact: '黄先生',
|
||
distanceMeter: 250
|
||
},
|
||
{
|
||
id: '4',
|
||
cityName: '南宁市某某区网点',
|
||
address: '广西壮族自治区南宁市良庆区五象新区五象大道403号富雅国际金融中心G1栋高层6006',
|
||
phone: '15878179339',
|
||
contact: '柳先生',
|
||
distanceMeter: 1250
|
||
}
|
||
]
|
||
|
||
const Find = () => {
|
||
const [keyword, setKeyword] = useState<string>('')
|
||
|
||
const filtered = useMemo(() => {
|
||
const key = keyword.trim()
|
||
if (!key) return MOCK_SITES
|
||
return MOCK_SITES.filter((it) => it.cityName.includes(key))
|
||
}, [keyword])
|
||
|
||
const onNavigate = (item: SiteItem) => {
|
||
Taro.showToast({title: `导航至:${item.cityName}(示例)`, icon: 'none'})
|
||
}
|
||
|
||
const onSearch = () => {
|
||
Taro.showToast({title: '查询(示例)', icon: 'none'})
|
||
}
|
||
|
||
return (
|
||
<View className='sitePage'>
|
||
<View className='searchArea'>
|
||
<View className='searchBox'>
|
||
<Input
|
||
className='searchInput'
|
||
value={keyword}
|
||
placeholder='请输入城市名称查询'
|
||
placeholderClass='searchPlaceholder'
|
||
confirmType='search'
|
||
onInput={(e) => setKeyword(e.detail.value)}
|
||
onConfirm={onSearch}
|
||
/>
|
||
<View className='searchIconWrap' onClick={onSearch}>
|
||
<Search size={18} color='#b51616' />
|
||
</View>
|
||
</View>
|
||
</View>
|
||
|
||
<View className='siteList'>
|
||
{filtered.map((item) => (
|
||
<View key={item.id} className='siteCard'>
|
||
<View className='siteCardInner'>
|
||
<View className='siteInfo'>
|
||
<View className='siteRow siteRowTop'>
|
||
<Text className='siteLabel'>城市名称:</Text>
|
||
<Text className='siteValue siteValueStrong'>{item.cityName}</Text>
|
||
</View>
|
||
<View className='siteDivider' />
|
||
<View className='siteRow'>
|
||
<Text className='siteLabel'>网点地址:</Text>
|
||
<Text className='siteValue'>{item.address}</Text>
|
||
</View>
|
||
<View className='siteRow'>
|
||
<Text className='siteLabel'>联系电话:</Text>
|
||
<Text className='siteValue'>{item.phone}</Text>
|
||
</View>
|
||
<View className='siteRow'>
|
||
<Text className='siteLabel'>联系人:</Text>
|
||
<Text className='siteValue'>{item.contact}</Text>
|
||
</View>
|
||
</View>
|
||
|
||
<View className='siteSide' onClick={() => onNavigate(item)}>
|
||
<View className='navArrow' />
|
||
<Text className='distanceText'>距离{item.distanceMeter}米</Text>
|
||
</View>
|
||
</View>
|
||
</View>
|
||
))}
|
||
|
||
{filtered.length === 0 && (
|
||
<View className='emptyWrap'>
|
||
<Text className='emptyText'>暂无网点</Text>
|
||
</View>
|
||
)}
|
||
</View>
|
||
|
||
<View className='bottomSafe' />
|
||
</View>
|
||
)
|
||
}
|
||
export default Find
|