You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
14 KiB
370 lines
14 KiB
<view class="container">
|
|
<!-- 标题 -->
|
|
<view class="title">专业的鸡蛋现货交易平台</view>
|
|
|
|
<!-- 搜索区域 -->
|
|
<view class="search-section">
|
|
<view class="search-bar">
|
|
<view class="search-input-wrapper">
|
|
<!-- 将地区选择器放在最左边 -->
|
|
<view class="region-selector" bindtap="toggleRegionPicker">
|
|
<text>{{selectedRegion || '全国'}}</text>
|
|
<text class="region-arrow">▼</text>
|
|
</view>
|
|
<!-- 搜索图标和输入框 -->
|
|
<text class="search-icon">🔍</text>
|
|
<input
|
|
class="search-input"
|
|
placeholder="搜索商品名称或地区"
|
|
placeholder-class="search-placeholder"
|
|
value="{{searchKeyword}}"
|
|
bindinput="onSearchInput"
|
|
/>
|
|
</view>
|
|
<button class="search-button" bindtap="searchGoods">搜索</button>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 地区选择器弹窗 -->
|
|
<view wx:if="{{showRegionPicker}}" class="region-picker-overlay" bindtap="toggleRegionPicker">
|
|
<view class="region-picker-container" bindtap="stopPropagation">
|
|
<view class="region-picker-title">选择地区</view>
|
|
<view class="region-list">
|
|
<view
|
|
wx:for="{{regions}}"
|
|
wx:key="index"
|
|
class="region-item {{selectedRegion === item ? 'active' : ''}}"
|
|
bindtap="selectRegion"
|
|
data-region="{{item}}"
|
|
>
|
|
{{item}}
|
|
</view>
|
|
</view>
|
|
<button class="confirm-region-btn" bindtap="confirmRegion">确定</button>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 品种筛选区域 -->
|
|
<view class="category-section">
|
|
<view class="category-scroll">
|
|
<view
|
|
class="egg-item {{selectedCategory === '全部' ? 'active' : ''}}"
|
|
bindtap="selectCategory"
|
|
data-category="全部"
|
|
>
|
|
<view class="egg-inner">全部</view>
|
|
</view>
|
|
<view
|
|
class="egg-item {{selectedCategory === '粉壳' ? 'active' : ''}}"
|
|
bindtap="selectCategory"
|
|
data-category="粉壳"
|
|
>
|
|
<view class="egg-inner">粉壳</view>
|
|
</view>
|
|
<view
|
|
class="egg-item {{selectedCategory === '红壳' ? 'active' : ''}}"
|
|
bindtap="selectCategory"
|
|
data-category="红壳"
|
|
>
|
|
<view class="egg-inner">红壳</view>
|
|
</view>
|
|
<view
|
|
class="egg-item {{selectedCategory === '绿壳' ? 'active' : ''}}"
|
|
bindtap="selectCategory"
|
|
data-category="绿壳"
|
|
>
|
|
<view class="egg-inner">绿壳</view>
|
|
</view>
|
|
<view
|
|
class="egg-item {{selectedCategory === '白壳' ? 'active' : ''}}"
|
|
bindtap="selectCategory"
|
|
data-category="白壳"
|
|
>
|
|
<view class="egg-inner">白壳</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 侧边栏按钮 -->
|
|
<view
|
|
class="sidebar-btn {{sidebarBtnHidden ? 'hidden' : ''}}"
|
|
style="top: {{sidebarBtnTop}}rpx;"
|
|
bindtouchstart="handleTouchStart"
|
|
bindtouchmove="handleTouchMove"
|
|
bindtouchend="handleTouchEnd"
|
|
>
|
|
<!-- 侧边栏内容区域 -->
|
|
<view class="sidebar-btn-content" bindtap="toggleSidebar">
|
|
<text class="sidebar-icon">☰</text>
|
|
<text class="sidebar-text">招商入驻</text>
|
|
</view>
|
|
|
|
<!-- 箭头按钮 -->
|
|
<view class="sidebar-arrow" bindtap="toggleSidebarBtn">
|
|
<text class="arrow-icon {{sidebarBtnHidden ? 'arrow-right' : 'arrow-left'}}">▶</text>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 侧边栏弹出层 -->
|
|
<view wx:if="{{showSidebar}}" class="sidebar-overlay" bindtap="toggleSidebar"></view>
|
|
<view wx:if="{{showSidebar}}" class="sidebar">
|
|
<view class="sidebar-title">招商合作</view>
|
|
<view class="sidebar-menu">
|
|
<view class="sidebar-item" bindtap="navigateToSettlement">
|
|
<text class="sidebar-item-icon">🏠</text>
|
|
<text class="sidebar-item-text">我要卖蛋</text>
|
|
</view>
|
|
<view class="sidebar-item" bindtap="navigateToCooperation">
|
|
<text class="sidebar-item-icon">📢</text>
|
|
<text class="sidebar-item-text">招商合作</text>
|
|
</view>
|
|
<view class="sidebar-item" bindtap="navigateToSettlement">
|
|
<text class="sidebar-item-icon">📞</text>
|
|
<text class="sidebar-item-text">联系我们</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 骨架屏加载 -->
|
|
<view wx:if="{{isLoading && goods.length === 0}}" class="skeleton-container">
|
|
<view class="skeleton-waterfall">
|
|
<view class="skeleton-column">
|
|
<view class="skeleton-item" wx:for="{{[1,2,3,4]}}" wx:key="index">
|
|
<view class="skeleton-image"></view>
|
|
<view class="skeleton-title"></view>
|
|
<view class="skeleton-title short"></view>
|
|
<view class="skeleton-footer">
|
|
<view class="skeleton-price"></view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="skeleton-column">
|
|
<view class="skeleton-item" wx:for="{{[1,2,3,4]}}" wx:key="index">
|
|
<view class="skeleton-image"></view>
|
|
<view class="skeleton-title"></view>
|
|
<view class="skeleton-title short"></view>
|
|
<view class="skeleton-footer">
|
|
<view class="skeleton-price"></view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 商品列表区域 -->
|
|
<view class="goods-section">
|
|
<scroll-view
|
|
class="goods-list"
|
|
bindscrolltolower="onReachBottom"
|
|
bindscroll="onScroll"
|
|
scroll-y="true"
|
|
refresher-enabled="{{true}}"
|
|
refresher-default-style="none"
|
|
refresher-background="#f8f8f8"
|
|
bindrefresherrefresh="onPullDownRefresh"
|
|
bindrefresherrestore="onRestore"
|
|
style="height: calc(100% - 60rpx);"
|
|
>
|
|
<view class="goods-list-container">
|
|
<!-- 瀑布流布局 -->
|
|
<view class="waterfall-container">
|
|
<!-- 左列 -->
|
|
<view class="waterfall-column left-column">
|
|
<view
|
|
class="waterfall-item"
|
|
wx:for="{{leftColumnGoods}}"
|
|
wx:key="id"
|
|
data-item="{{item}}"
|
|
bindtap="viewGoodsDetail"
|
|
>
|
|
<view class="product-card">
|
|
<view class="product-image-wrapper">
|
|
<image
|
|
class="product-image"
|
|
src="{{item.imageUrls && item.imageUrls.length > 0 ? item.imageUrls[0] : '/images/default-avatar.png'}}"
|
|
mode="widthFix"
|
|
lazy-load="true"
|
|
bindload="onImageLoad"
|
|
data-index="{{index}}"
|
|
data-column="left"
|
|
bindtap="previewImage"
|
|
data-item="{{item}}"
|
|
data-index="0"
|
|
></image>
|
|
<view wx:if="{{item.supplyStatus === '预售'}}" class="promo-tag presale">预售</view>
|
|
<view wx:if="{{item.sourceType}}" class="promo-tag source">一手货源</view>
|
|
</view>
|
|
<view class="product-info">
|
|
<view class="product-title">{{item.name}}</view>
|
|
<view class="product-spec">{{item.specification || '无'}}<text wx:if="{{item.yolk && item.yolk !== '无'}}"> | {{item.yolk}}</text></view>
|
|
<view class="product-price-row">
|
|
<view class="price-wrapper">
|
|
<text class="price-unit">¥</text>
|
|
<text class="price-value">{{item.price || item.minPrice || '--'}}</text>
|
|
<text class="price-unit" wx:if="{{item.unit}}">/{{item.unit}}</text>
|
|
</view>
|
|
</view>
|
|
<view class="product-meta">
|
|
<text class="sales-count">已售{{item.sales || item.reservedCount || 0}}件</text>
|
|
<text class="product-location">{{item.region || ''}}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 右列 -->
|
|
<view class="waterfall-column right-column">
|
|
<view
|
|
class="waterfall-item"
|
|
wx:for="{{rightColumnGoods}}"
|
|
wx:key="id"
|
|
data-item="{{item}}"
|
|
bindtap="viewGoodsDetail"
|
|
>
|
|
<view class="product-card">
|
|
<view class="product-image-wrapper">
|
|
<image
|
|
class="product-image"
|
|
src="{{item.imageUrls && item.imageUrls.length > 0 ? item.imageUrls[0] : '/images/default-avatar.png'}}"
|
|
mode="widthFix"
|
|
lazy-load="true"
|
|
bindload="onImageLoad"
|
|
data-index="{{index}}"
|
|
data-column="right"
|
|
bindtap="previewImage"
|
|
data-item="{{item}}"
|
|
data-index="0"
|
|
></image>
|
|
<view wx:if="{{item.supplyStatus === '预售'}}" class="promo-tag presale">预售</view>
|
|
<view wx:if="{{item.sourceType}}" class="promo-tag source">一手货源</view>
|
|
</view>
|
|
<view class="product-info">
|
|
<view class="product-title">{{item.name}}</view>
|
|
<view class="product-spec">{{item.specification || '无'}}<text wx:if="{{item.yolk && item.yolk !== '无'}}"> | {{item.yolk}}</text></view>
|
|
<view class="product-price-row">
|
|
<view class="price-wrapper">
|
|
<text class="price-unit">¥</text>
|
|
<text class="price-value">{{item.price || item.minPrice || '--'}}</text>
|
|
<text class="price-unit" wx:if="{{item.unit}}">/{{item.unit}}</text>
|
|
</view>
|
|
</view>
|
|
<view class="product-meta">
|
|
<text class="sales-count">已售{{item.sales || item.reservedCount || 0}}件</text>
|
|
<text class="product-location">{{item.region || ''}}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 加载更多 -->
|
|
<view wx:if="{{loadingMore}}" class="loading-more">
|
|
<view class="loading-spinner"></view>
|
|
<text class="loading-text">加载中...</text>
|
|
</view>
|
|
|
|
<!-- 无更多数据 -->
|
|
<view wx:if="{{!hasMoreData && filteredGoods.length > 0}}" class="no-more-data">
|
|
<text>没有更多商品了</text>
|
|
</view>
|
|
|
|
<!-- 无商品时显示 -->
|
|
<view wx:if="{{filteredGoods.length === 0 && !isLoading}}" class="empty-goods">
|
|
<view class="empty-icon">📦</view>
|
|
<text class="empty-text">暂无商品数据</text>
|
|
<text class="empty-hint">下拉刷新试试</text>
|
|
</view>
|
|
</view>
|
|
</scroll-view>
|
|
</view>
|
|
|
|
<!-- 未授权登录提示弹窗 -->
|
|
<view wx:if="{{showAuthModal}}" class="auth-modal-overlay">
|
|
<view class="auth-modal-container">
|
|
<view class="auth-modal-title">提示</view>
|
|
<view class="auth-modal-content">请先登录后再操作</view>
|
|
<view class="auth-modal-buttons">
|
|
<button class="auth-primary-button" bindtap="showOneKeyLogin">一键登录</button>
|
|
<button class="auth-cancel-button" bindtap="closeAuthModal">取消</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 一键登录弹窗 -->
|
|
<view wx:if="{{showOneKeyLoginModal}}" class="auth-modal-overlay">
|
|
<view class="auth-modal-container">
|
|
<view class="auth-modal-title">授权登录</view>
|
|
<view class="auth-modal-content">请授权获取您的手机号用于登录</view>
|
|
<view class="auth-modal-buttons">
|
|
<button class="auth-primary-button" open-type="getPhoneNumber" bind:getphonenumber="onGetPhoneNumber">授权获取手机号</button>
|
|
<button class="auth-cancel-button" bindtap="closeOneKeyLoginModal">取消</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 用户信息填写弹窗 -->
|
|
<view wx:if="{{showUserInfoForm}}" class="modal-overlay">
|
|
<view class="modal-container">
|
|
<view class="modal-title">
|
|
<text>完善个人信息</text>
|
|
</view>
|
|
|
|
<!-- 头像选择 -->
|
|
<view class="avatar-section">
|
|
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
|
|
<image class="avatar" src="{{avatarUrl}}"></image>
|
|
</button>
|
|
</view>
|
|
|
|
<!-- 昵称输入 -->
|
|
<form bindsubmit="getUserName">
|
|
<view class="form-group">
|
|
<view class="form-label">昵称</view>
|
|
<input placeholder="请输入昵称" type="nickname" name="name" maxlength="32" class="form-input"></input>
|
|
</view>
|
|
|
|
<!-- 提交按钮 -->
|
|
<view class="form-actions">
|
|
<button form-type="submit" class="confirm-button">确定</button>
|
|
</view>
|
|
</form>
|
|
|
|
<!-- 取消按钮 -->
|
|
<view class="modal-buttons">
|
|
<button class="cancel-button" bindtap="cancelUserInfoForm">取消</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 图片预览弹窗 -->
|
|
<view wx:if="{{showImagePreview}}" class="image-preview-mask" catchtouchmove="true" bindtap="closeImagePreview">
|
|
<swiper
|
|
class="image-preview-swiper"
|
|
current="{{previewImageIndex}}"
|
|
bindchange="onPreviewImageChange"
|
|
indicator-dots="true"
|
|
indicator-color="rgba(255, 255, 255, 0.5)"
|
|
indicator-active-color="#fff"
|
|
autoplay="false"
|
|
duration="300"
|
|
>
|
|
<block wx:for="{{previewImageUrls}}" wx:key="*this">
|
|
<swiper-item>
|
|
<image
|
|
class="preview-image"
|
|
src="{{item}}"
|
|
mode="aspectFit"
|
|
bindtap="closeImagePreview"
|
|
></image>
|
|
</swiper-item>
|
|
</block>
|
|
</swiper>
|
|
|
|
<!-- 关闭按钮 -->
|
|
<view class="image-preview-close" bindtap="closeImagePreview">
|
|
<text class="close-icon">✕</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|