2025-11-08 11:21:57 +08:00
< template >
< view class = "page" >
< u -navbar title = "攻略详情" :border-bottom ="false" :background ="bgc" back -icon -color = " # 262B37 " title -color = ' # 262B37 '
title - size = '36' height = '40' id = "navbar" >
< / u - n a v b a r >
2025-12-20 14:32:28 +08:00
< view class = "" v-if ="dongtaiflag == false" >
<!-- 顶部大图 -- >
< view class = "hero" >
< image class = "hero-img" :src ="globj.photo" mode = "aspectFill" style = "width: 100%; height: 420rpx;" > < / image >
< image class = "sc" @click ="btnscqx" v-if ="globj.isCollected == true" src="https://api.ccttiot.com/smartmeter/img/static/uREVO9VLwercFEWbnurd" mode="" > < / image >
< image class = "sc" @click ="btnscqd" v -else src = "https://api.ccttiot.com/smartmeter/img/static/ukfmNwl4GOF4v090KRqy" mode = "" > < / image >
< / view >
<!-- 基本信息 -- >
< view class = "base-info" >
< view class = "title-row" >
< view class = "left" >
< view class = "name" > { { globj . areaName } } < / view >
< view class = "meta" > { { globj . areaAddress == null ? '--' : globj . areaAddress } } < / view >
< / view >
< view class = "actions" >
< image @click ="btntel" src = "https://api.ccttiot.com/smartmeter/img/static/uFSDCjc5wPk8Wq9XSyr4" style = "width: 40rpx;height: 40rpx;" mode = "" > < / image >
< image @click ="btndh" src = "https://api.ccttiot.com/smartmeter/img/static/uFDC6JRPVkfL2PYrRlz0" style = "width: 54rpx;height: 52rpx;" mode = "" > < / image >
< / view >
2025-11-08 11:21:57 +08:00
< / view >
< / view >
2025-12-20 14:32:28 +08:00
<!-- 小节 : 景区简介 -- >
< view class = "section-block" @click ="btnjieshao" >
< view class = "section-hd" > < text class = "dot" > < / text > < text class = "txt" > 景区简介 < / text > < text class = "more" > 更多介绍 < / text > < image style = "width: 32rpx;height: 32rpx;" src = "https://api.ccttiot.com/smartmeter/img/static/uiUIIoq5dM91HwG6ifIS" mode = "" > < / image > < / view >
< view class = "para" >
{ { globj . description } }
< / view >
2025-11-08 11:21:57 +08:00
< / view >
2025-12-20 14:32:28 +08:00
<!-- 小节 : 核心景点 -- >
< view class = "section-block" style = "padding-bottom: 0;" v-if ="globj.coreSpots && globj.coreSpots.length > 0" >
< view class = "section-hd" > < text class = "dot" > < / text > < text class = "txt" > 核心景点 < / text > < / view >
< view class = "thumbs" >
< view class = "thumb-item" v-for ="(item,index) in globj.coreSpots" >
< image :src ="item.picture" mode = "aspectFill" class = "thumb-img" style = "width: 204rpx; height: 204rpx;" > < / image >
< view class = "thumb-name" > { { item . name } } < / view >
< / view >
2025-11-08 11:21:57 +08:00
< / view >
< / view >
2025-12-20 14:32:28 +08:00
<!-- 小节 : 行程概览 -- >
< view class = "section-block" >
< view class = "section-hd" > < text class = "dot" > < / text > < text class = "txt" > 行程概览 < / text > < / view >
< view class = "facts list" >
< view class = "fact" > < image src = "https://api.ccttiot.com/smartmeter/img/static/unOeWhbxfVsgh2jXJ0si" mode = "" > < / image > < text class = "f-t" > 行程天数 : { { globj . days } } 天 < / text > < / view >
< view class = "fact" > < image src = "https://api.ccttiot.com/smartmeter/img/static/uEz1yLuz7ID5iHVqGnfe" mode = "" > < / image > < text class = "f-t" > 游玩景点 : { { globj . spotNum == null ? 0 : globj . spotNum } } 个 | < text style = "margin-right: 6rpx;" v-for ="(item,index) in globj.spotNames" :key ="index" > {{ item }} < / text > < / text > < / view >
< / view >
2025-11-08 11:21:57 +08:00
< / view >
2025-12-20 14:32:28 +08:00
<!-- Day tabs ( 绿色下划线 ) -- >
<!-- < view class = "day-tabs underline g" >
< view class = "tab active" > 第1天 < / view >
< view class = "tab" > 第2天 < / view >
< / view > -- >
<!-- 行程推荐 ( 黑灰系时间轴 ) -- >
< view class = "section-block" >
< view class = "timeline4" >
< view class = "row" v-for ="(day, dIndex) in itinerary" :key ="dIndex" >
< view class = "left" >
< view class = "n" > { { ( dIndex + 1 ) . toString ( ) . padStart ( 2 , '0' ) } } < / view >
< view class = "d" > Day < / view >
< view class = "vl" > < / view >
< / view >
< view class = "right" >
< view class = "poi-card4" v-for ="(poi, pIndex) in day.items" :key ="pIndex" >
< view class = "poi-hd" > < text class = "sq" > < / text > < text class = "t" > { { poi . title } } < / text > < / view >
< view class = "poi-desc" > { { poi . desc } } < / view >
< view class = "grid-3" >
< image v -for = " ( img , iidx ) in poi.photos " :key ="iidx" :src ="img" mode = "aspectFill" class = "gimg" style = "width: 200rpx; height: 200rpx;" @ click = "previewImage(img, poi.photos)" / >
< / view >
2025-11-08 11:21:57 +08:00
< / view >
< / view >
< / view >
< / view >
< / view >
< / view >
2025-12-20 14:32:28 +08:00
< image v -else style = "width: 100%;height: 100vh;position: fixed;top: 160rpx;left: 0;z-index: 999;" src = "https://api.ccttiot.com/mgV9maxWGSQb6aa145cf863980513eecdf75080f75a0.png" mode = "" > < / image >
2025-11-08 11:21:57 +08:00
< / view >
< / template >
< script >
export default {
data ( ) {
return {
bgc : {
backgroundColor : "#fff" ,
} ,
itinerary : [
{
items : [ ]
} , {
items : [ ]
} ,
] ,
id : '' ,
globj : { } ,
strategyDetails : [ ] ,
// 按天数分组的数据对象
2025-12-20 14:32:28 +08:00
groupedStrategyDetails : { } ,
dongtaiflag : false
2025-11-08 11:21:57 +08:00
}
} ,
onLoad ( option ) {
this . id = option . id
this . getxq ( )
} ,
methods : {
2025-12-20 14:32:28 +08:00
// 点击进行收藏
btnscqd ( ) {
let data = {
bstType : 1 ,
bstId : this . id
}
this . $u . post ( ` /app/favorite/add ` , data ) . then ( res => {
if ( res . code == 200 ) {
uni . showToast ( {
title : '收藏成功' ,
icon : 'success' ,
duration : 3000
} )
this . globj . isCollected = true
} else {
uni . showToast ( {
title : res . msg ,
icon : 'none' ,
duration : 3000
} )
}
} )
} ,
// 点击进行取消收藏
btnscqx ( ) {
this . $u . delete ( ` /app/favorite/cancel/ ${ this . id } ?bstType=1 ` ) . then ( res => {
if ( res . code == 200 ) {
uni . showToast ( {
title : '取消收藏成功' ,
icon : 'success' ,
duration : 3000
} )
this . globj . isCollected = false
} else {
uni . showToast ( {
title : res . msg ,
icon : 'none' ,
duration : 3000
} )
}
} )
} ,
2025-11-08 11:21:57 +08:00
// 点击更多介绍进行跳转
btnjieshao ( ) {
uni . navigateTo ( {
url : '/page_fenbao/remenxq?id=' + this . globj . areaId
} )
} ,
// 点击拨打电话
btntel ( ) {
uni . makePhoneCall ( {
phoneNumber : this . globj . areaPhone ,
success : function ( res ) {
console . log ( '拨打电话成功' , res )
} ,
fail : function ( err ) {
console . error ( '拨打电话失败' , err )
}
} )
} ,
// 点击进行导航
btndh ( ) {
// 检查坐标数据是否存在
if ( ! this . globj . areaLat || ! this . globj . areaLon ) {
uni . showToast ( {
title : '坐标数据不完整' ,
icon : 'none' ,
duration : 3000
} )
return
}
// 先申请位置权限
uni . getSetting ( {
success : ( res ) => {
if ( res . authSetting [ 'scope.userLocation' ] === false ) {
// 用户拒绝了位置权限,引导用户开启
uni . showModal ( {
title : '位置权限' ,
content : '需要获取您的位置信息才能进行导航,请在设置中开启位置权限' ,
confirmText : '去设置' ,
success : ( modalRes ) => {
if ( modalRes . confirm ) {
uni . openSetting ( )
}
}
} )
return
}
// 权限正常,打开地图
this . openMap ( )
}
} )
} ,
// 打开地图
openMap ( ) {
uni . openLocation ( {
latitude : parseFloat ( this . globj . areaLat ) , // 确保是数字类型
longitude : parseFloat ( this . globj . areaLon ) , // 确保是数字类型
name : this . globj . areaName || '目的地' , // 地点名称
success : function ( res ) {
console . log ( '打开地图成功' , res ) ;
} ,
fail : function ( err ) {
console . error ( '打开地图失败' , err ) ;
uni . showToast ( {
title : '打开地图失败: ' + ( err . errMsg || '未知错误' ) ,
icon : 'none' ,
duration : 3000
} )
}
} )
} ,
// 请求攻略详情
getxq ( ) {
this . $u . get ( ` /app/strategy/detail/ ${ this . id } ?assembleDetail=true ` ) . then ( ( res ) => {
if ( res . code == 200 ) {
this . globj = res . data
2025-12-20 14:32:28 +08:00
this . dongtaiflag = false
2025-11-08 11:21:57 +08:00
// 按dayNumber分组strategyDetails
this . groupedStrategyDetails = this . groupStrategyDetailsByDay ( res . data . strategyDetails )
// 更新itinerary数据, 使用分组后的数据
this . updateItinerary ( this . groupedStrategyDetails )
2025-12-20 14:32:28 +08:00
} else if ( res . msg == '攻略不存在' ) {
this . dongtaiflag = true
2025-11-08 11:21:57 +08:00
}
} )
} ,
// 按天数分组策略详情数据
groupStrategyDetailsByDay ( strategyDetails ) {
const grouped = { }
strategyDetails . forEach ( item => {
const dayNumber = item . dayNumber
if ( ! grouped [ dayNumber ] ) {
grouped [ dayNumber ] = [ ]
}
grouped [ dayNumber ] . push ( item )
} )
// 按天数排序
const sortedGrouped = { }
Object . keys ( grouped ) . sort ( ( a , b ) => parseInt ( a ) - parseInt ( b ) ) . forEach ( dayNumber => {
sortedGrouped [ dayNumber ] = grouped [ dayNumber ]
} )
return sortedGrouped
} ,
// 获取指定天数的数据
getDayData ( dayNumber ) {
return this . groupedStrategyDetails [ dayNumber ] || [ ]
} ,
// 获取所有天数
getAllDays ( ) {
return Object . keys ( this . groupedStrategyDetails ) . map ( day => parseInt ( day ) ) . sort ( ( a , b ) => a - b )
} ,
// 更新itinerary数据
updateItinerary ( groupedDetails ) {
this . itinerary = Object . keys ( groupedDetails ) . map ( dayNumber => {
return {
dayNumber : parseInt ( dayNumber ) ,
items : groupedDetails [ dayNumber ] . map ( item => ( {
title : item . name || '景点' ,
desc : item . description || '暂无描述' ,
photos : item . photo ? item . photo . split ( ',' ) . map ( url => url . trim ( ) ) : [ ]
} ) )
}
} ) . sort ( ( a , b ) => a . dayNumber - b . dayNumber )
} ,
// 预览图片
previewImage ( current , urls ) {
uni . previewImage ( {
current : current , // 当前显示图片的http链接
urls : urls , // 需要预览的图片http链接列表
success : function ( res ) {
console . log ( '预览图片成功' )
} ,
fail : function ( err ) {
console . log ( '预览图片失败' , err )
}
} )
} ,
}
}
< / script >
< style lang = "scss" >
page { background : # fff ; }
. page { background : # fff ; min - height : 100 vh ; }
/* 顶部大图 */
2025-12-20 14:32:28 +08:00
. hero { width : 100 % ; height : 420 rpx ; overflow : hidden ;
position : relative ;
. sc {
width : 60 rpx ;
height : 60 rpx ;
position : absolute ;
top : 30 rpx ;
right : 30 rpx ;
} }
2025-11-08 11:21:57 +08:00
. hero - img { width : 100 % ; height : 100 % ; }
/* 基本信息 */
. base - info {
padding : 30 rpx ;
. title - row {
display : flex ; align - items : center ; justify - content : space - between ;
. left {
. name { font - size : 52 rpx ; font - weight : 700 ; color : # 262 B37 ; }
. meta { margin - top : 8 rpx ; font - size : 28 rpx ; color : # 3 D3D3D ; }
}
. actions { display : flex ; gap : 30 rpx ; align - items : center ; }
. act { padding : 8 rpx 16 rpx ; border : 1 rpx solid # e6e6e6 ; border - radius : 28 rpx ; font - size : 28 rpx ; color : # 333 ; }
}
. tags {
margin - top : 20 rpx ; display : flex ; gap : 16 rpx ; flex - wrap : wrap ;
. tag { padding : 8 rpx 18 rpx ; background : # f6f7f9 ; color : # 555 ; font - size : 26 rpx ; border - radius : 28 rpx ; }
}
. gallery { margin - top : 20 rpx ; white - space : nowrap ; height : 140 rpx ;
. g - img { width : 200 rpx ; height : 140 rpx ; border - radius : 12 rpx ; margin - right : 16 rpx ; }
}
}
/* 区块标题 */
. section { padding : 10 rpx 30 rpx 40 rpx ; }
. sec - title { font - size : 32 rpx ; font - weight : 700 ; color : # 262 B37 ; padding : 20 rpx 0 ; }
/* 简介 */
. intro . intro - text { font - size : 26 rpx ; color : # 555 ; line - height : 1.8 ; background : # f8f9fb ; padding : 28 rpx ; border - radius : 16 rpx ; }
/* 精选景点 */
. picks . picks - scroll { white - space : nowrap ; }
. pick - item { display : inline - flex ; flex - direction : column ; margin - right : 20 rpx ; }
. pick - img { border - radius : 12 rpx ; }
. pick - name { margin - top : 10 rpx ; font - size : 26 rpx ; color : # 666 ; text - align : center ; }
/* 行程概览 */
. overview . overview - grid { display : grid ; grid - template - columns : repeat ( 2 , 1 fr ) ; gap : 16 rpx ; }
. ov - item { background : # f6f7f9 ; border - radius : 12 rpx ; padding : 18 rpx ; }
. ov - k { font - size : 26 rpx ; color : # 7 a7f8a ; }
. ov - v { margin - top : 6 rpx ; font - size : 28 rpx ; color : # 262 B37 ; font - weight : 600 ; }
/* Day tabs */
. day - tabs { display : flex ; gap : 20 rpx ; padding - top : 0 ; }
. day - tabs . tab { padding : 10 rpx 26 rpx ; border - radius : 999 rpx ; background : # f2fbf6 ; color : # 20 b26b ; font - size : 28 rpx ; }
. day - tabs . tab . active { background : # 20 b26b ; color : # fff ; }
/* 时间轴 */
. timeline { position : relative ; }
. day - block { position : relative ; padding - left : 90 rpx ; }
. day - block : before { content : '' ; position : absolute ; left : 40 rpx ; top : 0 ; bottom : 0 ; width : 2 rpx ; background : # e0f3e9 ; }
. day - head { display : flex ; align - items : center ; margin : 10 rpx 0 20 rpx ; }
. day - num { width : 64 rpx ; height : 64 rpx ; border - radius : 8 rpx ; background : # 20 b26b ; color : # fff ; display : flex ; flex - direction : column ; align - items : center ; justify - content : center ; position : absolute ; left : 8 rpx ; box - shadow : 0 4 rpx 12 rpx rgba ( 32 , 178 , 107 , 0.3 ) ; }
. day - num . big { font - size : 26 rpx ; line - height : 26 rpx ; }
. day - num . small { font - size : 18 rpx ; opacity : 0.9 ; }
. day - text { margin - left : 10 rpx ; }
. d - title { font - size : 30 rpx ; font - weight : 600 ; color : # 262 B37 ; }
. d - sub { font - size : 28 rpx ; color : # 7 a7f8a ; margin - top : 6 rpx ; }
. day - list { display : flex ; flex - direction : column ; gap : 26 rpx ; margin - bottom : 36 rpx ; }
. poi { display : flex ; gap : 16 rpx ; position : relative ; }
. poi - icon { position : absolute ; left : 18 rpx ; top : 18 rpx ; font - size : 26 rpx ; color : # 20 b26b ; }
. poi - card { flex : 1 ; background : # fff ; border - radius : 16 rpx ; padding : 20 rpx ; box - shadow : 0 4 rpx 16 rpx rgba ( 0 , 0 , 0 , 0.06 ) ; }
. poi - title { font - size : 28 rpx ; font - weight : 600 ; color : # 262 B37 ; }
. poi - desc { margin - top : 8 rpx ; font - size : 28 rpx ; color : # 666 ; line - height : 1.6 ; }
. poi - photos { margin - top : 12 rpx ; display : grid ; grid - template - columns : repeat ( 3 , 1 fr ) ; gap : 12 rpx ; }
. pimg { width : 100 % ; height : 160 rpx ; border - radius : 10 rpx ; }
/* 信息卡 */
. info - card { padding : 18 rpx 26 rpx ; background : # fff ; border - radius : 16 rpx ; margin : - 40 rpx 20 rpx 6 rpx ; box - shadow : 0 6 rpx 18 rpx rgba ( 0 , 0 , 0 , 0.06 ) ; border : 2 rpx solid # eef0f3 ; }
. info - card . float { position : relative ; z - index : 2 ; }
. title - wrap { display : flex ; justify - content : space - between ; align - items : center ; }
. title - left . cn { font - size : 32 rpx ; font - weight : 800 ; color : # 1 f2a37 ; }
. title - left . en { margin - top : 6 rpx ; font - size : 20 rpx ; color : # 9 aa4b2 ; letter - spacing : 2 rpx ; }
. title - left . sub { margin - top : 8 rpx ; font - size : 26 rpx ; color : # 8 a949e ; }
. title - right { display : flex ; gap : 12 rpx ; }
. ic { width : 48 rpx ; height : 48 rpx ; border - radius : 10 rpx ; background : # f3f4f6 ; border : 2 rpx solid # eef0f3 ; display : flex ; align - items : center ; justify - content : center ; color : # 374151 ; }
/* 小节标题 */
. section - block { padding : 10 rpx 20 rpx 20 rpx ; }
. section - hd { display : flex ; align - items : center ; gap : 12 rpx ; margin : 18 rpx 2 rpx ; }
. section - hd . dot { width : 8 rpx ; height : 28 rpx ; background : # 111827 ; border - radius : 4 rpx ; }
. section - hd . txt { font - size : 36 rpx ; font - weight : 800 ; color : # 111827 ; }
. section - hd . more { margin - left : auto ; font - size : 26 rpx ; color : # 3 D3D3D ; }
. para { font - size : 28 rpx ; color : # 4 b5563 ; line - height : 1.8 ; }
/* 精选景点 */
. thumbs { display : flex ; gap : 16 rpx ; overflow : scroll ; padding - bottom : 20 rpx ; }
. thumb - item { width : 210 rpx ; }
. thumb - img { border - radius : 12 rpx ; border : 2 rpx solid # eef0f3 ; }
. thumb - name { margin - top : 8 rpx ; text - align : center ; color : # 6 b7280 ; font - size : 26 rpx ; }
/* 行程概览 */
. kv - row { display : flex ; align - items : center ; background : # f1f6ff ; border - radius : 12 rpx ; padding : 16 rpx ; margin - bottom : 10 rpx ; border : 2 rpx solid # cfe0ff ; }
. kv { flex : 1 ; display : flex ; justify - content : space - between ; align - items : baseline ; }
. k { font - size : 26 rpx ; color : # 6 f7c96 ; }
. v { font - size : 26 rpx ; color : # 24324 a ; font - weight : 700 ; }
. divider { width : 1 rpx ; height : 28 rpx ; background : # ccd9f5 ; margin : 0 16 rpx ; }
. facts { margin - top : 10 rpx ; display : grid ; grid - template - columns : 1 fr ; gap : 10 rpx ; }
. fact { display : flex ; align - items : center ; gap : 10 rpx ; color : # 405072 ; font - size : 28 rpx ; }
. fact image { width : 28 rpx ; height : 28 rpx ; }
. f - ic { color : # 3 a6fd9 ; }
/* Day tabs 下划线风格 */
. day - tabs . underline { display : flex ; gap : 40 rpx ; padding : 4 rpx 26 rpx 8 rpx ; }
. day - tabs . underline . tab { font - size : 26 rpx ; color : # 6 f7c96 ; padding - bottom : 10 rpx ; }
. day - tabs . underline . tab . active { color : # 24324 a ; font - weight : 700 ; border - bottom : 4 rpx solid # 3 a6fd9 ; }
/* 新版时间轴(蓝色) */
. timeline3 { padding - top : 8 rpx ; }
. timeline3 . row { display : flex ; }
. timeline3 . left { width : 120 rpx ; align - items : center ; display : flex ; flex - direction : column ; }
. timeline3 . n { font - size : 40 rpx ; font - weight : 800 ; color : # 3 a6fd9 ; }
. timeline3 . d { font - size : 20 rpx ; color : # 3 a6fd9 ; margin - top : - 6 rpx ; }
. timeline3 . vl { width : 2 rpx ; flex : 1 ; background : # d7e6ff ; margin - top : 12 rpx ; }
. timeline3 . right { flex : 1 ; padding - bottom : 26 rpx ; }
. rt - title { font - size : 28 rpx ; font - weight : 800 ; color : # 24324 a ; }
. rt - sub { font - size : 28 rpx ; color : # 6 f7c96 ; margin - top : 6 rpx ; }
. poi - card3 { margin - top : 18 rpx ; background : # fff ; border - radius : 12 rpx ; padding : 18 rpx ; box - shadow : 0 4 rpx 14 rpx rgba ( 0 , 0 , 0 , 0.06 ) ; border : 2 rpx solid # e6efff ; }
. poi - hd { display : flex ; align - items : center ; gap : 10 rpx ; }
. poi - hd . sq { width : 16 rpx ; height : 16 rpx ; background : # 3 a6fd9 ; border - radius : 4 rpx ; }
. poi - hd . t { font - size : 32 rpx ; font - weight : 700 ; color : # 24324 a ; }
. poi - desc { margin - top : 6 rpx ; font - size : 28 rpx ; color : # 56617 a ; line - height : 1.8 ; }
. grid - 3 { margin - top : 12 rpx ; display : grid ; grid - template - columns : repeat ( 3 , 1 fr ) ; gap : 10 rpx ; }
. gimg { border - radius : 10 rpx ; border : 2 rpx solid # e6efff ; }
/* 行程概览:四行列表 */
. list { display : flex ; flex - direction : column ; gap : 14 rpx ; }
. fact { display : flex ; align - items : center ; gap : 12 rpx ; font - size : 28 rpx ; color : # 4 b5563 ; }
. f - ic { color : # 10 b981 ; }
. f - btn { margin - left : auto ; font - size : 26 rpx ; color : # 10 b981 ; }
/* Day tabs 绿色下划线 */
. day - tabs . underline . g { display : flex ; gap : 40 rpx ; padding : 6 rpx 20 rpx 8 rpx ; }
. day - tabs . underline . g . tab { font - size : 26 rpx ; color : # 6 b7280 ; padding - bottom : 10 rpx ; }
. day - tabs . underline . g . tab . active { color : # 111827 ; font - weight : 700 ; border - bottom : 4 rpx solid # 10 b981 ; }
/* 时间轴(黑灰) */
. timeline4 { padding - top : 6 rpx ; }
. timeline4 . row { display : flex ; }
. timeline4 . left { width : 66 rpx ; align - items : center ; display : flex ; flex - direction : column ; }
. timeline4 . n { font - size : 40 rpx ; font - weight : 800 ; color : # 111827 ; }
. timeline4 . d { font - size : 20 rpx ; color : # 6 b7280 ; margin - top : - 6 rpx ; }
. timeline4 . vl { width : 2 rpx ; flex : 1 ; background : # e5e7eb ; margin - top : 12 rpx ; }
. timeline4 . right { flex : 1 ; padding - bottom : 26 rpx ; padding - left : 6 rpx ; }
. rt - title { font - size : 28 rpx ; font - weight : 800 ; color : # 111827 ; }
. rt - sub { font - size : 28 rpx ; color : # 6 b7280 ; margin - top : 6 rpx ; }
. poi - card4 { margin - top : 18 rpx ; background : # fff ; border - radius : 12 rpx ; padding : 18 rpx ; box - shadow : 0 4 rpx 14 rpx rgba ( 0 , 0 , 0 , 0.06 ) ; border : 2 rpx solid # f3f4f6 ; }
. poi - hd { display : flex ; align - items : center ; gap : 10 rpx ; }
. poi - hd . sq { width : 16 rpx ; height : 16 rpx ; background : # 10 b981 ; border - radius : 4 rpx ; }
. poi - hd . t { font - size : 32 rpx ; font - weight : 700 ; color : # 111827 ; }
. poi - desc { margin - top : 6 rpx ; font - size : 28 rpx ; color : # 4 b5563 ; line - height : 1.8 ; }
. grid - 3 { margin - top : 12 rpx ; display : grid ; grid - template - columns : repeat ( 3 , 1 fr ) ; gap : 10 rpx ; }
. gimg { border - radius : 10 rpx ; border : 2 rpx solid # f3f4f6 ; }
< / style >