upload project

This commit is contained in:
unknown 2025-12-27 17:16:03 +08:00
commit 06961cae04
422 changed files with 110626 additions and 0 deletions

View file

@ -0,0 +1,926 @@
const mapConfig = require('../../../utils/map-config.js');
const config = require('../../../config/config.js');
Page({
data: {
poiList: [],
markers: [],
latitude: '',
longitude: '',
originalLatitude: '', // 保存原始位置信息
originalLongitude: '',
originalLocationName: '', // 保存原始位置名称
originalAddress: '', // 保存原始详细地址
hasMovedMap: false,
isHideLocationSelected: false, // "不显示地点"是否被选中
currentPage: 1, // 当前页码
totalCount: 0, // 总地点数量
hasMore: true, // 是否有更多数据
loadingMore: false // 是否正在加载更多数据
},
onLoad(options) {
const latitude = parseFloat(options.latitude);
const longitude = parseFloat(options.longitude);
// 获取原始位置名称和详细地址
const originalLocationName = options.locationName ? decodeURIComponent(options.locationName) : '';
const originalAddress = options.address ? decodeURIComponent(options.address) : '';
const isHideLocationSelected = false;
wx.getLocation({
type: 'gcj02',
success: (res) => {
wx.request({
url: 'https://restapi.amap.com/v3/geocode/regeo',
method: 'GET',
data: {
key: config.amapKey || mapConfig.MAP_CONFIG.amapKey,
location: `${res.longitude},${res.latitude}`,
extensions: 'all'
},
success: (geoRes) => {
let city = '';
if (geoRes.data.status === '1' && geoRes.data.regeocode) {
if (geoRes.data.regeocode.addressComponent.city) {
city = geoRes.data.regeocode.addressComponent.city;
} else if (geoRes.data.regeocode.addressComponent.province) {
city = geoRes.data.regeocode.addressComponent.province;
}
}
// 设置导航栏标题
let title = '所在地点';
if (city) {
title = `所在地点-${city}`;
} else if (originalLocationName) {
title = `所在地点-${originalLocationName}`;
}
wx.setNavigationBarTitle({
title: title
});
},
fail: () => {
let city = '所在地点';
if (originalAddress) {
let cityMatch = originalAddress.match(/[^省]+省([^市]+市)/);
if (cityMatch && cityMatch[1]) {
city = cityMatch[1];
} else {
cityMatch = originalAddress.match(/([^区镇街道市]+市)/);
if (cityMatch && cityMatch[1]) {
city = cityMatch[1];
}
}
}
let title = '所在地点';
if (city && city !== '所在地点') {
title = `所在地点-${city}`;
} else if (originalLocationName) {
title = `所在地点-${originalLocationName}`;
}
wx.setNavigationBarTitle({
title: title
});
}
});
},
fail: () => {
// 获取位置失败
let city = '所在地点';
if (originalAddress) {
let cityMatch = originalAddress.match(/[^省]+省([^市]+市)/);
if (cityMatch && cityMatch[1]) {
city = cityMatch[1];
} else {
cityMatch = originalAddress.match(/([^区镇街道市]+市)/);
if (cityMatch && cityMatch[1]) {
city = cityMatch[1];
}
}
}
let title = '所在地点';
if (city && city !== '所在地点') {
title = `所在地点-${city}`;
} else if (originalLocationName) {
title = `所在地点-${originalLocationName}`;
}
wx.setNavigationBarTitle({
title: title
});
}
});
this.setData({
latitude,
longitude,
originalLatitude: latitude,
originalLongitude: longitude,
originalLocationName: originalLocationName,
originalAddress: originalAddress,
isHideLocationSelected: isHideLocationSelected,
markers: [{
id: 0,
latitude,
longitude,
iconPath: '/images/map/marker_position.png',
width: 50,
height: 50,
zIndex: 10
}]
});
// 显示加载提示
wx.showLoading({
title: '获取附近点位中...',
mask: true
});
// 初始化地图并获取附近地点
this.getNearbyPois(latitude, longitude);
},
// 获取附近1公里内的地点
getNearbyPois(latitude, longitude, isLoadMore = false) {
if (isLoadMore && (!this.data.hasMore || this.data.loadingMore)) {
return;
}
// 设置加载状态
if (isLoadMore) {
this.setData({ loadingMore: true });
} else {
// 显示加载提示
wx.showLoading({
title: '获取附近点位中...',
mask: true
});
// 重置页面状态
this.setData({
currentPage: 1,
hasMore: true,
poiList: []
});
}
const page = isLoadMore ? this.data.currentPage + 1 : 1;
const offset = 20;
wx.request({
url: 'https://restapi.amap.com/v3/place/around',
method: 'GET',
data: {
key: config.amapKey || mapConfig.MAP_CONFIG.amapKey,
location: `${longitude},${latitude}`,
radius: 1000,
offset: offset,
page: page,
extensions: 'all',
types: '050000|060000|070000|080000|090000|100000|110000|120000|130000|140000|150000|160000|170000|180000|190000|200000|210000|220000|230000|240000|250000|260000|270000|280000|290000|300000|310000|320000|330000',
sortrule: 'distance'
},
success: (res) => {
// 隐藏加载提示
if (!isLoadMore) {
wx.hideLoading();
}
// 记录API调用状态
if (res.data.status === '0') {
console.error('高德API返回错误:', res.data.info, '错误码:', res.data.infocode);
}
if (res.data.status === '1' && res.data.pois && res.data.pois.length > 0) {
const poiList = res.data.pois;
// 更新总数量
const totalCount = parseInt(res.data.count) || 0;
const enhancedPoiList = poiList.map(poi => {
let distance = poi.distance ? parseInt(poi.distance) : 0;
if (!distance && poi.location && poi.location.split(',').length === 2) {
const [poiLon, poiLat] = poi.location.split(',').map(coord => parseFloat(coord));
const latDiff = poiLat - latitude;
const lonDiff = poiLon - longitude;
distance = Math.round(Math.sqrt(latDiff * latDiff + lonDiff * lonDiff) * 111000);
}
let isSameAsPublishAddress = false;
// 提取分类信息
const category = poi.type ? poi.type.split(';').filter(t => t.trim()) : [];
const mainCategory = category.length > 0 ? category[0] : '未知分类';
const subCategory = category.length > 1 ? category[1] : '';
const phone = poi.tel || '';
const email = poi.email || '';
const website = poi.website || '';
const shopHours = poi.biz_time || '';
return {
...poi,
isSameAsPublishAddress: isSameAsPublishAddress,
distance: distance,
address: poi.address || '',
displayAddress: typeof poi.address === 'string' && poi.address.trim() !== '' ? poi.address : '地址未知',
mainCategory: mainCategory,
subCategory: subCategory,
phone: phone,
email: email,
website: website,
shopHours: shopHours,
typecode: poi.typecode || '',
pname: poi.pname || '',
cityname: poi.cityname || '',
adname: poi.adname || ''
};
});
const markers = this.createMarkers(enhancedPoiList, latitude, longitude);
if (isLoadMore) {
this.setData({
poiList: [...this.data.poiList, ...enhancedPoiList],
markers: [...this.data.markers, ...markers],
currentPage: page,
totalCount: totalCount,
hasMore: this.data.poiList.length + enhancedPoiList.length < totalCount,
loadingMore: false
});
} else {
this.setData({
poiList: enhancedPoiList,
markers: markers,
currentPage: page,
totalCount: totalCount,
hasMore: enhancedPoiList.length < totalCount
});
}
this.restoreSelectedState();
} else {
if (isLoadMore) {
this.setData({
loadingMore: false,
hasMore: false
});
} else {
wx.showToast({
title: '该位置1公里内无地点',
icon: 'none',
duration: 2000
});
}
}
},
fail: (error) => {
console.error('获取附近地点失败:', error);
// 隐藏加载提示
wx.hideLoading();
wx.showToast({
title: '获取真实地点数据失败',
icon: 'none',
duration: 2000
});
if (!config.mockData) {
return;
}
const mockPoiList = [
{
id: 'mock_1',
name: '附近咖啡厅',
address: '',
location: `${longitude},${latitude + 0.001}`,
type: '餐饮服务;咖啡厅',
typecode: '050101',
distance: 120,
pname: '北京市',
cityname: '北京市',
adname: '朝阳区',
tel: '010-12345678',
biz_time: '09:00-22:00'
},
{
id: 'mock_2',
name: '示例餐厅',
address: '和平路123号',
location: `${longitude + 0.003},${latitude}`,
type: '餐饮服务;中餐厅',
typecode: '050105',
distance: 330,
pname: '北京市',
cityname: '北京市',
adname: '朝阳区',
tel: '010-87654321',
biz_time: '10:00-21:30'
},
{
id: 'mock_3',
name: '购物中心',
address: '',
location: `${longitude},${latitude - 0.005}`,
type: '购物服务;购物中心',
typecode: '060101',
distance: 550,
pname: '北京市',
cityname: '北京市',
adname: '朝阳区',
tel: '010-11223344',
biz_time: '10:00-22:00'
},
{
id: 'mock_4',
name: '城市公园',
address: '文化街56号',
location: `${longitude - 0.007},${latitude}`,
type: '风景名胜;公园',
typecode: '110101',
distance: 770,
pname: '北京市',
cityname: '北京市',
adname: '朝阳区',
biz_time: '06:00-22:00'
},
{
id: 'mock_5',
name: '便利店',
address: '幸福路78号',
location: `${longitude + 0.0005},${latitude + 0.0005}`,
type: '购物服务;便利店',
typecode: '060203',
distance: 80,
pname: '北京市',
cityname: '北京市',
adname: '朝阳区',
tel: '010-55667788',
biz_time: '24小时'
},
{
id: 'mock_6',
name: '健身房',
address: '体育路12号',
location: `${longitude + 0.009},${latitude + 0.003}`,
type: '体育休闲服务;健身中心',
typecode: '140100',
distance: 950,
pname: '北京市',
cityname: '北京市',
adname: '朝阳区',
tel: '010-99887766',
biz_time: '06:00-23:00'
}
];
const enhancedMockList = mockPoiList.map(poi => {
// 计算距离
let distance = 0;
if (poi.location && poi.location.split(',').length === 2) {
const [poiLon, poiLat] = poi.location.split(',').map(coord => parseFloat(coord));
const latDiff = poiLat - latitude;
const lonDiff = poiLon - longitude;
distance = Math.round(Math.sqrt(latDiff * latDiff + lonDiff * lonDiff) * 111000);
}
// 提取分类信息
const category = poi.type ? poi.type.split(';').filter(t => t.trim()) : [];
const mainCategory = category.length > 0 ? category[0] : '未知分类';
const subCategory = category.length > 1 ? category[1] : '';
return {
...poi,
isSameAsPublishAddress: false,
distance: distance,
address: poi.address || '',
displayAddress: typeof poi.address === 'string' && poi.address.trim() !== '' ? poi.address : '地址未知',
mainCategory: mainCategory,
subCategory: subCategory,
phone: poi.tel || '',
email: poi.email || '',
website: poi.website || '',
shopHours: poi.biz_time || ''
};
});
const markers = this.createMarkers(enhancedMockList, latitude, longitude);
if (isLoadMore) {
this.setData({
poiList: [...this.data.poiList, ...enhancedMockList],
markers: [...this.data.markers, ...markers],
loadingMore: false
});
} else {
this.setData({
poiList: enhancedMockList,
markers: markers,
totalCount: enhancedMockList.length
});
}
this.restoreSelectedState();
wx.showToast({
title: '显示1公里范围内模拟地点',
icon: 'none'
});
}
});
},
// 恢复选中状态的方法
restoreSelectedState() {
try {
const poiList = this.data.poiList;
if (!poiList || poiList.length === 0) {
return;
}
let selectedPoi;
let isLocationHidden;
try {
selectedPoi = wx.getStorageSync('selectedPoi');
isLocationHidden = wx.getStorageSync('isLocationHidden');
} catch (storageError) {
console.error('从本地存储获取选中状态失败:', storageError);
selectedPoi = null;
isLocationHidden = false;
}
const isHideLocationSelected = isLocationHidden === true;
console.log('从本地存储获取的选中状态:', {
selectedPoi: selectedPoi ? JSON.stringify(selectedPoi) : 'null',
isLocationHidden: isLocationHidden,
isHideLocationSelected: isHideLocationSelected
});
this.setData({
isHideLocationSelected: isHideLocationSelected
});
if (isHideLocationSelected) {
const finalPoiList = poiList.map(poi => ({
...poi,
isSameAsPublishAddress: false
}));
this.setData({
poiList: finalPoiList
});
return;
}
if (!selectedPoi || typeof selectedPoi !== 'object') {
return;
}
let finalPoiList = poiList.map(poi => ({
...poi,
isSameAsPublishAddress: false
}));
// 定义匹配函数
const findMatchingPoi = (poiList, targetPoi) => {
// 位置精确匹配
const exactMatch = poiList.find(poi => {
return poi.location && targetPoi.location && poi.location === targetPoi.location;
});
if (exactMatch) {
return exactMatch;
}
// 名称和地址组合匹配
const looseMatch = poiList.find(poi => {
const poiName = poi.name && poi.name.toLowerCase();
const poiAddress = poi.address && poi.address.toLowerCase();
const targetName = targetPoi.name && targetPoi.name.toLowerCase();
const targetAddress = targetPoi.address && targetPoi.address.toLowerCase();
return (poiName && targetName && (poiName.includes(targetName) || targetName.includes(poiName))) ||
(poiAddress && targetAddress && (poiAddress.includes(targetAddress) || targetAddress.includes(poiAddress)));
});
if (looseMatch) {
return looseMatch;
}
// 名称模糊匹配
const fuzzyMatch = poiList.find(poi => {
const poiName = poi.name && poi.name.toLowerCase();
const targetName = targetPoi.name && targetPoi.name.toLowerCase();
// 检查名称是否有包含关系
return poiName && targetName && (poiName.includes(targetName) || targetName.includes(poiName));
});
if (fuzzyMatch) {
return fuzzyMatch;
}
return null;
};
const matchedPoi = findMatchingPoi(finalPoiList, selectedPoi);
if (matchedPoi) {
finalPoiList = finalPoiList.map(poi => ({
...poi,
isSameAsPublishAddress: poi.id === matchedPoi.id
}));
} else {
}
// 更新地点列表
this.setData({
poiList: finalPoiList
});
} catch (error) {
console.error('恢复选中状态时发生错误:', error);
try {
if (this.data.poiList && this.data.poiList.length > 0) {
const clearedPoiList = this.data.poiList.map(poi => ({
...poi,
isSameAsPublishAddress: false
}));
this.setData({
poiList: clearedPoiList
});
}
} catch (setDataError) {
console.error('设置清除选中状态失败:', setDataError);
}
}
},
createMarkers(poiList, userLat, userLon) {
const markers = [{
id: 0,
latitude: userLat,
longitude: userLon,
iconPath: '/images/map/marker_position.png',
width: 50,
height: 50,
zIndex: 10
}];
poiList.forEach((poi, index) => {
if (poi.location && poi.location.split(',').length === 2) {
const [lon, lat] = poi.location.split(',').map(coord => parseFloat(coord));
let markerIcon = '/images/map/marker_hong.png';
if (index % 3 === 1) markerIcon = '/images/map/marker_lan.png';
if (index % 3 === 2) markerIcon = '/images/map/marker_yinliao.png';
markers.push({
id: index + 1,
latitude: lat,
longitude: lon,
title: poi.name,
iconPath: markerIcon,
width: 40,
height: 40,
zIndex: 5,
callout: {
content: poi.name,
color: '#333',
fontSize: 24,
borderRadius: 4,
padding: 8,
bgColor: 'rgba(255, 255, 255, 0.9)',
display: 'BYCLICK'
}
});
}
});
return markers;
},
autoSelectFirstLocation(poiList) {
return;
},
// 选择地点
selectPoi(e) {
const { id } = e.currentTarget.dataset;
const poiIndex = parseInt(id);
if (this.data.poiList[poiIndex]) {
const selectedPoi = this.data.poiList[poiIndex];
// 获取当前保存的状态
const savedPoi = wx.getStorageSync('selectedPoi');
wx.removeStorageSync('isLocationHidden');
if (savedPoi === null) {
wx.removeStorageSync('selectedPoi');
}
const locationData = {
name: selectedPoi.name || '',
address: (typeof selectedPoi.address === 'string' && selectedPoi.address.trim() !== '') ? selectedPoi.address : '地址未知',
distance: Array.isArray(selectedPoi.distance) ?
(selectedPoi.distance.length > 0 ? selectedPoi.distance[0] : '') :
(selectedPoi.distance || ''),
location: selectedPoi.location || '',
type: selectedPoi.type || '',
typecode: selectedPoi.typecode || ''
};
if (!locationData.name && locationData.address) {
locationData.name = locationData.address;
}
if (!locationData.address && locationData.name) {
locationData.address = locationData.name;
}
wx.setStorageSync('selectedPoi', locationData);
let storedData = wx.getStorageSync('selectedPoi');
if (JSON.stringify(storedData) !== JSON.stringify(locationData)) {
wx.setStorageSync('selectedPoi', locationData);
storedData = wx.getStorageSync('selectedPoi');
}
const updatedPoiList = this.data.poiList.map((poi, index) => ({
...poi,
isSameAsPublishAddress: index === poiIndex
}));
this.setData({
poiList: updatedPoiList,
isHideLocationSelected: false
});
setTimeout(() => {
const finalStoredData = wx.getStorageSync('selectedPoi');
const pages = getCurrentPages();
let publishPage = null;
for (let i = pages.length - 1; i >= 0; i--) {
if (pages[i].route === 'subpackages/media/edits/edits') {
publishPage = pages[i];
break;
}
}
if (publishPage) {
if (publishPage.receiveLocationData && typeof publishPage.receiveLocationData === 'function') {
publishPage.receiveLocationData(locationData);
} else {
publishPage.setData({
currentLocation: locationData.address || locationData.name || locationData.toString(),
locationName: locationData.name || locationData.address || locationData.toString(),
distance: locationData.distance || '',
fullAddress: locationData.address && locationData.address !== locationData.name ? locationData.address : ''
});
console.log('发布页数据:', {
currentLocation: locationData.address || locationData.name || locationData.toString(),
locationName: locationData.name || locationData.address || locationData.toString(),
distance: locationData.distance || '',
fullAddress: locationData.address && locationData.address !== locationData.name ? locationData.address : ''
});
}
} else {
}
let delta = 1;
for (let i = pages.length - 1; i >= 0; i--) {
if (pages[i].route === 'subpackages/media/edits/edits') {
delta = pages.length - 1 - i;
break;
}
}
// 返回到发布页
wx.navigateBack({ delta: delta });
}, 100);
}
},
onMarkerTap(e) {
const markerId = e.markerId;
if (markerId > 0) {
const poiIndex = markerId - 1;
if (this.data.poiList[poiIndex]) {
const selectedPoi = this.data.poiList[poiIndex];
wx.removeStorageSync('isLocationHidden');
const locationData = {
name: selectedPoi.name || '',
address: (typeof selectedPoi.address === 'string' && selectedPoi.address.trim() !== '') ? selectedPoi.address : '地址未知',
distance: Array.isArray(selectedPoi.distance) ?
(selectedPoi.distance.length > 0 ? selectedPoi.distance[0] : '') :
(selectedPoi.distance || ''),
location: selectedPoi.location || '',
type: selectedPoi.type || '',
typecode: selectedPoi.typecode || ''
};
if (!locationData.name && locationData.address) {
locationData.name = locationData.address;
}
if (!locationData.address && locationData.name) {
locationData.address = locationData.name;
}
wx.setStorageSync('selectedPoi', locationData);
let storedData = wx.getStorageSync('selectedPoi');
if (JSON.stringify(storedData) !== JSON.stringify(locationData)) {
wx.setStorageSync('selectedPoi', locationData);
storedData = wx.getStorageSync('selectedPoi');
}
setTimeout(() => {
const finalStoredData = wx.getStorageSync('selectedPoi');
const pages = getCurrentPages();
let publishPage = null;
for (let i = pages.length - 1; i >= 0; i--) {
if (pages[i].route === 'subpackages/media/edits/edits') {
publishPage = pages[i];
break;
}
}
if (publishPage) {
if (publishPage.receiveLocationData && typeof publishPage.receiveLocationData === 'function') {
publishPage.receiveLocationData(locationData);
} else {
publishPage.setData({
currentLocation: locationData.address || locationData.name || locationData.toString(),
locationName: locationData.name || locationData.address || locationData.toString(),
distance: locationData.distance || '',
fullAddress: locationData.address && locationData.address !== locationData.name ? locationData.address : ''
});
console.log('发布页数据:', {
currentLocation: locationData.address || locationData.name || locationData.toString(),
locationName: locationData.name || locationData.address || locationData.toString(),
distance: locationData.distance || '',
fullAddress: locationData.address && locationData.address !== locationData.name ? locationData.address : ''
});
}
} else {
}
let delta = 1;
for (let i = pages.length - 1; i >= 0; i--) {
if (pages[i].route === 'subpackages/media/edits/edits') {
delta = pages.length - 1 - i;
break;
}
}
// 返回到发布页
wx.navigateBack({ delta: delta });
}, 100);
}
}
},
// 选择不显示地点
selectNoLocation() {
wx.setStorageSync('selectedPoi', null);
wx.setStorageSync('isLocationHidden', true);
let storedData = wx.getStorageSync('selectedPoi');
const updatedPoiList = this.data.poiList.map(poi => ({
...poi,
isSameAsPublishAddress: false
}));
this.setData({
hasSelectedLocation: true,
isHideLocationSelected: true,
poiList: updatedPoiList
}, () => {
setTimeout(() => {
const pages = getCurrentPages();
let publishPage = null;
for (let i = pages.length - 1; i >= 0; i--) {
if (pages[i].route === 'subpackages/media/edits/edits') {
publishPage = pages[i];
break;
}
}
if (publishPage) {
if (publishPage.receiveLocationData && typeof publishPage.receiveLocationData === 'function') {
publishPage.receiveLocationData(null);
} else {
publishPage.setData({
currentLocation: '',
locationName: '',
distance: '',
fullAddress: ''
});
}
} else {
}
let delta = 1;
for (let i = pages.length - 1; i >= 0; i--) {
if (pages[i].route === 'subpackages/media/edits/edits') {
delta = pages.length - 1 - i;
break;
}
}
// 返回到发布页
wx.navigateBack({ delta: delta });
}, 100);
});
},
// 生命周期函数
onShow() {
this.restoreSelectedState();
},
// 生命周期函数
onUnload() {
},
onRegionChange(e) {
if (e.type === 'end' && e.causedBy === 'drag') {
this.setData({ hasMovedMap: true });
// 获取地图中心坐标
this.mapCtx = wx.createMapContext('map');
this.mapCtx.getCenterLocation({
success: (res) => {
this.setData({
latitude: res.latitude,
longitude: res.longitude
});
// 重新获取附近地点
this.getNearbyPois(res.latitude, res.longitude);
}
});
}
},
// 地图点击事件
onMapTap(e) {
// 获取点击位置的经纬度
const { latitude, longitude } = e.detail;
// 更新地图中心坐标
this.setData({
latitude,
longitude
});
// 显示加载提示
wx.showLoading({
title: '获取附近点位中...',
mask: true
});
// 获取点击位置附近的点位
this.getNearbyPois(latitude, longitude);
},
// 跳转到搜索页面
navigateToSearchPage() {
wx.navigateTo({
url: '/subpackages/map-extras/searchLocation/searchLocation'
});
},
// 加载更多地点数据
loadMorePois() {
const { latitude, longitude } = this.data;
this.getNearbyPois(latitude, longitude, true);
}
});

View file

@ -0,0 +1,7 @@
{
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#121212",
"navigationBarTextStyle": "white",
"backgroundColor": "#121212",
"disableScroll": true
}

View file

@ -0,0 +1,47 @@
<view class="location-list-container">
<!-- 搜索框 -->
<view class="search-container">
<view class="search-button" bindtap="navigateToSearchPage">
<text class="search-text">搜索</text>
<image src="/images/Search.png" class="search-icon"></image>
</view>
</view>
<!-- 不显示地点选项 -->
<view class="hide-location-option" bindtap="selectNoLocation">
<text class="poi-name">不显示地点</text>
<image wx:if="{{isHideLocationSelected}}" src="/images/Selected.svg" mode="aspectFit" style="width: 40rpx; height: 40rpx;"></image>
</view>
<!-- 地点列表区域 -->
<view class="poi-list" bindscrolltolower="loadMorePois">
<view
wx:for="{{poiList}}"
wx:key="id"
class="poi-item"
data-name="{{item.name}}"
data-id="{{index}}"
bindtap="selectPoi"
>
<view class="poi-info">
<view class="poi-name">
{{item.name}}
<image wx:if="{{item.isSameAsPublishAddress}}" src="/images/Selected.svg" mode="aspectFit" class="selected-icon"></image>
</view>
<view class="poi-address">{{item.distance}}m | {{item.displayAddress}}</view>
</view>
</view>
<!-- 加载更多提示 -->
<button
wx:if="{{hasMore && !loadingMore}}"
class="load-more-btn"
bindtap="loadMorePois"
loading="{{loadingMore}}"
>
加载更多地点
</button>
<view class="no-more" wx:else>
<text>已显示全部地点</text>
</view>
</view>
</view>

View file

@ -0,0 +1,189 @@
.location-list-container {
height: 100vh;
display: flex;
flex-direction: column;
background-color: #121212;
color: #ffffff;
}
/* 顶部标题 */
.page-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
background-color: #121212;
border-bottom: 1rpx solid #333;
}
.page-title {
font-size: 34rpx;
font-weight: 600;
color: #ffffff;
}
.header-actions {
display: flex;
gap: 30rpx;
}
.header-icon {
width: 40rpx;
height: 40rpx;
filter: invert(1) brightness(100%);
}
/* 搜索框 */
.search-container {
padding: 20rpx 30rpx;
background-color: #121212;
}
.search-button {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #2c2c2c;
border: 2rpx solid #ffffff;
border-radius: 44rpx;
padding: 0 30rpx;
height: 88rpx;
width: 100%;
}
.search-button:active {
background-color: #3c3c3c;
}
.search-text {
color: #ffffff;
font-size: 28rpx;
}
.search-icon {
width: 32rpx;
height: 32rpx;
filter: invert(0.3) brightness(100%);
}
.search-box input {
flex: 1;
color: #ffffff;
font-size: 28rpx;
background-color: transparent;
}
.search-placeholder {
color: #888;
font-size: 28rpx;
}
/* 不显示地点选项 */
.hide-location-option {
padding: 24rpx 30rpx;
background-color: #1a1a1a;
border-bottom: 1rpx solid #333;
display: flex;
align-items: center;
justify-content: space-between;
}
.hide-location-option:active {
background-color: #2c2c2c;
}
.poi-name {
font-size: 28rpx;
color: #ffffff;
}
/* 地点列表样式 */
.poi-list {
flex: 1;
overflow-y: auto;
background-color: #121212;
}
.poi-item {
display: flex;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid #333;
background-color: #1a1a1a;
margin-bottom: 10rpx;
}
.poi-info {
flex: 1;
}
.poi-name {
font-size: 32rpx;
font-weight: 600;
color: #ffffff;
margin-bottom: 8rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
/* 选中图标样式 */
.selected-icon {
width: 40rpx;
height: 40rpx;
visibility: visible;
}
.poi-address {
font-size: 24rpx;
color: #ffffff;
opacity: 0.8;
}
.poi-item:active {
background-color: #2c2c2c;
}
.poi-list {
height: calc(100vh - 400rpx);
overflow-y: auto;
-webkit-overflow-scrolling: touch;
scroll-behavior: smooth;
}
.load-more {
padding: 20rpx;
text-align: center;
color: #999;
font-size: 28rpx;
margin-top: 10rpx;
margin-bottom: 10rpx;
}
.no-more {
padding: 20rpx;
text-align: center;
color: #999;
font-size: 28rpx;
margin-top: 10rpx;
margin-bottom: 10rpx;
}
.load-more-btn {
margin: 20rpx;
background-color: #f8f8f8;
color: #333;
border: 1rpx solid #ddd;
font-size: 28rpx;
line-height: 1.5;
padding: 20rpx 0;
}
.load-more-btn:active {
background-color: #eee;
}
/* 页面背景 */
page {
background-color: #f5f5f5;
}