优化界面
This commit is contained in:
parent
2a48964efb
commit
293b3d8bf3
@ -397,11 +397,11 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
previewImage(index) {
|
previewImage(index) {
|
||||||
if (!this.detailInfo.detailImages || !this.detailInfo.detailImages.length) return;
|
// if (!this.detailInfo.detailImages || !this.detailInfo.detailImages.length) return;
|
||||||
|
|
||||||
uni.previewImage({
|
uni.previewImage({
|
||||||
current: index,
|
current: index,
|
||||||
urls: this.detailInfo.detailImages.map(img => img.startsWith('http') ? img : IMAGE_BASE_URL + img)
|
urls: this.detailInfo.imgs.map(img => img.startsWith('http') ? img : IMAGE_BASE_URL + img)
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -48,7 +48,7 @@
|
|||||||
<view class="weather-main">
|
<view class="weather-main">
|
||||||
<view class="current-weather">
|
<view class="current-weather">
|
||||||
<image class="weather-icon"
|
<image class="weather-icon"
|
||||||
:src="weather.weather ? getWeatherIcon(weather.weather) : '/static/imgs/weather/default.png'"
|
:src="weather.weather ? getWeatherIcon(weather.weather) : '/static/imgs/weather.png'"
|
||||||
mode="aspectFit"></image>
|
mode="aspectFit"></image>
|
||||||
<text class="current-temp">{{weather.real || '--'}}°</text>
|
<text class="current-temp">{{weather.real || '--'}}°</text>
|
||||||
</view>
|
</view>
|
||||||
@ -127,7 +127,7 @@ import Copyright from '@/components/gx-copyright.vue';
|
|||||||
import Footer from '@/components/footer_common.vue';
|
import Footer from '@/components/footer_common.vue';
|
||||||
import { get, post } from '@/utils/request';
|
import { get, post } from '@/utils/request';
|
||||||
import { IMAGE_BASE_URL, BASE_URL } from '@/utils/config';
|
import { IMAGE_BASE_URL, BASE_URL } from '@/utils/config';
|
||||||
|
import {navigateTo} from '@/utils/router.js'
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Footer,
|
Footer,
|
||||||
@ -161,9 +161,14 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goDetail(page) {
|
goDetail(page) {
|
||||||
uni.navigateTo({
|
if(page==='neighbor'){
|
||||||
url: `/pages/${page}/index`
|
navigateTo({url: `/pages/${page}/index`})
|
||||||
});
|
}else{
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/${page}/index`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
formatDate(date) {
|
formatDate(date) {
|
||||||
const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
|
const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
|
||||||
|
|||||||
@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
<!-- 预约记录列表 -->
|
<!-- 预约记录列表 -->
|
||||||
<view class="order-list" v-else>
|
<view class="order-list" v-else>
|
||||||
|
<u-loading-page :loading="dataloading"></u-loading-page>
|
||||||
<view v-if="orderList.length === 0" class="empty-container">
|
<view v-if="orderList.length === 0" class="empty-container">
|
||||||
<noData />
|
<noData />
|
||||||
</view>
|
</view>
|
||||||
@ -313,6 +314,7 @@
|
|||||||
// 获取会议室列表
|
// 获取会议室列表
|
||||||
async getList() {
|
async getList() {
|
||||||
try {
|
try {
|
||||||
|
wx.showLoading({title:'加载中...',mask:true})
|
||||||
const res = await get('/api/v1/apps/home/metting-room', {
|
const res = await get('/api/v1/apps/home/metting-room', {
|
||||||
current: 1,
|
current: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
@ -329,12 +331,13 @@
|
|||||||
icon: 'none'
|
icon: 'none'
|
||||||
});
|
});
|
||||||
} finally {
|
} finally {
|
||||||
this.isLoading = false;
|
wx.hideLoading()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 获取我的预约记录
|
// 获取我的预约记录
|
||||||
async getOrderList() {
|
async getOrderList() {
|
||||||
try {
|
try {
|
||||||
|
wx.showLoading({title:'加载中...',mask:true})
|
||||||
const res = await get('/api/v1/app_auth/metting-room/order', {
|
const res = await get('/api/v1/app_auth/metting-room/order', {
|
||||||
current: 1,
|
current: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
@ -352,7 +355,7 @@
|
|||||||
icon: 'none'
|
icon: 'none'
|
||||||
});
|
});
|
||||||
} finally {
|
} finally {
|
||||||
this.isLoading = false;
|
wx.hideLoading()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -52,11 +52,11 @@
|
|||||||
height="780px"
|
height="780px"
|
||||||
v-if="filteredOrders.length === 0"
|
v-if="filteredOrders.length === 0"
|
||||||
mode="data"
|
mode="data"
|
||||||
icon="/static/imgs/noData.jpeg"
|
icon="/static/imgs/noData.png"
|
||||||
></u-empty>
|
></u-empty>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<Footer></Footer>
|
<!-- <Footer></Footer> -->
|
||||||
|
|
||||||
<!-- 固定在右侧的发布工单按钮 -->
|
<!-- 固定在右侧的发布工单按钮 -->
|
||||||
<view class="fab-container">
|
<view class="fab-container">
|
||||||
|
|||||||
@ -17,56 +17,57 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 实际列表 -->
|
<!-- 滚动区域 -->
|
||||||
<view class="notice-item"
|
<scroll-view scroll-y :style="'height:' + scrollViewHeight + 'px'" @scrolltolower="loadMore"
|
||||||
v-for="(item,index) in noticesList"
|
lower-threshold="100" :scroll-with-animation="true">
|
||||||
:key="item.id"
|
<view class="notice-item" v-for="(item,index) in noticesList" :key="item.id"
|
||||||
@click="goNoticeDetail(item.id)">
|
@click="goNoticeDetail(item.id)">
|
||||||
<image :src="item.cover"
|
<image :src="item.cover" class="notice-image" mode="aspectFill" lazy-load
|
||||||
class="notice-image"
|
:show-menu-by-longpress="true" @error="handleImageError(index)"></image>
|
||||||
mode="aspectFill"
|
<view class="notice-content">
|
||||||
lazy-load
|
<view class="notice-title line-clamp-1">{{item.title}}</view>
|
||||||
:show-menu-by-longpress="true"
|
<view class="notice-description line-clamp-2" v-html="item.desc"></view>
|
||||||
@error="handleImageError(index)"></image>
|
<view class="notice-footer">
|
||||||
<view class="notice-content">
|
<text class="notice-date">{{formatTime(item.createdAt,'YYYY-MM-DD')}}</text>
|
||||||
<view class="notice-title line-clamp-1">{{item.title}}</view>
|
<text class="notice-more">查看详情 →</text>
|
||||||
<view class="notice-description line-clamp-2" v-html="item.desc"></view>
|
</view>
|
||||||
<view class="notice-footer">
|
|
||||||
<text class="notice-date">{{formatTime(item.createdAt,'YYYY-MM-DD')}}</text>
|
|
||||||
<text class="notice-more">查看详情 →</text>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 加载更多提示 -->
|
<!-- 加载更多提示 -->
|
||||||
<view class="load-more" v-if="noticesList.length > 0 && currentPage < totalPages">
|
<view class="load-more" v-if="noticesList.length > 0 && currentPage < totalPages">
|
||||||
<text>{{isLoading ? '加载中...' : '上拉加载更多'}}</text>
|
<text>{{isLoading ? '加载中...' : '上拉加载更多'}}</text>
|
||||||
</view>
|
</view>
|
||||||
|
</scroll-view>
|
||||||
|
|
||||||
<!-- 空状态 -->
|
<!-- 空状态 -->
|
||||||
<view class="empty-state" v-if="noticesList.length === 0 && !isLoading">
|
<view class="empty-state" v-if="noticesList.length === 0 && !isLoading">
|
||||||
<image src="/static/images/empty-notice.png" class="empty-image"></image>
|
<image src="/static/imgs/noData.png" class="empty-image"></image>
|
||||||
<text class="empty-text">暂无公告</text>
|
<text class="empty-text">暂无公告</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<Copyright/>
|
<Copyright />
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 底部导航 -->
|
|
||||||
<Footer></Footer>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { get } from '@/utils/request';
|
import {
|
||||||
import { IMAGE_BASE_URL } from '@/utils/config';
|
get
|
||||||
import { formatTime } from '@/utils/timeFormat';
|
} from '@/utils/request';
|
||||||
import Footer from '@/components/footer_common.vue';
|
import {
|
||||||
|
IMAGE_BASE_URL
|
||||||
|
} from '@/utils/config';
|
||||||
|
import {
|
||||||
|
formatTime
|
||||||
|
} from '@/utils/timeFormat';
|
||||||
import Copyright from '@/components/gx-copyright.vue';
|
import Copyright from '@/components/gx-copyright.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { Footer,Copyright },
|
components: {
|
||||||
|
Copyright
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
formatTime,
|
formatTime,
|
||||||
@ -76,17 +77,27 @@
|
|||||||
isLoading: false,
|
isLoading: false,
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
totalPages: 1,
|
totalPages: 1,
|
||||||
lastRequestTime: 0
|
lastRequestTime: 0,
|
||||||
|
scrollViewHeight: 500 // 初始高度,mounted中会重新计算
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.calculateScrollHeight();
|
||||||
this.getNotices();
|
this.getNotices();
|
||||||
this.initScrollListener();
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
this.removeScrollListener();
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 计算滚动区域高度
|
||||||
|
calculateScrollHeight() {
|
||||||
|
const systemInfo = uni.getSystemInfoSync();
|
||||||
|
const query = uni.createSelectorQuery().in(this);
|
||||||
|
query.select('.container').boundingClientRect(data => {
|
||||||
|
if (data) {
|
||||||
|
// 减去顶部导航和其他固定元素的高度
|
||||||
|
this.scrollViewHeight = systemInfo.windowHeight - 50;
|
||||||
|
}
|
||||||
|
}).exec();
|
||||||
|
},
|
||||||
|
|
||||||
async getNotices() {
|
async getNotices() {
|
||||||
// 防止重复请求
|
// 防止重复请求
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
@ -104,23 +115,34 @@
|
|||||||
await this.fetchNotices();
|
await this.fetchNotices();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
loadMore() {
|
||||||
|
if (!this.isLoading && this.currentPage < this.totalPages) {
|
||||||
|
console.log('触发加载更多,当前页:', this.currentPage);
|
||||||
|
this.currentPage += 1;
|
||||||
|
this.fetchNotices();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
async fetchNotices() {
|
async fetchNotices() {
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
uni.showLoading({ title: '加载中...', mask: true });
|
uni.showLoading({
|
||||||
|
title: '加载中...',
|
||||||
|
mask: true
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await get('/api/v1/apps/home/notices', {
|
const res = await get('/api/v1/apps/home/notices', {
|
||||||
current: this.currentPage,
|
current: this.currentPage,
|
||||||
pageSize: 10,
|
pageSize: 10, // 每页10条
|
||||||
}, {
|
}, {
|
||||||
timeout: 5000 // 设置超时时间
|
timeout: 5000
|
||||||
});
|
});
|
||||||
|
|
||||||
if (res?.success) {
|
if (res?.success) {
|
||||||
const processedData = res.data.map(item => ({
|
const processedData = res.data.map(item => ({
|
||||||
...item,
|
...item,
|
||||||
cover: this.processImageUrl(item.cover),
|
cover: this.processImageUrl(item.cover),
|
||||||
desc: this.filterHtmlTags(item.desc) // 过滤HTML标签防止XSS
|
desc: this.filterHtmlTags(item.desc)
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (this.currentPage === 1) {
|
if (this.currentPage === 1) {
|
||||||
@ -173,30 +195,6 @@
|
|||||||
url: `/pages/serviceNoticeDetail/index?Id=${id}`,
|
url: `/pages/serviceNoticeDetail/index?Id=${id}`,
|
||||||
animationType: 'slide-in-right'
|
animationType: 'slide-in-right'
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
initScrollListener() {
|
|
||||||
this.onScroll = () => {
|
|
||||||
const scrollHeight = document.documentElement.scrollHeight;
|
|
||||||
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
|
|
||||||
const clientHeight = document.documentElement.clientHeight;
|
|
||||||
|
|
||||||
// 距离底部200px时加载更多
|
|
||||||
if (scrollTop + clientHeight >= scrollHeight - 200 &&
|
|
||||||
this.currentPage < this.totalPages &&
|
|
||||||
!this.isLoading) {
|
|
||||||
this.currentPage++;
|
|
||||||
this.getNotices();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener('scroll', this.onScroll);
|
|
||||||
},
|
|
||||||
|
|
||||||
removeScrollListener() {
|
|
||||||
if (this.onScroll) {
|
|
||||||
window.removeEventListener('scroll', this.onScroll);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -226,8 +224,7 @@
|
|||||||
|
|
||||||
.content {
|
.content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-top: 30rpx;
|
// border-radius: 30rpx 30rpx 0 0;
|
||||||
border-radius: 30rpx 30rpx 0 0;
|
|
||||||
background-color: rgba(255, 255, 255, 0.85);
|
background-color: rgba(255, 255, 255, 0.85);
|
||||||
padding-bottom: env(safe-area-inset-bottom);
|
padding-bottom: env(safe-area-inset-bottom);
|
||||||
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
|
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);
|
||||||
@ -249,6 +246,7 @@
|
|||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
box-shadow: var(--shadow);
|
box-shadow: var(--shadow);
|
||||||
border: 1rpx solid var(--border-color);
|
border: 1rpx solid var(--border-color);
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
|
||||||
&:active {
|
&:active {
|
||||||
transform: scale(0.98);
|
transform: scale(0.98);
|
||||||
@ -381,6 +379,7 @@
|
|||||||
0% {
|
0% {
|
||||||
background-position: 100% 50%;
|
background-position: 100% 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
background-position: 0 50%;
|
background-position: 0 50%;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
static/imgs/weather.png
Normal file
BIN
static/imgs/weather.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
Loading…
x
Reference in New Issue
Block a user