当前位置: 首页 > article >正文

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图

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、favourite.vue页面源码【复用首页的瀑布流】

<template><view class="container"><!-- 景点列表 瀑布流 --><view class="attraction-list"><!-- 左侧 --><up-waterfall v-model="attractionList" ref="uWaterfallRef"><template v-slot:left="{leftList}"><view class="attraction-warter" v-for="(item,index) in leftList" :key="index"@click="goAttractionDetail(item)"><!-- 景点封面 --><up-lazy-load threshold="-450" border-radius="10" :image="formatImagePath(item.attraction.cover)":index="index"></up-lazy-load><!-- 景点标题 --><view class="attraction-title">{{item.title}}</view><!-- 景点简介 --><view class="attraction-introduction">{{item.introduction}}</view><!-- 景点营业时间 --><view class="attraction-times">营业时间:{{item.attraction.inbusinessTime1}}~{{item.attraction.inbusinessTime2}}</view><!-- 景点其他信息 --><view class="attraction-other"><!-- 是否需要预约 --><view class="attraction-pay">{{item.enableAppointment?"要预约":"免预约"}}</view><!-- 是否需要付费 --><view class="attraction-appointment">{{item.enablePay?"购买门票":"无需门票"}}</view></view><!-- 是否需要推荐 --><view class="isDot">推荐</view></view></template><!-- 右侧 --><template v-slot:right="{rightList}"><view class="attraction-warter" v-for="(item,index) in rightList" :key="index"@click="goAttractionDetail(item)"><!-- 景点封面 --><up-lazy-load threshold="-450" border-radius="10" :image="item.attraction.cover":index="index"></up-lazy-load><!-- 景点标题 --><view class="attraction-title">{{item.title}}</view><!-- 景点简介 --><view class="attraction-introduction">{{item.introduction}}</view><!-- 景点营业时间 --><view class="attraction-times">营业时间:{{item.attraction.inbusinessTime1}}~{{item.attraction.inbusinessTime2}}</view><!-- 景点其他信息 --><view class="attraction-other"><!-- 是否需要预约 --><view class="attraction-pay">{{item.enableAppointment?"需要预约":"免预约"}}</view><!-- 是否需要付费 --><view class="attraction-appointment">{{item.enablePay?"购买门票":"无需门票"}}</view></view><!-- 是否需要推荐 --><view class="isDot">推荐</view></view></template></up-waterfall></view><view v-if="showTopBtn" @click="toTop" class="topClass"><up-icon name="arrow-upward" color="#fff" size="28"></up-icon></view></view>
</template><script setup>// 引入apiimport {getFavouriteList} from '../../api/my_api'// 生命周期,进来就加载import {onLoad,onReachBottom,onPageScroll} from '@dcloudio/uni-app'//vueimport {ref,reactive} from 'vue'//景点列表const attractionList = ref([])//滚动是否显示↑箭头图标按钮const showTopBtn = ref(false)// 先定义 loadAttractionList 函数const loadAttractionList = () => {getFavouriteList().then(res => {attractionList.value = res})}// 在数据中或方法里转换路径const formatImagePath = (path) => {if (!path) return '';// 如果已经是绝对路径(/static/...),直接返回if (path.startsWith('/') || path.startsWith('http')) return path;// 否则补全路径return `/static/${path.replace(/^\.\.\//, '')}`;}//  然后定义 onLoadonLoad(() => {// 加载景点列表loadAttractionList()})// 跳转景点详情页面const goAttractionDetail = (item) => {uni.navigateTo({url: `/pages/attraction_details/attraction_details?attractionId=${item.id}`});};// 页面触底onReachBottom(() => {console.log("触底啦")//多点假数据,实现瀑布流效果setTimeout(() => {addRandomData()}, 1000)})//检测上下互动的滚动条onPageScroll((e) => {// console.log("滚动啦")if (e.scrollTop > 0) {showTopBtn.value = true} else {showTopBtn.value = false}})// 回到顶部const toTop = () => {uni.pageScrollTo({scrollTop: 0,duration: 300})}
</script>
<style>page {background-color: #cee0ff;}
</style>
<style lang="scss" scoped>.container {padding: 20rpx;.attraction-list {margin-top: 20rpx;// 瀑布流.attraction-warter {margin: 10rpx 10rpx 10rpx 0rpx;background-color: #fff;border-radius: 16rpx;padding: 16rpx;position: relative;// 景点标题.attraction-title {font-size: 30rpx;margin-top: 10rpx;color: #303133;}// 景点简介.attraction-introduction {font-size: 20rpx;margin-top: 10rpx;color: #c2c6ce;}// 景点时间.attraction-times {font-size: 24rpx;margin-top: 10rpx;color: #777;}// 景点其他信息.attraction-other {display: flex;margin-top: 10rpx;// 景点是否需要付费.attraction-pay {border: 1px solid orange;color: orange;font-size: 20rpx;display: flex;align-items: center;padding: 4rpx 14rpx;border-radius: 50rpx;}// 景点是否需要预约.attraction-appointment {border: 1px solid #00afff;color: #00afff;margin-left: 20rpx;font-size: 20rpx;display: flex;align-items: center;padding: 4rpx 14rpx;border-radius: 50rpx;}}// 推荐.isDot {position: absolute;top: 20rpx;right: 20rpx;font-size: 24rpx;color: #fff;line-height: 32rpx;background-color: red;text-align: center;border-radius: 10rpx;padding: 4rpx 10rpx;}}}// 回到顶部.topClass {position: fixed;bottom: 120rpx;right: 30rpx;background-color: rgba(0, 0, 0, 0.5);padding: 20rpx;width: 44rpx;height: 44rpx;border-radius: 40rpx;display: flex;justify-content: center;align-items: center;}}
</style>

3、后端接口的返回类型

【收藏太多了,去掉了一些数据,仅供参考】

[{"id": 139,"userId": 4,"attractionId": 1,"createTime": "2025-05-18T19:09:56","attraction": {"id": 1,"title": "定州塔","cover": "http://localhost:9001/attraction/1.png","introduction": "中华第一塔","start": null,"browse": null,"img": null,"description": "定州塔,又名开元寺塔、料敌塔,位于河北省定州市城区,是中国现存最高的砖塔,高达83.7米。这座八角十一级密檐式实心砖塔,始建于北宋咸平四年(1001年),至今已历经千年风雨。\n定州塔不仅是佛教圣地开元寺的标志性建筑,也曾作为军事瞭望塔,在北宋抵御契丹(辽国)南侵时发挥过重要作用,因此得名“料敌塔”。塔身自下而上逐层收缩,呈优美的锥形,每层都装饰有精美的砖雕,包括佛龛、佛像、飞天等,展现了宋代高超的砖雕艺术。\n定州塔采用独特的建造工艺,内部用黄土和砖块夯实,外部用砖块砌筑,形成类似“空心墙”的结构,使其具有良好的抗震性能。历经多次地震,至今仍巍然屹立。\n定州塔不仅是定州市的标志性建筑,也是全国重点文物保护单位,是研究宋代佛教建筑和军事防御的重要实物资料。它以其悠久的历史、独特的建筑风格、精美的砖雕艺术和深厚的文化内涵,成为中国古代建筑艺术的瑰宝,吸引着无数游客前来参观。\n","inbusinessTime1": "06:00:00","inbusinessTime2": "18:00:00","address": "河北省保定市定州市中山中路南侧\r\n","province": null,"city": null,"area": null,"longitude": "115","latitude": "38.51","location": null,"enableType": "true","typeId": "4","enableAppointment": "false","enablePay": "false","tel": null}
}, {"id": 141,"userId": 4,"attractionId": 2,"createTime": "2025-05-18T19:09:56","attraction": {"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}
}, {"id": 142,"userId": 4,"attractionId": 3,"createTime": "2025-05-18T19:09:56","attraction": {"id": 3,"title": "河北博物院","cover": "http://localhost:9001/attraction/3.png","introduction": "穿越千年历史,感受燕赵文化的厚重与辉煌!","start": null,"browse": null,"img": null,"description": "河北博物院,位于河北省石家庄市,是省级综合性博物馆,国家一级博物馆。它犹如一颗璀璨的明珠,闪耀着燕赵大地的文明之光。\n博物院占地广阔,建筑宏伟,馆藏丰富,拥有各类文物藏品高达XX万件。这些藏品涵盖了从史前时期到近代的各个历史阶段,包括陶瓷、青铜器、书画、玉器等多个门类,尤以满城汉墓出土文物、河北古代瓷器、石家庄出土文物、明清书画以及河北近现代历史文物等最具特色。\n河北博物院的基本陈列以“慷慨燕赵,自强不息”为主题,通过“石器时代的河北”、“河北商代文明”、“慷慨悲歌——燕赵古国”、“战国雄风——古中山国”、“大汉绝唱——满城汉墓”等展览,生动展现了河北悠久的历史和灿烂的文化。其中,“大汉绝唱——满城汉墓”展览,展示了满城汉墓出土的珍贵文物,包括金缕玉衣、长信宫灯等国宝级文物,令人叹为观止。\n此外,河北博物院还经常举办各种临时展览和学术交流活动,为社会公众提供了丰富的文化大餐。它不仅是收藏、研究、展示文物的重要场所,也是进行爱国主义教育、历史文化教育的重要基地,是人们了解河北、认识中华文明的重要窗口。\n","inbusinessTime1": "06:00:00","inbusinessTime2": "18:00:00","address": "河北省石家庄市长安区东大街 4 号\r\n","province": null,"city": null,"area": null,"longitude": "114.44","latitude": "38.14\r\n","location": null,"enableType": "true","typeId": "2","enableAppointment": "false","enablePay": "false","tel": null}
}]

4、效果图

相关文章:

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...