Vue全栈开发旅游网项目(7)-搜索界面开发及其接口联调

1.搜索界面开发

1.1 模糊查询

文件地址:pycharm-

class SightListView(ListView):paginate_by = 5def get_queryset(self):#is_valid=True:表中is_valid列,有值则被查询出来query = Q(is_valid=True)#1.获得热门景点is_hot = self.request.GET.get('is_hot',None)if is_hot:query = query & Q(is_hot=True)#2.获得精选景点is_top = self.request.GET.get('is_top',None)if is_top:query = query & Q(is_top=True)#3.景点名称搜索👇#获取前端传来的 用于搜索的景点关键字name = self.request.GET.get('name',None)if name:query = query & Q(name__icontains=name) #名字列模糊查询👆queryset = Sight.objects.filter(query)return queryset#用于分页函数def get_paginate_by(self, queryset):#用于控制 从前端传递过来的每一页显示条数的函数page_size = self.request.GET.get('limit',None)return page_size or self.paginate_by #对分页做一个重写

1.2 访问服务端接口【获取数据】

<script setup>
import { ajax } from '@/utils/ajax';
import { SightApis } from '@/utils/apis';
//访问服务端接口,获取数据
const getDataList=()=>{ajax.get(SightApis.sightListUrl,{params:{name:sightName.value,page:currentPage.value,limit:perPage.value}}).then(({data:{meta,objects}})=>{dataList.value=objectstotalItem.value = meta.total_count})
}
onMounted(()=>{getDataList()
})
</script>

1.3 搜索函数

if语句,判断搜索框中是否输入数据,如果没有数据则提示"说话!"

<script setup>
import { showToast } from 'vant';//提示框组件
//搜索函数
const onSearch = ()=>{// console.log('onSearch')if(!sightName.value){showToast('请输入搜索词')return}//重置数据dataList.value=[]currentPage.value=1//执行查询getDataList()
}
</script>

1.4 清空并换新列表函数

<script setup>
//清空列表函数
const clear =()=>{//重置数据dataList.value=[]currentPage.value=1//执行查询getDataList()
}
const pageChange=()=>{getDataList()
}
</script>
<template><div class="page-search"><!-- 分页 --><van-pagination v-model="currentPage":total-items="totalItem":items-per-page="perPage"@change="pageChange"></van-pagination></div>
</template>

1.5 调整搜索界面布局

<style lang="less">.page-search{padding-bottom: 60px;.sight-list{padding: 10px;background-color: aliceblue;margin-bottom: 10px;}}
</style>

1.6 分类显示

点击不同的按钮进入不同的搜索界面【热门/推荐景点】

<script setup>
import { useRoute,useRouter } from 'vue-router';
const route = useRoute()
const router = useRouter()
//热门景点和精选景点
const isHot = ref('')
const isTop = ref('')
onMounted(()=>{isHot.value = route.query.isHotisTop.value = route.query.isTop
})
</script>
<template><div class="page-search"><!-- 判断显示热门景点还是精选景点  --><h2 v-if="isHot">热门推荐</h2><h2 v-if="isTop">精选推荐</h2><!-- 底部导航 --><TripFooter v-if="!(isHot||isTop)"/></div>
</template>

1.7 返回主界面

<script setup>
const goBack = ()=>{router.go(-1)
}
</script>
<template><div class="page-search"><!-- 标题 --><van-nav-bar title="搜索景点" left-text="返回" @click="goBack" v-if="isHot||isTop"/><van-nav-bar title="搜索景点" v-else/></div>
</template>

1.8 “更多”按键功能跳转

1.8.1 Fine.vue推荐景点

1.8.2 Hot.vue热门景点

 

2.景点接口数据联调

1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据至到模型层

2.1 服务端获取评论信息

数据模型文件

该文件用于统一服务端与数据库端的数据格式
“抗拒不匹配”,数据库端以表的方式表示数据,服务端以对象等方式表示数据
为了使两者数据统一,因此需要数据模型做规范

class Sight(CommonModel):#....@property#获得评论总数def comment_count(self):return self.comments.filter(is_valid=True).count()@property#获得景点图片总数def image_count(self):return self.images.filter(is_valid=True).count()

重构响应对象

重构原因:服务端提供了众多接口用于响应数据,
 为了便于前端能够统一处理这些数据,需要将响应的数据统一格式。
 以上,成为重构响应对象(序列化

文件地址:sight/serializers.py

class SightDetailSerializers(BaseSerializer):#景点详情def to_dict(self):obj = self.objreturn {#...'comment_count': obj.comment_count,#获得景点评论数量'image_count': obj.image_count#获得景点图片数量}

2.2 配置接口

文件地址:src\utils\apis.js

//景点相关的接口
const SightApis = {//访问服务端的接口地址//访问景点列表sightListUrl:apiHost+"/sight/sight/list/",//访问景点详情sightDetailUrl:apiHost+"/sight/sight/detail/#{id}/",//门票列表sightTicketUrl:apiHost+"/sight/ticket/list/#{id}/",
}

再调整一下路由:

    {path:'/sight/comment/:id',name:'SightComment',component:SightComment},

2.3 控制跳转

import useroute/userouter:用于控制页面跳转工具,传值工具;

goBack:返回前一页。

<script setup>
import {useRoute, useRouter} from 'vue-router'
import { ajax } from '@/utils/ajax';
import { SightApis } from '@/utils/apis';const router = useRouter()
const route = useRoute()const goBack = ()=>{router.go(-1)
} 
</script>

2.4 获取景点详情信息

{}:用于表示对象,类似于python字段,由于服务端响应的数据是对象的格式,因此使用{}承载

replace:替换api/sight/sight/detail/#{id}中的id值

route.params.id: 获取地址栏携带id值

const sightDetail = ref({})
const getSightDetail = ()=>{const url = SightApis.sightDetailUrl.replace('#{id}',route.params.id)ajax.get(url).then(({data})=>{sightDetail.value = data})
}onMounted(()=>{getSightDetail()
})

2.5 获取景点门票信息

const ticketList = ref([])
const getTicketList = ()=>{const url = SightApis.sightTicketUrl.replace('#{id}',route.params.id)ajax.get(url).then(({data:{objects}})=>{ticketList.value = objects})
}
onMounted(()=>{getTicketList()
})

2.6 获取景点地址

computed计算属性,用于数据处理的函数,如何返回数据进行格式化

const fullArea = computed(()=>{let area = sightDetail.value.province+sightDetail.value.cityif(sightDetail.value.area){area += sightDetail.value.area}if(sightDetail.value.town){area += sightDetail.value.town}return area
})

2.7 更改静态地址为动态

景点大图:

景点介绍:

 

地址信息:

门票列表:

 

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

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

相关文章

『 Linux 』网络传输层 - TCP(二)

文章目录 TCP六个标志位TCP的连接三次握手 四次挥手为什么是三次握手和四次挥手 重传机制 TCP六个标志位 在TCP协议报文的报头中存在一个用于标志TCP报文类型的标志位(不考虑保留标志位),这些标志位以比特位选项的方式存在,即对应标志位为0则表示为假,对应标志位为1则为真; SYN…

Django学习-项目部署

WSGI定义&#xff1a; uWSGI定义&#xff1a; 安装uWSGI&#xff1a; 配置uWSGI&#xff1a; uWSGI常见问题汇总&#xff1a; 安装nginx&#xff1a; 配置&#xff1a; 启动/停止dnginx 修改uWSGI配置&#xff1a; 常见问题解决方法&#xff1a; nginx静态文件配置&#xff…

迅为RK3588开发板Android多屏显示之多屏同显和多屏异显

迅为RK3588开发板是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像…

QML项目实战:自定义Button

目录 一.添加模块 ​1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Button 1.颜色背景设置 2.设置渐变色背景 3.文本设置 4.点击设置 5.阴影设置 三.效果 1.当enabled为true 2.按钮被点击时 3.当enabled为false 四.代码 一.添加模块 1.QtQuick.Con…

基于C#实现Windows后台窗口操作与图像处理技术分析

在Windows编程中&#xff0c;操作后台窗口是一项复杂而有用的技术。它可以用来自动化用户界面测试、应用程序机器人等场景。本文将深入探讨如何在C#中绑定后台窗口、获取后台窗口界面图片&#xff0c;以及在图片中寻找指定图标并获取坐标。本技术文章结合最先进的资料与实践经验…

数据库基础(1) . 关系型数据库

1.数据库 database 1.1.数据持久化 数据持久化&#xff08;Data Persistence&#xff09;指的是将程序中的数据保存到某种持久化的存储介质&#xff08;如硬盘、SSD、磁带等&#xff09;上的过程&#xff0c;使得即使在程序终止后&#xff0c;数据依然可以被保留下来并在下次…

Python学习的自我理解和想法(27)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第27天&#xff0c;学的内容是python操作pptx和pdf&#xff0c;但是这节博客只会介绍如何新建pptx和加密pdf。开学了&#xff0c;时间不多&…

鸿蒙移动应用开发-------初始arkts

一. 什么是arkts ArkTS是HarmonyOS优选的主力应用开发语言。 ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;保持了TS的基本风格&#xff0c;同时通过规范定义强化开发期静态检查和分析&#xff0c;提升程序执行稳定性和…

Linux(CentOS)安装 JDK

1、下载 JDK 官网&#xff1a;https://www.oracle.com/ 2、上传 JDK 文件到 CentOS&#xff0c;使用FinalShell远程登录工具&#xff0c;并且使用 root 用户登录 3、解压 JDK 创建目录 /export/server mkdir -p /export/server 解压到目录 /export/server tar -zxvf jdk-17…

qt QStandardItemModel详解

1、概述 QStandardItemModel是Qt框架中提供的一个基于项的模型类&#xff0c;用于存储和管理数据&#xff0c;这些数据可以以表格的形式展示在视图控件&#xff08;如QTableView、QTreeView等&#xff09;中。QStandardItemModel支持丰富的数据操作&#xff0c;包括添加、删除…

SpringBoot框架在在线教育领域的应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【论文分享】基于多源大数据的高密度城市健康资源可达性与公平性评价

评估城市健康设施的可达性和公平性对于有效配置城市健康资源至关重要。本次我们给大家带来一篇SCI论文的全文翻译。该论文从新的视角定义和分类城市中的健康相关设施&#xff0c;考虑居民的主动和被动健康寻求行为&#xff0c;构建一个综合性框架来评估健康设施的邻近性、互补性…

Vue学习之路17----事件

可以自定义事件让子组件向父组件传值 1.使用emit 2.使用props 3.使用mitt 其实mitt和第一种方法类似&#xff0c;都用emitt事件&#xff0c;但是mitt不局限于父子之间通信&#xff0c;他可以在任意2个组件之间通信&#xff0c; 虽然需要安装&#xff0c;但mitt很小&#xff…

基于梯度的快速准确头部运动补偿方法在锥束CT中的应用|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 A gradient-based approach to fast and accurate head motion compensation in cone-beam CT 基于梯度的快速准确头部运动补偿方法在锥束CT中的应用 01 文献速递介绍 锥束计算机断层扫描&#xff08;CBCT&#xff09;系统在灵活性方面比螺旋多排探测器计算机断…

基于 JavaWeb 的宠物商城系统(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Redis学习:BitMap/HyperLogLog/GEO案例 、布隆过滤器BloomFilter、缓存预热+缓存雪崩+缓存击穿+缓存穿透

Redis学习 文章目录 Redis学习1、BitMap/HyperLogLog/GEO案例2. 布隆过滤器BloomFilter3. 缓存预热缓存雪崩缓存击穿缓存穿透 1、BitMap/HyperLogLog/GEO案例 真实需求面试题 亿级数据的收集清洗统计展现对集合中数据进行统计&#xff0c;基数统计&#xff0c;二值统计&#xf…

【论文速读】| PathSeeker:使用基于强化学习的越狱攻击方法探索大语言模型的安全漏洞

基本信息 原文标题: PathSeeker: Exploring LLM Security Vulnerabilities with a Reinforcement Learning-Based Jailbreak Approach 原文作者: Zhihao Lin, Wei Ma, Mingyi Zhou, Yanjie Zhao, Haoyu Wang, Yang Liu, Jun Wang, Li Li 作者单位: Beihang University, Nany…

P2672 [NOIP2015 普及组] 推销员

P2672 [NOIP2015 普及组] 推销员 难度&#xff1a; 提高/省选- 。 考点&#xff1a;贪心、前缀和。 题意&#xff1a; ​ n n n 个住户&#xff0c;小明每走一米消耗 1 1 1 疲劳&#xff0c;第 i i i 个住户距离起点 S i S_i Si​ 米&#xff0c;同时走进住户沟通会累积…

软件工程技术专业在物联网应用开发中的关键技术与挑战

引言 物联网技术的蓬勃发展与广泛普及&#xff0c;极大地丰富了人们的日常生活&#xff0c;催生了诸如智能家居、智能交通、智能健康等一系列创新应用&#xff0c;为用户提供了更加智能化、个性化的服务体验。然而&#xff0c;物联网应用开发也随之迎来了诸多挑战&#xff0c;…