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、效果图

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

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

相关文章

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…

【C/C++】高效的位操作

位运算&#xff08;Bitwise Operation&#xff09;是直接对整数的二进制位进行操作的运算方式&#xff0c;在底层开发、性能优化、算法设计中广泛使用。 1 基本位运算符及含义 运算符名称示例&#xff08;a5, b3&#xff09;运算过程&#xff08;二进制&#xff09;结果&按…

后端下载限速(redis记录实时并发,bucket4j动态限速)

✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制&#xff08;动态&#xff09;✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 &#x1f9e9; 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…

android app 一个 crash的解决过程!

一、日志&#xff1a; crash 2024-10-25 12:15:33.020 2113-2113 AndroidRuntime pid-2113 E FATAL EXCEPTION: main Process: com..workhome, PID: 2113 java.lang.RuntimeException: Unable to start activity ComponentInfo{com..w…

[Java 基础]Object 类

java.lang.Object 是 Java 所有类的直接或间接父类&#xff0c;Java 中每个类都默认继承 Object 类&#xff08;即使你没写 extends Object&#xff09;。 Object 中的常用方法&#xff1a; 方法名功能简介toString()返回对象的字符串表示equals(Object)判断两个对象是否“逻…

大数据学习(135)-Linux系统性指令

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

【Fifty Project - D35】

今日完成记录 TimePlan完成情况7&#xff1a;00 - 7&#xff1a;40爬坡√8&#xff1a;30 - 11&#xff1a;30Rabbit MQ√17&#xff1a;30 - 18&#xff1a;30羽毛球√ RabbitMQ 消费者端如何保证可靠性&#xff1f; 消息投递过程出现网络故障消费者接收到消息但是突然宕机…

P3 QT项目----记事本(3.4)

3.4 文件选择对话框 QFileDialog 3.4.1 QFileDialog 开发流程 使用 QFileDialog 的基本步骤通常如下&#xff1a; 实例化 &#xff1a;首先&#xff0c;创建一个 QFileDialog 对象的实例。 QFileDialog qFileDialog;设置模式 &#xff1a;根据需要设置对话框的模式&…

学习笔记(26):线性代数-张量的降维求和,简单示例

学习笔记(26)&#xff1a;线性代数-张量的降维求和&#xff0c;简单示例 1.先理解 “轴&#xff08;Axis&#xff09;” 的含义 张量的 “轴” 可以理解为 维度的方向索引 。对于形状为 (2, 3, 4) 的张量&#xff0c;3 个轴的含义是&#xff1a; 轴 0&#xff08;axis0&…

健康档案实训室:构建全周期健康管理的数据基石

一、健康档案实训室建设背景 随着“健康中国2030”战略深入推进&#xff0c;健康档案作为居民健康数据的核心载体&#xff0c;在疾病预防、慢性病管理、医疗决策等领域的价值日益凸显。在此背景下&#xff0c;健康档案实训室建设成为职业院校对接政策要求、培养专业健康管理…

【MATLAB第119期】基于MATLAB的KRR多输入多输出全局敏感性分析模型运用(无目标函数,考虑代理模型)

【MATLAB第119期】基于MATLAB的KRR多输入多输出全局敏感性分析模型运用&#xff08;无目标函数&#xff0c;考虑代理模型&#xff09; 下一期研究SHAP的多输入多输出敏感性分析方法 一、SOBOL&#xff08;无目标函数&#xff09; &#xff08;1&#xff09;针对简单线性数据…

Linux常用文件目录命令

浏览目录命令&#xff1a; ls 、pwd目录操作命令&#xff1a;cd、mkdir、rmdir浏览文件命令&#xff1a;cat、more、less、head、tail文件操作命令&#xff1a;cp、rm、mv、find、grep、tar 浏览目录命令 ls ◼ 命令名称&#xff1a;ls ◼ 命令英文原意&#xff1a;list ◼ …

PIN码vs密码,电脑登录的快捷键你用对了吗?

你是否也遇到过这样的窘境&#xff1a;信心满满地输入电脑开机密码&#xff0c;屏幕却无情地提示“密码错误”。仔细一看&#xff0c;才发现登录界面悄悄地变成了要求输入“PIN码”。这种因为混淆了PIN码和账户密码而导致的开机失败&#xff0c;相信不少朋友都碰到过。 PIN码作…

【大模型科普】AIGC技术发展与应用实践(一文读懂AIGC)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…

XXE漏洞知识

目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例&#xff1a;文件读取&#xff08;需要Apache >5.4版本&#xff09; 案例&#xff1a;内网探测&#xff08;鸡肋&#xff09; 案例&#xff1a;执行命…

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…

STL优先级队列的比较函数与大堆小堆的关系

STL中的priority_queue&#xff08;优先级队列&#xff09;通过比较函数来确定元素的优先级顺序&#xff0c;从而决定其内部是形成大堆还是小堆。以下是关键点总结&#xff1a; 默认行为与大堆&#xff1a; 默认情况下&#xff0c;priority_queue使用std::less<T>作为比较…

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…

OD 算法题 B卷【反转每对括号间的子串】

文章目录 反转每对括号间的子串 反转每对括号间的子串 给出一个字符串s&#xff0c; 仅含有小写英文字母和英文括号’(’ ‘)’&#xff1b;按照从括号内到外的顺序&#xff0c;逐层反转每对括号中的字符串&#xff0c;并返回最终的结果&#xff1b;结果中不能包含任何括号&am…