This commit is contained in:
Leo_Ding 2025-07-29 10:56:33 +08:00
commit 967b9289d0
7 changed files with 2339 additions and 1581 deletions

View File

@ -1,20 +1,134 @@
<template> <template>
<view class="kfc-container"> <view class="container">
<!-- 顶部商品图片 --> <!-- 商品图片带轻微圆角和阴影 -->
<view class="container-img"> <view class="cover-container">
<image <image
class="kfc-bucket-img" class="store-cover"
:src="detailInfo.storeCover" :src="detailInfo.storeCover"
mode="aspectFill"
></image> ></image>
<view class="cover-overlay"></view>
</view> </view>
<!-- 店铺信息模块 --> <!-- 店铺信息卡片 -->
<view class="store-info"> <view class="store-card">
<view class="store-header">
<text class="store-name">{{ detailInfo.storeName }}</text> <text class="store-name">{{ detailInfo.storeName }}</text>
<view class="business-hours">营业时间<text>{{ detailInfo.openAt}}</text></view>
<view class="address">地址<text>{{ detailInfo.storeAddress }}</text></view>
<view class="distance">距您{{ local }}</view>
</view> </view>
<!-- 价格和距离合并一行 -->
<view class="price-distance-row">
<view class="price-tag" v-if="detailInfo.price !== undefined">
{{ detailInfo.price > 0 ? '¥' + detailInfo.price : '免费' }}
</view>
<view class="distance-badge">
<u-icon name="map" color="#fff" size="24"></u-icon>
<text>{{ formatDistance(local) }}</text>
</view>
</view>
<!-- 标签展示 -->
<view class="tags-container" v-if="detailInfo.labels && detailInfo.labels.length">
<view class="tag" v-for="(tag, index) in detailInfo.labels" :key="index">
<u-icon name="tags" size="20" color="#8dbafc" style="margin-right: 6rpx;"></u-icon>
{{ tag }}
</view>
</view>
<view class="divider dotted"></view>
<view class="info-grid">
<view class="info-item">
<u-icon name="map" color="#8dbafc" size="36"></u-icon>
<view class="info-content">
<text class="info-label">详细地址</text>
<text class="info-value">{{ detailInfo.storeAddress }}</text>
</view>
</view>
<view class="info-item" v-if="detailInfo.openAt">
<u-icon name="clock" color="#8dbafc" size="32"></u-icon>
<view class="info-content">
<text class="info-label">开放时间</text>
<text class="info-value">{{ detailInfo.openAt }}</text>
</view>
</view>
<view class="info-item" v-if="detailInfo.concatPhone">
<u-icon name="phone" color="#8dbafc" size="32"></u-icon>
<view class="info-content">
<text class="info-label">联系电话</text>
<text class="info-value">{{ detailInfo.concatPhone }}</text>
</view>
</view>
<view class="info-item" v-if="detailInfo.content">
<u-icon name="info-circle" color="#8dbafc" size="36"></u-icon>
<view class="info-content">
<text class="info-label">详情介绍</text>
<text class="info-value">{{ detailInfo.content }}</text>
</view>
</view>
<view class="info-item" v-if="detailInfo.remark">
<u-icon name="chat-fill" color="#8dbafc" size="36"></u-icon>
<view class="info-content">
<text class="info-label">备注信息</text>
<text class="info-value">{{ detailInfo.remark }}</text>
</view>
</view>
<view class="info-item" v-if="detailInfo.link">
<u-icon name="link" color="#8dbafc" size="36"></u-icon>
<view class="info-content">
<text class="info-label">相关链接</text>
<text class="info-value">{{ detailInfo.link }}</text>
</view>
</view>
</view>
<view class="divider dotted"></view>
<!-- 详情图片部分 -->
<view class="detail-section" v-if="detailInfo.imgs && detailInfo.imgs.length">
<text class="section-title">
<u-icon name="photo-fill" color="#8dbafc" size="32" style="margin-right: 12rpx;"></u-icon>
环境展示
</text>
<view class="image-grid">
<image
class="detail-image"
v-for="(img, index) in detailInfo.imgs"
:key="index"
:src="IMAGE_BASE_URL + img"
mode="aspectFill"
@click="previewImage(index)"
lazy-load
></image>
</view>
</view>
<!-- 地图导航按钮 -->
<view class="action-buttons">
<button class="nav-button" @click="openMap">
<u-icon name="map-fill" color="#fff" size="28"></u-icon>
<text>导航前往</text>
</button>
<button class="share-button" open-type="share" @click="handleShareClick">
<u-icon name="share-square" color="#8dbafc" size="28"></u-icon>
<text>分享</text>
</button>
</view>
</view>
<!-- 授权弹窗 -->
<u-modal
v-model="showLocationModal"
title="位置授权提示"
:content="locationModalContent"
show-cancel-button
@confirm="handleAuthConfirm"
@cancel="handleAuthCancel"
></u-modal>
</view> </view>
</template> </template>
@ -22,90 +136,548 @@
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 { formatTime, formatRelativeTime } from '@/utils/timeFormat'; import { formatTime, formatRelativeTime } from '@/utils/timeFormat';
export default { export default {
data() { data() {
return { return {
formatTime, formatTime,
IMAGE_BASE_URL, IMAGE_BASE_URL,
Id: null, Id: null,
detailInfo: {}, defaultCover: '/static/images/default-store-cover.png',
detailInfo: {
storeName: '',
storeCover: '',
storeAddress: '',
openAt: '',
content: '',
labels: [],
remark: '',
detailImages: [],
id: '',
createdAt: '',
updatedAt: '',
deletedAt: 0,
createdId: '',
deletedId: '',
typeId: '',
longitude: '',
latitude: '',
price: 0,
sequence: 0,
link: '',
status: 1
},
local: null, local: null,
showLocationModal: false,
locationModalContent: '我们需要获取您的位置信息,以便提供更精准的服务',
userLocation: null,
isRequestingLocation: false
}
},
computed: {
statusText() {
const statusMap = {
1: '营业中',
2: '已关闭',
3: '即将开业',
0: '未知状态'
};
return statusMap[this.detailInfo.status] || `状态: ${this.detailInfo.status}`;
},
statusClass() {
const statusMap = {
1: 'status-open',
2: 'status-closed',
3: 'status-soon'
};
return statusMap[this.detailInfo.status] || 'status-default';
},
statusIcon() {
const iconMap = {
1: 'home-fill',
2: 'close-circle-fill',
3: 'clock-fill'
};
return iconMap[this.detailInfo.status] || 'question-circle-fill';
} }
}, },
onLoad(options) { onLoad(options) {
if (options && options.Id && options.local) { if (options?.Id) {
this.Id = options.Id; this.Id = options.Id;
this.local = options.local; this.local = options.local || null;
this.getAroundDetail();
} }
//
wx.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
});
}, },
mounted() { mounted() {
this.getAroundDetail(); this.getAroundDetail();
}, },
methods: { methods: {
formatDistance(distance) {
if (!distance) return '未知距离';
if (distance < 1000) {
return `${distance}`;
} else {
return `${(distance / 1000).toFixed(1)}公里`;
}
},
async getAroundDetail() { async getAroundDetail() {
try { try {
const res = await get(`/api/v1/apps/surrounding/${this.Id}`); const res = await get(`/api/v1/apps/surrounding/${this.Id}`);
if (!res || !res.success) { if (res?.success) {
throw new Error('获取详情失败'); this.detailInfo = {
...this.detailInfo,
...res.data,
storeCover: res.data.storeCover?.startsWith('http')
? res.data.storeCover
: IMAGE_BASE_URL + res.data.storeCover
};
} }
res.data.storeCover = IMAGE_BASE_URL + res.data.storeCover; } catch (error) {
this.detailInfo = {...res.data}; console.error('获取详情失败:', error);
} catch (err) { uni.showToast({ title: '获取详情失败', icon: 'none' });
console.error('获取详情失败:', err); }
},
//
async handleShareClick() {
this.isRequestingLocation = true;
try {
await this.checkLocationPermission();
} catch (error) {
console.error('位置授权异常:', error);
} finally {
this.isRequestingLocation = false;
}
},
//
async checkLocationPermission() {
const status = await this.getPermissionStatus();
if (status === 'granted') {
await this.getUserLocation();
return;
} }
if (status === 'none') {
//
this.requestLocationPermission();
} else {
//
this.showLocationModal = true;
}
},
//
getPermissionStatus() {
return new Promise((resolve) => {
uni.getSetting({
success: (res) => {
if (res.authSetting['scope.userLocation'] === undefined) {
resolve('none');
} else if (res.authSetting['scope.userLocation']) {
resolve('granted');
} else {
resolve('denied');
}
},
fail: () => resolve('none')
});
});
},
//
requestLocationPermission() {
uni.authorize({
scope: 'scope.userLocation',
success: () => this.getUserLocation(),
fail: (err) => {
console.error('授权失败:', err);
this.showLocationModal = true;
}
});
},
//
getUserLocation() {
return new Promise((resolve, reject) => {
uni.getLocation({
type: 'wgs84',
success: (res) => {
this.userLocation = {
latitude: res.latitude,
longitude: res.longitude
};
resolve(res);
},
fail: (err) => {
console.error('获取位置失败:', err);
reject(err);
}
});
});
},
//
handleAuthConfirm() {
uni.openSetting({
success: (res) => {
if (res.authSetting['scope.userLocation']) {
this.getUserLocation().catch(() => {
uni.showToast({ title: '获取位置失败', icon: 'none' });
});
}
this.showLocationModal = false;
}
});
},
//
handleAuthCancel() {
this.showLocationModal = false;
uni.showToast({ title: '已取消位置授权', icon: 'none' });
},
//
onShareAppMessage() {
return {
title: this.detailInfo.storeName || '发现一个好地方',
path: `/pages/surrounding/detail?Id=${this.Id}`,
imageUrl: this.detailInfo.storeCover,
success: () => {
this.logShareEvent();
},
fail: (err) => {
console.error('分享失败:', err);
}
};
},
//
onShareTimeline() {
return {
title: this.detailInfo.storeName || '发现一个好地方',
query: `Id=${this.Id}`,
imageUrl: this.detailInfo.storeCover
};
},
openMap() {
const { latitude, longitude, storeName, storeAddress } = this.detailInfo;
if (latitude && longitude) {
uni.openLocation({
latitude: Number(latitude),
longitude: Number(longitude),
name: storeName,
address: storeAddress,
success: () => {
console.log('打开地图成功');
},
fail: (err) => {
console.error('打开地图失败:', err);
uni.showToast({
title: '打开地图失败',
icon: 'none'
});
}
});
} else {
uni.showToast({
title: '暂无位置信息',
icon: 'none'
});
}
},
previewImage(index) {
if (!this.detailInfo.detailImages || !this.detailInfo.detailImages.length) return;
uni.previewImage({
current: index,
urls: this.detailInfo.detailImages.map(img => img.startsWith('http') ? img : IMAGE_BASE_URL + img)
});
},
handleShare() {
uni.showActionSheet({
itemList: ['分享到微信', '分享到朋友圈', '复制链接'],
success: (res) => {
uni.showToast({
title: `已选择: ${res.tapIndex === 0 ? '微信' : res.tapIndex === 1 ? '朋友圈' : '复制链接'}`,
icon: 'none'
});
}
});
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// 便 $primary-color: #8dbafc;
$primary-color: #999; $secondary-color: #00A699;
$title-size: 36rpx; $dark-color: #2D2D2D;
$text-size: 26rpx; $gray-color: #767676;
$spacing: 30rpx; $light-gray: #F7F7F7;
$border-radius: 10rpx; $border-color: #EBEBEB;
$success-color: #52c41a;
$warning-color: #faad14;
$danger-color: #ff4d4f;
.kfc-container { $border-radius: 24rpx;
padding: 10px; $spacing: 32rpx;
$card-padding: 40rpx;
$shadow-light: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
$shadow-medium: 0 10rpx 30rpx rgba(0, 0, 0, 0.08);
.container-img{ .container {
max-width: 750rpx; background-color: $light-gray;
min-height: 100vh;
padding-bottom: 80rpx;
.cover-container {
width: 100%;
height: 500rpx; height: 500rpx;
// position: relative;
.kfc-bucket-img { overflow: hidden;
border-bottom-left-radius: $border-radius;
border-bottom-right-radius: $border-radius;
.store-cover {
width: 100%; width: 100%;
height: 100%; height: 100%;
transition: transform 0.5s ease;
}
.store-cover:active {
transform: scale(1.02);
}
.cover-overlay {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 160rpx;
background: linear-gradient(transparent, rgba(0,0,0,0.6));
}
}
.store-card {
background: #FFFFFF;
border-radius: $border-radius; border-radius: $border-radius;
} margin: -60rpx $spacing 0;
padding: $card-padding;
position: relative;
z-index: 2;
box-shadow: $shadow-medium;
transition: transform 0.3s, box-shadow 0.3s;
&:active {
transform: translateY(2rpx);
box-shadow: $shadow-light;
} }
.store-header {
display: flex;
// justify-content: space-between;
.store-info { align-items: flex-start;
margin-top: $spacing; margin-bottom: 20rpx;
.store-name { .store-name {
font-size: $title-size; font-size: 44rpx;
font-weight: bold; font-weight: 700;
//margin-bottom: $spacing / 2; color: $dark-color;
display: block; line-height: 1.3;
word-break: break-word;
flex: 1;
} }
.business-hours,
.address,
.distance {
font-size: $text-size;
color: $primary-color;
margin-bottom: 5px;
display: block;
text{
color: #333;
// font-weight: 900;
} }
.price-distance-row {
display: flex;
align-items: center;
margin-bottom: 30rpx;
.price-tag {
background: #f5f8ff;
color: $primary-color;
padding: 4rpx 16rpx;
border-radius: 20rpx;
font-size: 28rpx;
font-weight: 600;
margin-right: 12rpx;
white-space: nowrap;
}
.distance-badge {
background: $primary-color;
border-radius: 40rpx;
padding: 8rpx 20rpx;
display: flex;
align-items: center;
color: white;
font-size: 26rpx;
white-space: nowrap;
.u-icon {
margin-right: 8rpx;
}
}
}
.tags-container {
display: flex;
flex-wrap: wrap;
margin-bottom: 24rpx;
gap: 12rpx;
.tag {
background-color: #f0f7ff;
color: $primary-color;
padding: 8rpx 20rpx;
border-radius: 30rpx;
font-size: 26rpx;
border: 1rpx solid rgba($primary-color, 0.3);
display: inline-flex;
align-items: center;
}
}
.divider {
height: 2rpx;
margin: $spacing 0;
&.dotted {
background: repeating-linear-gradient(to right, $border-color, $border-color 4rpx, transparent 4rpx, transparent 8rpx);
}
}
.info-grid {
display: flex;
flex-direction: column;
.info-item {
display: flex;
padding: 24rpx 0;
align-items: flex-start;
border-bottom: 2rpx dashed $border-color;
&:last-child {
border-bottom: none;
}
.u-icon {
margin-right: 20rpx;
margin-top: 4rpx;
flex-shrink: 0;
}
.info-content {
flex: 1;
.info-label {
display: block;
font-size: 26rpx;
color: $gray-color;
margin-bottom: 8rpx;
padding-left: 10rpx;
}
.info-value {
display: block;
font-size: 28rpx;
color: $dark-color;
line-height: 1.6;
word-break: break-all;
padding-left: 10rpx;
}
}
}
}
.action-buttons {
margin-top: 40rpx;
display: flex;
gap: 20rpx;
button {
flex: 1;
height: 80rpx;
line-height: 80rpx;
border-radius: 50rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 30rpx;
border: none;
transition: all 0.3s;
font-weight: 500;
.u-icon {
margin-right: 10rpx;
}
&:active {
transform: scale(0.98);
opacity: 0.9;
}
}
.nav-button {
background: $primary-color;
color: white;
box-shadow: 0 6rpx 16rpx rgba(141, 186, 252, 0.4);
}
.share-button {
background: #f0f7ff;
color: $primary-color;
border: 2rpx solid $primary-color;
}
}
}
.detail-section {
margin-top: $spacing;
.section-title {
display: flex;
align-items: center;
font-size: 32rpx;
font-weight: 600;
color: $dark-color;
margin-bottom: 24rpx;
}
.image-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
margin-bottom: $spacing;
}
.detail-image {
width: 100%;
height: 280rpx;
border-radius: 16rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
transition: transform 0.3s, box-shadow 0.3s;
overflow: hidden;
}
.detail-image:active {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.15);
} }
} }
} }

View File

@ -1,17 +1,20 @@
<template> <template>
<view class="container"> <view class="container">
<view v-for="(item, index) in list" :key="index" class="shop-card" @click="goPage('aroundDetail')"> <view v-for="(item, index) in list" :key="index" class="shop-card" @click="goDetail(item.id,item.distance)">
<u-cell :border="false" class="custom-cell"> <u-cell :border="false" class="custom-cell">
<image slot="icon" :src="item.image" mode="aspectFill" class="cell-image"></image> <image slot="icon" :src="`${IMAGE_BASE_URL}`+item.storeCover" mode="aspectFill" class="cell-image"></image>
<view slot="title" class="cell-right"> <view slot="title" class="cell-right">
<view class="shop-name">{{ item.name }}</view> <view class="shop-name">{{ item.storeName }}</view>
<view class="shop-info"> <view class="shop-info">
<!-- <text> {{ item.rating }} </text> --> <text class="price">{{ item.price > 0 ? `人均¥${item.price}` : '免费开放' }}</text>
<text>人均¥{{ item.perCapita }}</text> <text class="distance">{{ formatDistance(item.distance) }}</text>
<text class="distance">直线{{ item.distance }}m</text>
</view> </view>
<view class="desc-container"> <view class="shop-desc" v-if="item.content">
<text class="desc">{{ "“" + item.desc + "”" }}</text> <text>{{ truncateContent(item.content) }}</text>
</view>
<view class="open-time" v-if="item.openAt">
<u-icon name="clock" size="24" color="#8a8a8a"></u-icon>
<text>开放时间{{ item.openAt }}</text>
</view> </view>
</view> </view>
</u-cell> </u-cell>
@ -20,128 +23,173 @@
</template> </template>
<script> <script>
import { get, post } from '@/utils/request';
import { IMAGE_BASE_URL, BASE_URL } from '@/utils/config';
export default { export default {
data() { data() {
return { return {
list: [{ IMAGE_BASE_URL,
image: "/static/imgs/service/hema.png", // static Id: null,
name: '肯德基(南通紫琅店)', latitude: null,
rating: 4.8, longitude: null,
monthSales: 4683, list: []
perCapita: 30,
distance: 221,
desc: '超棒,同学们都说好吃'
},
{
image: "/static/imgs/service/hema.png",
name: '汉堡王(南通紫琅店)',
rating: 4.8,
monthSales: 4683,
perCapita: 30,
distance: 221,
desc: '超棒,同学们都说好吃'
},
{
image: "/static/imgs/service/hema.png",
name: '瑞幸咖啡(南通紫琅店)',
rating: 4.8,
monthSales: 4683,
perCapita: 30,
distance: 221,
desc: '超棒,同学们都说不错'
},
{
image: "/static/imgs/service/hema.png",
name: '绿茶餐厅',
rating: 4.8,
monthSales: 4683,
perCapita: 30,
distance: 221,
desc: '超棒,同学们都说好吃'
}
]
}; };
}, },
onLoad() { onLoad(options) {
if (options && options.Id && options.latitude && options.longitude) {
this.Id = options.Id;
this.longitude = options.longitude;
this.latitude = options.latitude;
}
},
mounted() {
this.getAroundList();
}, },
methods: { methods: {
// async getAroundList() {
goPage(page) { let params = {
console.log("==进来", page) current: 1,
uni.navigateTo({ pageSize: 100,
url: `/pages/${page}/index`, longitude: this.longitude,
success: () => { latitude: this.latitude,
console.log('切换到tabBar页面成功'); typeId: this.Id,
},
fail: (err) => {
console.error('切换到tabBar页面失败:', err);
} }
try {
const res = await get('/api/v1/apps/surrounding', params);
if (!res || !res.success) {
throw new Error('获取列表失败');
}
this.list = res.data || [];
} catch (err) {
console.error('获取列表失败:', err);
uni.showToast({
title: '加载失败',
icon: 'none'
});
}
},
goDetail(id, local) {
uni.navigateTo({
url: `/pages/aroundDetail/index?Id=${id}&local=${local}`,
}); });
}, },
formatDistance(distance) {
if (distance >= 1000) {
return `距离${(distance / 1000).toFixed(1)}km`;
}
return `距离${Math.round(distance)}m`;
},
truncateContent(content) {
if (content.length > 60) {
return content.substring(0, 60) + '...';
}
return content;
}
} }
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.container { .container {
padding: 10px; padding: 20rpx;
background-color: #f8f9fa;
min-height: 100vh;
}
.shop-card { .shop-card {
margin-bottom: 15px; margin-bottom: 24rpx;
border-radius: 10px; border-radius: 16rpx;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
background-color: #fff; background-color: #fff;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
overflow: hidden;
transition: all 0.2s ease;
&:active {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
}
} }
.custom-cell { .custom-cell {
display: flex; padding: 0;
align-items: center;
padding: 12px 15px;
} }
.cell-image { .cell-image {
width: 80px; width: 240rpx;
height: 80px; height: 240rpx;
border-radius: 8px; flex-shrink: 0;
background-color: #f5f5f5;
} }
.cell-right { .cell-right {
display: flex; padding: 24rpx;
flex-direction: column; flex: 1;
margin-left: 10px; }
.shop-name { .shop-name {
font-size: 16px; font-size: 32rpx;
font-weight: bold; font-weight: 600;
margin-bottom: 4px; color: #2c3e50;
margin-bottom: 12rpx;
line-height: 1.4;
} }
.shop-info { .shop-info {
font-size: 12px;
color: #999;
margin-bottom: 4px;
display: flex; display: flex;
flex-wrap: wrap; justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
font-size: 26rpx;
.price {
color: #3498db;
font-weight: 500;
background-color: rgba(52, 152, 219, 0.1);
padding: 4rpx 12rpx;
border-radius: 6rpx;
}
.distance { .distance {
margin-left: auto; color: #7f8c8d;
font-size: 24rpx;
display: flex;
align-items: center;
&::before {
content: '';
display: inline-block;
width: 24rpx;
height: 24rpx;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%237f8c8d"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></svg>');
background-size: contain;
background-repeat: no-repeat;
margin-right: 6rpx;
}
} }
} }
.desc-container { .shop-desc {
display: inline-block; font-size: 26rpx;
margin-top: 5px; color: #555;
line-height: 1.6;
margin: 12rpx 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
text-overflow: ellipsis;
} }
.desc { .open-time {
font-size: 12px; display: flex;
padding: 5px 10px; align-items: center;
color: rgba(128, 128, 128, 1); font-size: 24rpx;
background: rgba(229, 229, 229, 0.5); color: #7f8c8d;
border-radius: 4px; margin-top: 8rpx;
display: inline-block;
} .u-icon {
margin-right: 8rpx;
} }
} }
</style> </style>

View File

@ -87,7 +87,7 @@
<view class="card-bg"></view> <view class="card-bg"></view>
</view> </view>
<image class="card-icon" src="/static/imgs/index/bangzhu.png" <image class="card-icon" src="/static/imgs/index/bangzhu.png"
style="width: 76rpx;height: 76rpx;"></image> style="width: 76rpx;height: 76rpx; bottom: 32rpx;" ></image>
</view> </view>
<view class="service-card card-2" @click="goDetail('serviceTickets')" hover-class="card-hover"> <view class="service-card card-2" @click="goDetail('serviceTickets')" hover-class="card-hover">
@ -503,7 +503,7 @@
width: 90rpx; width: 90rpx;
height: 90rpx; height: 90rpx;
right: 24rpx; right: 24rpx;
bottom: 24rpx; bottom: 20rpx;
transition: all 0.3s ease; transition: all 0.3s ease;
} }

View File

@ -26,7 +26,7 @@
<!-- 功能按钮区域 --> <!-- 功能按钮区域 -->
<view class="function-card"> <view class="function-card">
<view class="button-item" v-for="(item, index) in choseList" :key="index" @click="goPage(item.pageUrl)"> <view class="button-item" v-for="(item, index) in choseList" :key="index" @click="goPage(item)">
<view class="button-content"> <view class="button-content">
<image class="icon" :src='item.url' mode="aspectFit"></image> <image class="icon" :src='item.url' mode="aspectFit"></image>
<text class="label">{{item.name}}</text> <text class="label">{{item.name}}</text>
@ -85,6 +85,14 @@
</view> </view>
</u-modal> </u-modal>
<u-modal :show="showPhoneDialog" title="联系社区" confirm-text="拨打" cancel-text="取消" @confirm="callCommunityPhone"
@cancel="showPhoneDialog = false">
<view class="phone-dialog-content">
<text>社区电话</text>
<text class="phone-number">{{communityPhone}}</text>
</view>
</u-modal>
<Footer></Footer> <Footer></Footer>
</view> </view>
</template> </template>
@ -158,6 +166,8 @@
name: '联系社区', name: '联系社区',
}, },
], ],
communityPhone: '0513-59000051',
showPhoneDialog: false
} }
}, },
onShow() { onShow() {
@ -550,19 +560,52 @@
}, },
// //
goPage(page) { goPage(item) {
if (item.key === 6) { //
this.handleContactCommunity();
return;
}
if (!this.checkLogin()) { if (!this.checkLogin()) {
this.showEditModal = true; this.showEditModal = true;
return; return;
} }
if (page) { if (item.pageUrl) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/${page}/index` url: `/pages/${item.pageUrl}/index`
}); });
} }
}, },
//
handleContactCommunity() {
if (!this.checkLogin()) {
this.showEditModal = true;
return;
}
this.showPhoneDialog = true;
},
//
callCommunityPhone() {
uni.makePhoneCall({
phoneNumber: this.communityPhone,
success: () => {
console.log('拨打电话成功');
},
fail: (err) => {
uni.showToast({
title: '拨打电话失败',
icon: 'none'
});
console.error('拨打电话失败:', err);
}
});
this.showPhoneDialog = false;
},
// //
checkLogin() { checkLogin() {
const token = uni.getStorageSync('token'); const token = uni.getStorageSync('token');
@ -825,7 +868,8 @@
opacity: 0.9; opacity: 0.9;
} }
.wechat-icon, .phone-icon { .wechat-icon,
.phone-icon {
width: 40rpx; width: 40rpx;
height: 40rpx; height: 40rpx;
margin-right: 15rpx; margin-right: 15rpx;
@ -839,5 +883,17 @@
text-align: center; text-align: center;
} }
} }
.phone-dialog-content {
padding: 40rpx;
text-align: center;
font-size: 32rpx;
.phone-number {
font-weight: bold;
color: #2979ff;
margin-left: 10rpx;
}
}
} }
</style> </style>

View File

@ -1,25 +1,27 @@
<template> <template>
<view class="container"> <view class="container">
<view class="nearby-page"> <view class="nearby-page">
<!-- 附近美食模块 --> <!-- 附近美食模块 -->
<view class="section shadow" v-for="(item,index) in aroundList" :key="index"> <view class="section shadow" v-for="(item,index) in aroundList" :key="index">
<view class="section-header" @click="goPage('aroundList')"> <view class="section-header" @click="goPage(item.id)">
<view class="section-title">{{item.label}}</view> <view class="section-title">{{item.label}}</view>
<u-icon name="arrow-right" size="20" color="#999"></u-icon> <u-icon name="arrow-right" size="20" color="#999"></u-icon>
</view> </view>
<view class="goods-list"> <!-- 优化使用网格布局实现更稳定的四列 -->
<view class="goods-item" v-for="i in item.serviceList" @click="goDetail(i.id,i.distance)"> <view class="goods-grid">
<image class="goods-img" :src="`${IMAGE_BASE_URL}`+i.storeCover"></image> <view class="goods-item" v-for="i in item.serviceList" :key="i.id"
@click="goDetail(i.id,i.distance)">
<image class="goods-img" :src="`${IMAGE_BASE_URL}`+i.storeCover" mode="aspectFill"></image>
<view class="goods-info">
<text class="goods-name">{{ i.storeName }}</text> <text class="goods-name">{{ i.storeName }}</text>
<view class="goods-distance"> <view class="goods-distance">
<u-icon name="map" size="18" color="#c6d8fa"></u-icon> <u-icon name="map" size="18" color="#c6d8fa"></u-icon>
{{ i.distance + '米'}} <text>{{ formatDistance(i.distance) }} </text>
</view>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
<Footer></Footer> <Footer></Footer>
</view> </view>
@ -27,78 +29,68 @@
<script> <script>
import Footer from '@/components/footer_common.vue'; import Footer from '@/components/footer_common.vue';
import { import { get, post } from '@/utils/request';
get, import { IMAGE_BASE_URL, BASE_URL } from '@/utils/config';
post import { formatTime, formatRelativeTime } from '@/utils/timeFormat';
} from '@/utils/request';
import {
IMAGE_BASE_URL,
BASE_URL
} from '@/utils/config';
import {
formatTime,
formatRelativeTime
} from '@/utils/timeFormat';
export default { export default {
components: { components: { Footer },
Footer
},
data() { data() {
return { return {
IMAGE_BASE_URL, IMAGE_BASE_URL,
aroundList:[], aroundList:[],
longitude:null,
latitude:null,
} }
}, },
onLoad() { onLoad() {},
},
mounted() { mounted() {
this.surroundingList(); this.surroundingList();
}, },
methods: { methods: {
//
goDetail(id, local) { goDetail(id, local) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/aroundDetail/index?Id=${id}&local=${local}`, url: `/pages/aroundDetail/index?Id=${id}&local=${local}`,
}); });
}, },
goPage(id){
uni.navigateTo({
url: `/pages/aroundList/index?Id=${id}&latitude=${this.latitude}&longitude=${this.longitude}`,
});
},
formatDistance(distance) {
if (!distance) return '未知距离';
if (distance < 1000) {
return `${distance}`;
} else {
return `${(distance / 1000).toFixed(1)}公里`;
}
},
async surroundingList() { async surroundingList() {
const position = await this.getCurrentPosition(); const position = await this.getCurrentPosition();
this.latitude = position.latitude;
this.longitude = position.longitude;
let params = { let params = {
current: 1, current: 1,
pageSize: 10, pageSize: 10,
longitude: position.longitude, longitude: position.longitude,
latitude: position.latitude, latitude: position.latitude
// statusArray:"2,3,4",
}; };
try { try {
const res = await get('/api/v1/apps/surrounding-type', params); const res = await get('/api/v1/apps/surrounding-type', params);
if (!res || !res.success) { if (!res || !res.success) {
throw new Error('获取周边服务失败'); throw new Error('获取周边服务失败');
} }
console.log("---res", res)
this.aroundList = [...res.data]; this.aroundList = [...res.data];
// res.data.forEach(item => {
// let imgUrl = item.cover;
// if (!imgUrl.startsWith('http') && !imgUrl.startsWith('https')) {
// item.cover = IMAGE_BASE_URL + imgUrl;
// }
// })
// this.activityList = [...res.data];
} catch (err) { } catch (err) {
console.error('获取周边服务失败:', err); console.error('获取周边服务失败:', err);
} }
}, },
getCurrentPosition() { getCurrentPosition() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uni.getLocation({ uni.getLocation({
type: 'wgs84', type: 'wgs84',
success: (res) => { success: (res) => {
console.log('当前位置:', res);
resolve({ resolve({
longitude: res.longitude, longitude: res.longitude,
latitude: res.latitude latitude: res.latitude
@ -123,97 +115,127 @@
.container { .container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; min-height: 100vh;
background: #f8faff; background: #f8faff;
padding-bottom: 400rpx; padding-bottom: 120rpx;
}
.nearby-page { .nearby-page {
padding: 20rpx; padding: 20rpx 24rpx;
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
flex: 1;
} }
// section
.section { .section {
margin: 30rpx 0; // margin: 32rpx 0;
padding: 20rpx; padding: 24rpx;
border-radius: 16rpx; // border-radius: 20rpx;
background-color: #fff; background-color: #fff;
transition: transform 0.3s ease; // transition: all 0.3s ease;
box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.06);
// &:active {
&:hover { transform: scale(0.98);
transform: translateY(-5rpx);
} }
} }
//
.shadow {
box-shadow: 0 8rpx 16rpx rgba(0, 0, 0, 0.08); //
}
.section-header { .section-header {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 20rpx; margin-bottom: 24rpx;
padding: 0 10rpx; padding: 0 10rpx;
} }
.section-title { .section-title {
font-size: 34rpx; font-size: 36rpx;
font-weight: 600; font-weight: 600;
color: #333; color: #333;
/* 修正后的边框样式 */ border-left: 8rpx solid #8dbafc;
border-left: 10rpx solid rgba(141, 186, 252, 0.55); padding-left: 20rpx;
padding-left: 16rpx; line-height: 1.4;
} }
.goods-list { /* 优化使用grid布局实现更稳定的四列分布 */
display: flex; .goods-grid {
flex-wrap: wrap; display: grid;
// justify-content:; grid-template-columns: repeat(4, 1fr); /* 强制四列布局 */
gap: 10rpx; /* 统一间距 */
} }
.goods-item { .goods-item {
width: 23%; border-radius: 16rpx;
text-align: center; overflow: hidden;
margin-bottom: 20rpx; background: #fff;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
transition: transform 0.2s ease, box-shadow 0.2s ease;
&:active {
transform: scale(0.96);
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
} }
.goods-img { .goods-img {
width: 150rpx; width: 100%;
height: 150rpx; height: 160rpx; /* 优化图片高度比例 */
border-radius: 12rpx; border-radius: 12rpx 12rpx 0 0;
// margin-bottom: 10rpx; display: block;
object-fit: cover; // object-fit: cover; /* 确保图片不变形 */
}
.goods-info {
padding: 16rpx;
} }
.goods-name { .goods-name {
font-size: 24rpx; font-size: 24rpx;
display: block;
margin-bottom: 6rpx;
color: #333; color: #333;
white-space: nowrap; font-weight: 500;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
text-align: left; line-height: 1.5;
margin-bottom: 8rpx;
} }
// 使
.goods-distance { .goods-distance {
font-size: 22rpx; font-size: 22rpx;
color: #999; color: #666;
display: flex; display: flex;
justify-content: flex-end;
align-items: center; align-items: center;
text-align: right;
//
.u-icon { .u-icon {
margin-right: 6rpx; margin-right: 4rpx;
font-size: 18rpx;
} }
} }
/* 响应式优化:小屏幕自动调整为两列 */
@media (max-width: 750rpx) { /* 适配常见手机屏幕 */
.goods-grid {
grid-template-columns: repeat(2, 1fr); /* 小屏幕两列 */
}
.goods-img {
height: 200rpx; /* 增加小屏幕图片高度 */
}
.goods-name {
font-size: 26rpx; /* 增大字体 */
}
}
/* 针对超小屏幕的额外适配 */
@media (max-width: 375rpx) {
.goods-grid {
grid-template-columns: 1fr; /* 极小屏幕单列 */
}
.goods-img {
height: 240rpx;
}
} }
</style> </style>

View File

@ -55,8 +55,7 @@
<!-- 只在一级评论显示折叠按钮 --> <!-- 只在一级评论显示折叠按钮 -->
<text class="fold-btn" v-if="comment.level === 0 && hasChildren(comment)" <text class="fold-btn" v-if="comment.level === 0 && hasChildren(comment)"
@click="toggleFold(comment.id)"> @click="toggleFold(comment.id)">
{{ foldedComments.includes(comment.id) ? '展开' : '折叠' }} {{ getChildCount(comment) }}条回复{{ foldedComments.includes(comment.id) ? '展开' : '折叠' }}
{{ getChildCount(comment) }}条回复
</text> </text>
</view> </view>
</view> </view>
@ -126,6 +125,28 @@
} }
}, },
methods: { methods: {
//
checkLogin() {
const token = uni.getStorageSync('token'); // token
return !!token;
},
//
goToLogin() {
uni.showModal({
title: '提示',
content: '请先登录再进行评论',
confirmText: '前往登录',
success: (res) => {
if (res.confirm) {
uni.navigateTo({
url: '/pages/mine/index' //
});
}
}
});
},
// //
previewImage(index) { previewImage(index) {
if (!this.postData.images || !this.postData.images.length) return; if (!this.postData.images || !this.postData.images.length) return;
@ -236,6 +257,13 @@
// / // /
async submitComment() { async submitComment() {
//
if (!this.checkLogin()) {
this.goToLogin();
this.newComment = "";
return;
}
const content = this.newComment.trim(); const content = this.newComment.trim();
if (!content || this.submitting) return; if (!content || this.submitting) return;
@ -244,7 +272,7 @@
const requestData = { const requestData = {
content: content, content: content,
reciprocityId: this.postData.id, reciprocityId: this.postData.id,
rootHistoryId: this.replyingTo || 0 rootHistoryId: this.replyingTo || ""
}; };
const response = await post( const response = await post(
@ -281,6 +309,12 @@
// //
handleReply(commentId) { handleReply(commentId) {
//
if (!this.checkLogin()) {
this.goToLogin();
return;
}
this.replyingTo = commentId; this.replyingTo = commentId;
this.$nextTick(() => { this.$nextTick(() => {
uni.createSelectorQuery().select('.comment-input') uni.createSelectorQuery().select('.comment-input')
@ -322,33 +356,35 @@
$border-color: #e2e8f0; // $border-color: #e2e8f0; //
$bg-color: #f7fafc; // $bg-color: #f7fafc; //
$comment-bg: #ffffff; // $comment-bg: #ffffff; //
$shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.05); // $shadow-sm: 0 1rpx 3rpx rgba(0, 0, 0, 0.05); //
$shadow-md: 0 4px 6px rgba(0, 0, 0, 0.08); // $shadow-md: 0 4rpx 6rpx rgba(0, 0, 0, 0.08); //
$radius-lg: 12px; // $radius-lg: 24rpx; //
$radius-md: 8px; // $radius-md: 16rpx; //
$radius-sm: 4px; // $radius-sm: 8rpx; //
$transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); // $transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); //
.content { .content {
padding: 16px; padding: 32rpx;
background-color: $bg-color; background-color: $bg-color;
/* 增加底部内边距,确保内容不被输入框遮挡 */
padding-bottom: 240rpx;
min-height: 100vh; min-height: 100vh;
padding-bottom: 120px; box-sizing: border-box;
} }
/* 主帖样式优化 */ /* 主帖样式优化 */
.post-container { .post-container {
background-color: white; background-color: white;
border-radius: $radius-lg; border-radius: $radius-lg;
padding: 24px; padding: 48rpx;
margin-bottom: 20px; margin-bottom: 40rpx;
box-shadow: $shadow-sm; box-shadow: $shadow-sm;
transition: $transition; transition: $transition;
border: 1px solid $border-color; border: 1rpx solid $border-color;
&:hover { &:hover {
box-shadow: $shadow-md; box-shadow: $shadow-md;
transform: translateY(-1px); transform: translateY(-1rpx);
} }
&:active { &:active {
@ -359,15 +395,15 @@
.post-header { .post-header {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px; margin-bottom: 40rpx;
} }
.avatar { .avatar {
width: 48px; width: 96rpx;
height: 48px; height: 96rpx;
border-radius: 50%; border-radius: 50%;
margin-right: 16px; margin-right: 32rpx;
border: 2px solid white; border: 2rpx solid white;
box-shadow: $shadow-sm; box-shadow: $shadow-sm;
background-color: #f5f5f5; background-color: #f5f5f5;
transition: $transition; transition: $transition;
@ -384,34 +420,34 @@
} }
.username { .username {
font-size: 16px; font-size: 32rpx;
font-weight: 600; font-weight: 600;
color: $text-color; color: $text-color;
line-height: 1.5; line-height: 1.5;
} }
.time { .time {
font-size: 13px; font-size: 26rpx;
color: $light-text; color: $light-text;
line-height: 1.5; line-height: 1.5;
} }
.post-content { .post-content {
.title { .title {
font-size: 18px; font-size: 36rpx;
font-weight: 600; font-weight: 600;
color: #1a1a1a; color: #1a1a1a;
margin-bottom: 16px; margin-bottom: 32rpx;
display: block; display: block;
line-height: 1.6; line-height: 1.6;
letter-spacing: -0.01em; letter-spacing: -0.01em;
} }
.content-text { .content-text {
font-size: 15px; font-size: 30rpx;
color: $text-color; color: $text-color;
line-height: 1.7; line-height: 1.7;
margin-bottom: 20px; margin-bottom: 40rpx;
display: block; display: block;
word-break: break-word; word-break: break-word;
} }
@ -420,8 +456,8 @@
.images { .images {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 12px; gap: 24rpx;
margin-top: 16px; margin-top: 32rpx;
} }
.post-image { .post-image {
@ -443,17 +479,17 @@
&.single-img { &.single-img {
width: 100%; width: 100%;
height: 300px; height: 600rpx;
} }
&.double-img { &.double-img {
width: calc(50% - 6px); width: calc(50% - 12rpx);
height: 180px; height: 360rpx;
} }
&.multi-img { &.multi-img {
width: calc(33.33% - 8px); width: calc(33.33% - 16rpx);
height: 120px; height: 240rpx;
} }
} }
@ -461,27 +497,27 @@
.comments-container { .comments-container {
background-color: white; background-color: white;
border-radius: $radius-lg; border-radius: $radius-lg;
padding: 0 20px; padding: 0 40rpx;
margin-bottom: 16px; margin-bottom: 32rpx;
box-shadow: $shadow-sm; box-shadow: $shadow-sm;
border: 1px solid $border-color; border: 1rpx solid $border-color;
} }
.comments-title { .comments-title {
font-size: 16px; font-size: 32rpx;
font-weight: 600; font-weight: 600;
color: $text-color; color: $text-color;
padding: 20px 0; padding: 40rpx 0;
border-bottom: 1px solid $border-color; border-bottom: 1rpx solid $border-color;
position: relative; position: relative;
&::after { &::after {
content: ""; content: "";
position: absolute; position: absolute;
left: 0; left: 0;
bottom: -1px; bottom: -1rpx;
width: 40px; width: 80rpx;
height: 2px; height: 4rpx;
background-color: $primary-color; background-color: $primary-color;
} }
} }
@ -493,26 +529,27 @@
.comment-item { .comment-item {
position: relative; position: relative;
padding: 20px 0; padding: 20rpx 0;
border-bottom: 1px solid $border-color;
transition: $transition; transition: $transition;
margin-bottom: 8rpx;
&:hover { &:not(:last-child) {
background-color: rgba($primary-light, 0.3); border-bottom: 1rpx solid rgba($border-color, 0.5);
} }
&:last-child { &:hover {
border-bottom: none; background-color: rgba($primary-light, 0.2);
border-radius: $radius-md;
} }
} }
.comment-level-indicator { .comment-level-indicator {
position: absolute; position: absolute;
top: 50px; top: 70rpx;
width: 2px; width: 4rpx;
background-color: #e5e5e5; background-color: rgba($border-color, 0.5);
left: calc(30px + var(--indent) - 20px); left: calc(60rpx + var(--indent) - 40rpx);
height: calc(100% - 50px); height: calc(100% - 70rpx);
} }
.comment-content-wrapper { .comment-content-wrapper {
@ -522,13 +559,13 @@
} }
.comment-avatar { .comment-avatar {
width: 36px; width: 64rpx;
height: 36px; height: 64rpx;
border-radius: 50%; border-radius: 50%;
margin-right: 12px; margin-right: 24rpx;
flex-shrink: 0; flex-shrink: 0;
background-color: #f5f5f5; background-color: #f5f5f5;
border: 1px solid $border-color; border: 1rpx solid $border-color;
transition: $transition; transition: $transition;
&:hover { &:hover {
@ -538,50 +575,52 @@
.comment-main { .comment-main {
flex: 1; flex: 1;
padding-top: 0;
} }
.comment-meta { .comment-meta {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 8px; margin-bottom: 8rpx;
} }
.comment-username { .comment-username {
font-size: 14px; font-size: 28rpx;
color: $text-color; color: $text-color;
font-weight: 500; font-weight: 500;
} }
.comment-time { .comment-time {
font-size: 12px; font-size: 24rpx;
color: $light-text; color: $light-text;
} }
.comment-text { .comment-text {
font-size: 14px; font-size: 28rpx;
color: $text-color; color: $text-color;
line-height: 1.6; line-height: 1.6;
margin-bottom: 12px; margin-bottom: 12rpx;
padding: 4px 0; padding: 8rpx 0;
word-break: break-word; word-break: break-word;
} }
.comment-actions { .comment-actions {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 16px; gap: 32rpx;
padding: 4px 0; padding: 4rpx 0;
} }
.reply-btn, .reply-btn,
.fold-btn { .fold-btn {
font-size: 13px; font-size: 24rpx;
color: $primary-color; color: $primary-color;
padding: 4px 8px; padding: 6rpx 12rpx;
border-radius: $radius-sm; border-radius: $radius-sm;
transition: $transition; transition: $transition;
cursor: pointer; cursor: pointer;
background-color: rgba($primary-color, 0.05);
&:hover { &:hover {
background-color: rgba($primary-color, 0.1); background-color: rgba($primary-color, 0.1);
@ -594,6 +633,11 @@
.fold-btn { .fold-btn {
color: $light-text; color: $light-text;
background-color: rgba($light-text, 0.05);
&:hover {
background-color: rgba($light-text, 0.1);
}
} }
/* 评论输入框样式优化 */ /* 评论输入框样式优化 */
@ -603,9 +647,9 @@
left: 0; left: 0;
right: 0; right: 0;
background-color: white; background-color: white;
padding: 16px; padding: 24rpx 32rpx;
border-top: 1px solid $border-color; border-top: 1rpx solid $border-color;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.08); box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.08);
z-index: 100; z-index: 100;
} }
@ -613,11 +657,11 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: 8px 12px; padding: 16rpx 24rpx;
background-color: $primary-light; background-color: $primary-light;
border-radius: $radius-md; border-radius: $radius-md;
margin-bottom: 12px; margin-bottom: 16rpx;
font-size: 13px; font-size: 26rpx;
} }
.replying-text { .replying-text {
@ -627,29 +671,30 @@
.cancel-reply { .cancel-reply {
color: $primary-color; color: $primary-color;
padding: 4px 8px; padding: 8rpx 16rpx;
border-radius: $radius-sm; border-radius: $radius-sm;
cursor: pointer; cursor: pointer;
transition: $transition; transition: $transition;
background-color: rgba($primary-color, 0.1);
&:hover { &:hover {
background-color: rgba($primary-color, 0.1); background-color: rgba($primary-color, 0.2);
} }
} }
.input-wrapper { .input-wrapper {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 12px; gap: 16rpx;
} }
.comment-input { .comment-input {
flex: 1; flex: 1;
height: 48px; height: 88rpx;
padding: 0 16px; padding: 0 32rpx;
font-size: 14px; font-size: 28rpx;
border: 1px solid $border-color; border: 1rpx solid $border-color;
border-radius: 24px; border-radius: 48rpx;
background-color: #f5f5f5; background-color: #f5f5f5;
transition: $transition; transition: $transition;
outline: none; outline: none;
@ -657,7 +702,7 @@
&:focus { &:focus {
border-color: $primary-color; border-color: $primary-color;
background-color: #fff; background-color: #fff;
box-shadow: 0 0 0 2px rgba($primary-color, 0.1); box-shadow: 0 0 0 4rpx rgba($primary-color, 0.1);
} }
&::placeholder { &::placeholder {
@ -666,20 +711,20 @@
} }
.send-btn { .send-btn {
min-width: 80px; min-width: 140rpx;
height: 48px; height: 88rpx;
background-color: $primary-color; background-color: $primary-color;
color: white; color: white;
border: none; border: none;
border-radius: 24px; border-radius: 48rpx;
font-size: 14px; font-size: 28rpx;
font-weight: 500; font-weight: 500;
transition: $transition; transition: $transition;
cursor: pointer; cursor: pointer;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 0 16px; padding: 0 32rpx;
&:hover { &:hover {
background-color: darken($primary-color, 5%); background-color: darken($primary-color, 5%);
@ -704,9 +749,9 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 16px 0; padding: 32rpx 0;
color: $light-text; color: $light-text;
font-size: 14px; font-size: 28rpx;
cursor: pointer; cursor: pointer;
transition: $transition; transition: $transition;
@ -715,13 +760,13 @@
} }
text { text {
margin-right: 8px; margin-right: 16rpx;
} }
} }
/* 添加一些动画效果 */ /* 添加一些动画效果 */
@keyframes fadeIn { @keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); } from { opacity: 0; transform: translateY(20rpx); }
to { opacity: 1; transform: translateY(0); } to { opacity: 1; transform: translateY(0); }
} }
@ -732,15 +777,30 @@
/* 响应式调整 */ /* 响应式调整 */
@media (max-width: 480px) { @media (max-width: 480px) {
.content { .content {
padding: 12px; padding: 24rpx;
padding-bottom: 220rpx;
} }
.post-container { .post-container {
padding: 16px; padding: 32rpx;
} }
.comment-input-container { .comment-input-container {
padding: 12px; padding: 24rpx;
}
.comment-item {
padding: 16rpx 0;
margin-bottom: 8rpx;
}
.comment-avatar {
width: 56rpx;
height: 56rpx;
}
.comment-text {
font-size: 26rpx;
} }
} }
</style> </style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB