2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】

news2025/6/10 10:05:31

1、获取景点详情的请求【my_api.js】

// 引入公共的请求封装
import http from './my_http.js'

// 登录接口(适配服务端返回 Token)
export const login = async (code, avatar) => {
		const res = await http('/login/getWXSessionKey', {code,avatar});
};


// 获取bannner列表
export const getBannerList = () => {
	return http('/banner/list')
}

// 获取景点类型列表(支持传入typeId参数)
export const getTypeList = () => {
	return http('/type/list')
}

// 获取景点列表
export const getAttractionList = (typeId) => {
	// 如果有typeId就拼接到URL,没有就不加
	const url = typeId ? `/attraction/list?typeId=${typeId}` : '/attraction/list'
	return http(url)
}
// 获取景点详情
export const getAttractionInfo = (attractionId) => {
	return http(`/attraction/getInfo/${attractionId}`)
}

// 获取收藏列表
export const getFavouriteList = () => {
	// 如果有typeId就拼接到URL,没有就不加
	return http('/favourite/list')
}



2、页面源码【attraction_details.vue】

 <template>
 	<view class="container"><!-- 导航栏 -->
 		<up-navbar class="up-navbar-title" bg-color="#00000000" title="" :auto-back="true" left-icon-color="#fff" />

 		<!-- 景点主图 -->
 		<view class="attraction-box">
 			<image class="attraction-image" :src="attraction.cover" mode="aspectFill"></image>
 			<view class="image-overlay"></view>
 			<view class="attraction-header">
 				<view class="attraction-title">{{ attraction.title }}</view>
 				<view class="attraction-subtitle">{{ attraction.address }}</view>
 			</view>
 		</view>

 		<!-- 景点内容区域 -->
 		<view class="content-box">
 			<!-- 景点简介 -->
 			<view class="section" v-if="attraction.introduction">
 				<view class="section-title">
 					<up-icon name="info-circle" color="#3c9cff" size="18"></up-icon>
 					<text class="title-text">景点简介</text>
 				</view>
 				<view class="section-content">{{ attraction.introduction }}</view>
 			</view>


 			<!-- 开放时间 -->
 			<view class="section" v-if="attraction.inbusinessTime1 || attraction.inbusinessTime2">
 				<view class="section-title">
 					<up-icon name="clock" color="#3c9cff" size="18"></up-icon>
 					<text class="title-text">开放时间</text>
 				</view>
 				<view class="section-content">
 					{{ attraction.inbusinessTime1 ? attraction.inbusinessTime1.slice(0,5) : '未设置' }} -
 					{{ attraction.inbusinessTime2 ? attraction.inbusinessTime2.slice(0,5) : '未设置' }}
 				</view>
 			</view>

 			<!-- 详细描述 -->
 			<view class="section" v-if="attraction.description">
 				<view class="section-title">
 					<up-icon name="map" color="#3c9cff" size="18"></up-icon>
 					<text class="title-text">景点介绍</text>
 				</view>
 				<view class="section-content">{{ attraction.description }}</view>
 			</view>
 		

 			<!-- 联系方式 -->
 			<view class="section" v-if="attraction.tel">
 				<view class="section-title">
 					<up-icon name="phone" color="#3c9cff" size="18"></up-icon>
 					<text class="title-text">联系方式</text>
 				</view>
 				<view class="section-content">{{ attraction.tel }}</view>
 			</view>
 		</view>

 		
 	</view>
 </template>

 <script setup>
 	import {
 		onLoad
 	} from '@dcloudio/uni-app'
 	import {
 		ref,
 		reactive
 	} from 'vue'
 	import {
 		getAttractionInfo
 	} from '../../api/my_api.js'
	
	// 景点对象
 	const attraction = ref({})
	
	//接受传递过来的id
 	onLoad((opt) => {
 		const attractionId = opt.attractionId
		//重新获取景点详情
 		getInfo(attractionId)
 	})
	
	// 景点详情
 	const getInfo = (attractionId) => {
 		getAttractionInfo(attractionId).then(res => {
 			attraction.value = res
 		})
 	}
 </script>


<style lang="scss" scoped>
  .container {
    position: relative;
    min-height: 100vh;
    background-color: #f5f5f5;
    
    // 景点盒子
    .attraction-box {
      position: relative;
      height: 500rpx;
      overflow: hidden;
      
      .attraction-image {
        width: 100%;
        height: 100%;
      }
      
      .image-overlay {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
        height: 200rpx;
        background: linear-gradient(to top, rgba(0,0,0,0.7), transparent);
      }
      
      .attraction-header {
        position: absolute;
        bottom: 40rpx;
        left: 30rpx;
        right: 30rpx;
        color: #fff;
        
        .attraction-title {
          font-size: 42rpx;
          font-weight: bold;
          margin-bottom: 10rpx;
        }
        
        .attraction-subtitle {
          font-size: 28rpx;
          opacity: 0.9;
        }
      }
    }
    
    // 内容区域
    .content-box {
      padding: 30rpx;
      margin-top: 0rpx;
      background-color: #fff;
      border-radius: 30rpx 30rpx 0 0;
      box-shadow: 0 -5rpx 10rpx rgba(0,0,0,0.05);
      
      .section {
        margin-bottom: 40rpx;
        
        .section-title {
          display: flex;
          align-items: center;
          margin-bottom: 20rpx;
          font-size: 32rpx;
          font-weight: bold;
          color: #333;
          
          .title-text {
            margin-left: 10rpx;
          }
        }
        
        .section-content {
          font-size: 28rpx;
          color: #666;
          line-height: 1.6;
          text-align: justify;
        }
      }
    }
    
   
  }
</style>

3、后端返回的数据结构

{
	"id": 2,
	"title": "石家庄动物园",
	"cover": "http://localhost:9001/attraction/8.png",
	"introduction": "与萌宠零距离,开启奇妙动物之旅!",
	"start": null,
	"browse": null,
	"img": null,
	"description": "石家庄动物园位于河北省石家庄市,是一座大型的综合性动物园,旨在饲养、繁殖、研究和保护各种动物,同时为公众提供观赏和教育的机会。动物园内环境优美,设施齐全,旨在为动物提供一个接近自然的生活环境,同时也为游客创造一个舒适、安全的观赏体验。\n园内分为多个区域,包括猛兽区、食草动物区、鸟语林、爬行馆等,每个区域都根据动物的习性进行了精心设计。在这里,游客可以近距离观察到狮子、老虎、大象、长颈鹿、熊猫等众多珍稀动物。此外,动物园还定期举办各种教育活动和互动体验,如动物喂食、科普讲座等,旨在提高公众的生态保护意识。\n石家庄动物园不仅是家庭休闲的好去处,也是学校组织学生进行生物多样性教育的理想场所。通过实地观察和学习,动物园激发人们对自然的兴趣和对动物的同情心,促进社会公众的生态保护意识。\n总之,石家庄动物园以其丰富的动物种类、优美的环境和丰富的教育活动,为游客提供了一个寓教于乐的场所,是石家庄市重要的旅游景点之一。\n",
	"inbusinessTime1": "06:00:00",
	"inbusinessTime2": "18:00:00",
	"address": "河北省石家庄市鹿泉区观景大街与山前大道交叉口西南处",
	"province": null,
	"city": null,
	"area": null,
	"longitude": "114.30 \r\n",
	"latitude": "38.06\r\n",
	"location": null,
	"enableType": "false",
	"typeId": "1",
	"enableAppointment": "false",
	"enablePay": "false",
	"tel": null
}

4、效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?

无论是建筑施工、软件开发&#xff0c;还是市场营销活动&#xff0c;项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素&#xff0c;项目很容易陷入混乱&#xff0c;导致进度延误、成本超支&#xff0c;甚至失败。 项目进度管理软…

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中&#xff0c;左值和右值的概念以及std::move的使用&#xff0c;常常让开发者感到困惑。特别是在函数重载场景下&#xff0c;如何合理利用这些特性来优化代码性能、确保语义正确&#xff0c;更是一个值得深入探讨的话题。 在开始之前&#xff0c;先提出几个问题&…

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟

众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了&#xff0c;延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp &#xff0c;边缘服务器拉流推送到云服务器 …

免费批量Markdown转Word工具

免费批量Markdown转Word工具 一款简单易用的批量Markdown文档转换工具&#xff0c;支持将多个Markdown文件一键转换为Word文档。完全免费&#xff0c;无需安装&#xff0c;解压即用&#xff01; 官方网站 访问官方展示页面了解更多信息&#xff1a;http://mutou888.com/pro…

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要&#xff0c;因为这将有助于减少信号发射&#xff0c;最大程度地减少噪声&#xff0c;确保器件作用&#xff0c;最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确&#xff0c;然…

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加&#xff0c;传统开发模式存在效率低&#xff0c;重复劳动多等问题。若依项目通过整合主流技术框架&…

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手

华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…

MeanFlow:何凯明新作,单步去噪图像生成新SOTA

1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架&#xff0c;旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念&#xff0c;这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换&#xff0c;显…

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时&#xff0c;最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据&#xff0c;往往会有很多的协变量&#xff0c;即使我们通过计算来减少指标对结果的影响&#xff0c;我们的数据中依然会有很多的协变量&#xff0c;且…

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则&#xff0c;它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则&#xff1f; 这个原则的核心思想是&#xff1a; “告诉一个对象该做什么&#xff0c;而不是询问一个对象的状态再对它作出决策。…

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)

当我们网关配置好了&#xff0c;DNS也配置好了&#xff0c;最后在虚拟机里还是无法访问百度的网址。 第一种情况&#xff1a; 我们先考虑一下&#xff0c;网关的IP是否和虚拟机编辑器里的IP一样不&#xff0c;如果不一样需要更改一下&#xff0c;因为我们访问百度需要从物理机…

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机&#xff0c;相比自己家中不定时开关机的主机更适合完成定时任务&#xff0c;例如下载资源、备份上传&#xff0c;或者登录某个网站执行一些操作&#xff0c;只需要编写 脚本&#xff0c;然后让服务器定时来执行这个脚本就可以。 有很多方法实现…

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…