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

news2024/11/25 18:58:54

1.搜索界面开发

1.1 模糊查询

文件地址:pycharm-

class SightListView(ListView):
    paginate_by = 5

    def 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=objects
        totalItem.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.isHot
    isTop.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.obj
        return {
            #...
            '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.city
    if(sightDetail.value.area){
        area += sightDetail.value.area
    }
    if(sightDetail.value.town){
        area += sightDetail.value.town
    }
    return area
})

2.7 更改静态地址为动态

景点大图:

景点介绍:

地址信息:

门票列表:

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

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

相关文章

python识别ocr 图片和pdf文件

#识别图片 pip3 install paddleocr pip3 install paddlepaddle#识别pdf pip3 install PyMuPDF 重点&#xff1a;路径不能有中文&#xff0c;不然pdf文件访问不了 from paddleocr import PaddleOCR from rest_framework.response import Response from rest_framework.views im…

量化分析工具日常操作日记-5-通合科技

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-5-军工-通合科技&#xff08;300491&#xff09;。 周末国家新政策&#xff0c;要大力支持军工行业&#xff0c;我用工具挖掘了两个低位股&#xff0c;供大家参考。通合科技&#xff08;300491&#xff…

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中&#xff0c;SendMessage方法是一个强大的工具&#xff0c;它允许我们与Windows API交互&#xff0c;模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数&#xff0c;它用…

CSS教程(三)- CSS 三大特性

1. 层叠性 介绍 多组CSS样式共同作用于一个元素&#xff0c;就会出现 覆盖&#xff08;层叠&#xff09; 另一个冲突的样式。 层叠原则 样式冲突&#xff1a;遵循就近原则&#xff08;哪个样式离结构近&#xff0c;就执行哪个样式&#xff09; 样式不冲突&#xff0c;就不会重…

CyclicBarrier使用详解及遇到的坑

上一篇文章讲的是关于是使用CountDownLatch实现生成年底报告遇到的问题&#xff0c;这个计数器和CyclicBarrier也有类似功能&#xff0c;但是应用场景不同。 一、应用场景 CountDownLatch&#xff1a; 有ABCD四个任务&#xff0c;ABC是并行执行,等ABC三个任务都执行完…

Java-I/O框架14:Properties集合及使用

视频链接&#xff1a;16.32 Properties使用&#xff08;2&#xff09;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tz4y1X7H7?spm_id_from333.788.player.switch&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p32 1.Properties集合 特性&#xff1a; 存储…

Windows下mysql数据库备份策略

Windows下mysql的增量备份和全量备份&#xff0c;并利用schtasks设置定时任务执行bat脚本。 一、备份要求 序号 备份类型 备份频次 备份时间 1 增量备份 每周一-每周六各一次 18:00:00 2 全量备份 每周日一次 18:00:00 二、备份方法 2.1增量备份 2.1.1准备工作…

架构师备考-概念背诵(软件工程)

软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。软件运行和维护:就是…

【Linux】Linux入门实操——vim、目录结构、远程登录、重启注销

一、Linux 概述 1. 应用领域 服务器领域 linux在服务器领域是最强的&#xff0c;因为它免费、开源、稳定。 嵌入式领域 它的内核最小可以达到几百KB, 可根据需求对软件剪裁&#xff0c;近些年在嵌入式领域得到了很大的应用。 主要应用&#xff1a;机顶盒、数字电视、网络…

【Java项目】基于SpringBoot的【生鲜交易系统】

技术简介&#xff1a; 系统软件架构选择B/S模式、java技术和MySQL数据库等&#xff0c;总体功能模块运用自顶向下的分层思想。 系统简介&#xff1a; 考虑到实际生活中在生鲜交易方面的需要以及对该系统认真的分析,将系统权限按管理员&#xff0c;用户这两类涉及用户划分。 (…

AI Weekly『11月4-10日』: Anthropic发布Claude 3.5 Haiku,腾讯开源混元-Large模型!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

贪心算法day3(最长递增序列问题)

目录 1.最长递增三元子序列 2.最长连续递增序列 1.最长递增三元子序列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们只需要设置两个数进行比较就好。设a为nums[0]&#xff0c;b 为一个无穷大的数&#xff0c;只要有比a小的数字就赋值…

vue实现图片无限滚动播放

本人vue新手菜鸡&#xff0c;文章为自己在项目中遇到问题的记录&#xff0c;如有不足还请大佬指正 文章目录 实现效果代码展示总结 因为刚接触vue&#xff0c;本想着看看能不能用一些element的组件实现图片的轮播效果&#xff0c;尝试使用过element-UI里的走马灯Carouse&#x…

[ 内网渗透实战篇-2 ] 父域子域架构的搭建与安装域环境判断域控定位组策略域森林架构配置信任关系

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Follow软件的使用入门教程

开篇 看到很多兄弟还不知道怎么用这个当下爆火的浏览器&#xff01;在这里简单给需要入门的小伙伴一些建议&#xff1a; 介绍 简单解释一下&#xff0c;RSS 意思是简易信息聚合&#xff0c;用户可以通过 RSS 阅读器或聚合工具自主订阅并浏览各个平台的内容源&#xff0c;不用…

esp32学习:用虫洞ESP32开发板,快速实现无线图传

我们的虫洞ESP32-S3-EYE开发板&#xff0c;能够完美运行esp who AI代码&#xff0c;所以实现无线图传那是非常容易的&#xff0c;我们先看看esp who代码库中examples目录&#xff1a; 里面有比较多的web例程&#xff0c;在这些例程下&#xff0c;稍作修改&#xff0c;就可以快速…

最新三维视觉下的扩散模型综述——Diffusion Models in 3D Vision: A Survey

目录 摘要 一、引言 二、扩散模型简介 A.扩散模型的介绍 B.扩散模型的数学基础 C.扩散模型的变体 D.三维视觉中的生成过程 三、三维视觉基础 A.三维表示 B.三维视觉中的深度学习方法 C.3D视觉中的挑战 四、三维扩散生成任务 A.无条件生成 B.图像到三维 C.文本到…

JavaSE:运算符 (学习笔记)

目录 一&#xff0c;算术运算符 【1】 共同点&#xff1a; 【2】 不同点&#xff1a; 二&#xff0c;关系运算符 三&#xff0c;逻辑运算符 2&#xff0c;&和&&的区别和联系 { |和||的区别和联系 }---两题类似 四&#xff0c;赋值运算符 五&#xff0c;拓展…

strtok函数详解

strtok函数 strtok 函数是一个字符串分割函数&#xff0c;用于将字符串分割成一系列的标记。这个函数通过一组分隔符字符来确定标记的边界&#xff0c;每次调用都会返回字符串中的下一个标记&#xff0c;并且将原始字符串中的分隔符替换为空字符‘\0’&#xff0c;从而实际上是…

题目练习之二叉树那些事儿(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…