|
@@ -1,28 +1,293 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <view class="category">
|
|
|
|
|
- 分类
|
|
|
|
|
|
|
+ <view class="facility">
|
|
|
|
|
+ <wd-sticky :z-index="10">
|
|
|
|
|
+ <view class="facility-top">
|
|
|
|
|
+ <wd-search cancel-txt="搜索" />
|
|
|
|
|
+ <wd-tabs slidable="always" v-model="state.tab">
|
|
|
|
|
+ <wd-tab v-for="(item, index) in tabList " :key="index" :title="item.name" />
|
|
|
|
|
+ </wd-tabs>
|
|
|
|
|
+ <wd-drop-menu>
|
|
|
|
|
+ <wd-drop-menu-item v-model="state.dropMenu" :options="state.dropMenuList" />
|
|
|
|
|
+ <wd-drop-menu-item title="筛选">
|
|
|
|
|
+ <view>
|
|
|
|
|
+ <wd-cell title="标题" value="筛选内容1" />
|
|
|
|
|
+ <wd-cell title="标题" value="筛选内容2" />
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </wd-drop-menu-item>
|
|
|
|
|
+ </wd-drop-menu>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </wd-sticky>
|
|
|
|
|
+ <view class="facility-list">
|
|
|
|
|
+ <view class="facility-list-item" v-for="(item, index) in state.list" :key="index"
|
|
|
|
|
+ @click="onClickNavigate(item.id)">
|
|
|
|
|
+ <view class="facility-list-item-sign">
|
|
|
|
|
+ {{ item.sign }}
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <wd-img height="300rpx" mode="heightFix" :src="item.url" />
|
|
|
|
|
+ <view style="padding: 0 10rpx;">
|
|
|
|
|
+ <view class="facility-list-item-title">
|
|
|
|
|
+ {{ item.title }}
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="facility-list-item-text">
|
|
|
|
|
+ {{ item.content }}
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
</view>
|
|
</view>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
import { reactive } from 'vue';
|
|
import { reactive } from 'vue';
|
|
|
-import { onShow } from '@dcloudio/uni-app';
|
|
|
|
|
|
|
+import { onShow, onReachBottom } from '@dcloudio/uni-app';
|
|
|
|
|
|
|
|
interface State {
|
|
interface State {
|
|
|
-
|
|
|
|
|
|
|
+ tab: number,
|
|
|
|
|
+ dropMenu: string,
|
|
|
|
|
+ dropMenuList: {
|
|
|
|
|
+ label: string,
|
|
|
|
|
+ value: string,
|
|
|
|
|
+ }[],
|
|
|
|
|
+ list: {
|
|
|
|
|
+ id: string,
|
|
|
|
|
+ url: string,
|
|
|
|
|
+ sign: string,
|
|
|
|
|
+ title: string,
|
|
|
|
|
+ content: string,
|
|
|
|
|
+ }[],
|
|
|
|
|
+ page: {
|
|
|
|
|
+ pageNumber: number,
|
|
|
|
|
+ pageSize: number,
|
|
|
|
|
+ total: number,
|
|
|
|
|
+ },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const state: State = reactive({
|
|
const state: State = reactive({
|
|
|
-
|
|
|
|
|
|
|
+ tab: 0,
|
|
|
|
|
+ dropMenu: '1',
|
|
|
|
|
+ dropMenuList: [
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '效果图',
|
|
|
|
|
+ value: '1',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '物料实物',
|
|
|
|
|
+ value: '2',
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
|
|
+ list: [],
|
|
|
|
|
+ page: {
|
|
|
|
|
+ pageNumber: 1,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ total: 0,
|
|
|
|
|
+ },
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+const tabList = [
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '户型',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '全屋',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '客厅',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '卧室',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '卫生间',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '厨房',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '餐厅',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ name: '阳台',
|
|
|
|
|
+ }
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+const api = {
|
|
|
|
|
+ // 获取列表
|
|
|
|
|
+ fetchList: async (concat?: boolean) => {
|
|
|
|
|
+ uni.showLoading({
|
|
|
|
|
+ title: '加载中',
|
|
|
|
|
+ });
|
|
|
|
|
+ try {
|
|
|
|
|
+ const data = {
|
|
|
|
|
+ page_number: state.page.pageNumber,
|
|
|
|
|
+ page_size: state.page.pageSize,
|
|
|
|
|
+ };
|
|
|
|
|
+ const res = {
|
|
|
|
|
+ data: {
|
|
|
|
|
+ list: [
|
|
|
|
|
+ {
|
|
|
|
|
+ id: '1',
|
|
|
|
|
+ url: 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
|
|
|
|
|
+ sign: 'ST-02 | 深色大理石深色大理石',
|
|
|
|
|
+ title: '门槛石/D户型客厅地面收 边、卫生间地面边、卫生间地面边、卫生间地面边、卫生间地面边、卫生间地面',
|
|
|
|
|
+ content: '参数要求:时静摩擦系数Aw Ad级 (COF≥0.7, BPN≥80)纹理清 晰,色差小,无裂痕,需做结晶防护处理,放射性指标的测试方法应符合现行国家标准 GB6566',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: '2',
|
|
|
|
|
+ url: 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
|
|
|
|
|
+ sign: 'ST-02 | 深色大理石',
|
|
|
|
|
+ title: '门槛石/D户型客厅地面收 边、卫生间地面',
|
|
|
|
|
+ content: '参数要求:时静摩擦系数Aw Ad级 (COF≥0.7, BPN≥80)纹理清 晰,色差小,无裂痕,需做结晶防护处理,放射性指标的测试方法应符合现行国家标准 GB6566',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: '3',
|
|
|
|
|
+ url: 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
|
|
|
|
|
+ sign: 'ST-02 | 深色大理石',
|
|
|
|
|
+ title: '门槛石/D户型客厅地面收 边、卫生间地面',
|
|
|
|
|
+ content: '参数要求:时静摩擦系数Aw Ad级 (COF≥0.7, BPN≥80)纹理清 晰,色差小,无裂痕,需做结晶防护处理,放射性指标的测试方法应符合现行国家标准 GB6566',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: '4',
|
|
|
|
|
+ url: 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
|
|
|
|
|
+ sign: 'ST-02 | 深色大理石',
|
|
|
|
|
+ title: '门槛石/D户型客厅地面收 边、卫生间地面',
|
|
|
|
|
+ content: '参数要求:时静摩擦系数Aw Ad级 (COF≥0.7, BPN≥80)纹理清 晰,色差小,无裂痕,需做结晶防护处理,放射性指标的测试方法应符合现行国家标准 GB6566',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: '5',
|
|
|
|
|
+ url: 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
|
|
|
|
|
+ sign: 'ST-02 | 深色大理石',
|
|
|
|
|
+ title: '门槛石/D户型客厅地面收 边、卫生间地面',
|
|
|
|
|
+ content: '参数要求:时静摩擦系数Aw Ad级 (COF≥0.7, BPN≥80)纹理清 晰,色差小,无裂痕,需做结晶防护处理,放射性指标的测试方法应符合现行国家标准 GB6566',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ id: '6',
|
|
|
|
|
+ url: 'https://registry.npmmirror.com/wot-design-uni-assets/*/files/moon.jpg',
|
|
|
|
|
+ sign: 'ST-02 | 深色大理石',
|
|
|
|
|
+ title: '门槛石/D户型客厅地面收 边、卫生间地面',
|
|
|
|
|
+ content: '参数要求:时静摩擦系数Aw Ad级 (COF≥0.7, BPN≥80)纹理清 晰,色差小,无裂痕,需做结晶防护处理,放射性指标的测试方法应符合现行国家标准 GB6566',
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
|
|
+ total: 10,
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ const list = res.data.list;
|
|
|
|
|
+ state.list = concat ? state.list.concat(list) : list;
|
|
|
|
|
+ state.page = {
|
|
|
|
|
+ ...state.page,
|
|
|
|
|
+ total: res.data.total,
|
|
|
|
|
+ };
|
|
|
|
|
+ } catch (error: any) {
|
|
|
|
|
+ console.error(error);
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const init = async () => {
|
|
|
|
|
+ uni.showLoading({
|
|
|
|
|
+ title: '加载中',
|
|
|
|
|
+ });
|
|
|
|
|
+ // 获取列表
|
|
|
|
|
+ await api.fetchList();
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onChangePagination = async () => {
|
|
|
|
|
+ const { pageNumber, pageSize, total } = state.page;
|
|
|
|
|
+ if (total > pageNumber * pageSize) {
|
|
|
|
|
+ state.page = {
|
|
|
|
|
+ ...state.page,
|
|
|
|
|
+ pageNumber: pageNumber + 1,
|
|
|
|
|
+ }
|
|
|
|
|
+ // 获取列表
|
|
|
|
|
+ await api.fetchList(true);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
onShow(() => {
|
|
onShow(() => {
|
|
|
|
|
+ state.page = {
|
|
|
|
|
+ ...state.page,
|
|
|
|
|
+ pageNumber: 1,
|
|
|
|
|
+ };
|
|
|
|
|
+ init();
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
|
|
+onReachBottom(() => {
|
|
|
|
|
+ onChangePagination();
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+// 点击跳转
|
|
|
|
|
+const onClickNavigate = (id: string) => {
|
|
|
|
|
+ uni.navigateTo({
|
|
|
|
|
+ url: `/pages/facility/houseDetail/index?id=${id}`,
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
|
-.category {
|
|
|
|
|
- padding: 0 20rpx;
|
|
|
|
|
|
|
+.facility {
|
|
|
|
|
+ &-top {
|
|
|
|
|
+ width: 100vw;
|
|
|
|
|
+ border-bottom: 2rpx solid $border-color;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &-list {
|
|
|
|
|
+ padding: 0 20rpx;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+ margin-top: 20rpx;
|
|
|
|
|
+
|
|
|
|
|
+ &-item {
|
|
|
|
|
+ width: calc(50% - 10rpx);
|
|
|
|
|
+ background: #F4F4F4;
|
|
|
|
|
+ border-radius: $border-radius-base;
|
|
|
|
|
+ margin-bottom: 20rpx;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+
|
|
|
|
|
+ &-sign {
|
|
|
|
|
+ width: 85%;
|
|
|
|
|
+ height: 50rpx;
|
|
|
|
|
+ padding: 0 10rpx;
|
|
|
|
|
+ background: rgba(0, 0, 0, 0.4);
|
|
|
|
|
+ border-top-right-radius: $border-radius-base;
|
|
|
|
|
+ color: #FFFFFF;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: 250rpx;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ z-index: 2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &-title {
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ display: -webkit-box;
|
|
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
|
|
+ -webkit-line-clamp: 2;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
|
+ margin-bottom: 10rpx;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &-text {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 300rpx;
|
|
|
|
|
+ color: $gray-color;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ margin-bottom: 10rpx;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &-item:nth-child(odd) {
|
|
|
|
|
+ margin-right: 10rpx;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &-item:nth-child(even) {
|
|
|
|
|
+ margin-left: 10rpx;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|