第8章 智能租房——列表页

学习目标

  • 掌握搜索房源列表页展示功能的逻辑,能够实现在列表中展示符合搜索条件的房源数据

  • 掌握最新房源列表页展示功能的逻辑,能够运用分页插件以分页形式展示最新房源数据

  • 掌握热点房源列表页展示功能的逻辑,能够运用分页插件以分页形式展示热点房源数据

为了向用户展示更多的房源信息,智能租房平台允许用户通过首页的智能提示搜索框搜索,或者单击链接文本“更多北京房源”或“更多热点房源”进入列表页,查看更多符合搜索条件、最新或热点的房源信息。列表页模块涉及3个功能,分别是搜索房源列表页展示、最新房源列表页展示、热点房源列表页展示,本章将对这3个功能进行介绍。

8.1 搜索房源列表页展示

8.1.1 搜索房源列表页功能说明

当用户在智能租房首页的智能提示搜索框中输入关键字后,可以在输入框下方看到提示列表。在提示列表中单击某个检索项,会将选中的检索项填写到输入框。 若用户选择地区搜索,则输入框中填入的内容为房源地址;若用户选择户型搜索,则输入框中填入的内容为户型。 此时单击输入框右方的“提交”按钮或按下回车键,会跳转到搜索房源列表页,搜索房源列表页中展示了符合搜索条件的全部房源信息。

每套房源信息还包括房源图片、房源标题、房源价格、建筑面积、房源户型、房源朝向、交通条件和浏览量。

8.1.2 搜索房源列表页的接口设计

搜索房源列表页只需要请求用户搜索的房源信息,所以请求方式为GET请求,请求页面为search_list.html;在index.html文件中定义智能提示搜索框的表单时,通过action属性指定了表单提交的地址为/query,所以搜索房源列表页的请求地址为/query;返回数据则为房源对象。

搜索房源列表页接口设计如表所示。

接口描述说明
请求页面search_list.html
请求方式GET
请求地址/query
返回数据房源对象

8.1.3 搜索房源列表页的后端实现

后端需要查询满足搜索条件的所有房源数据,具体实现逻辑:后端接收前端传递过来的搜索条件,再根据该搜索条件到数据库中查询符合该搜索条件的房源数据,并将查询的房源数据渲染到前端页面中。

搜索房源列表页的后端实现具体步骤如下。

(1)在house项目的根目录下app.py文件,在该文件中定义一个用于处理前端请求的视图函数。

@app.route('/query')  # http://127.0.0.1:5000/query?addr=朝阳-三里屯-三里屯SOHO
def search_txt_info():
    # 获取地区字段的查询
    if request.args.get('addr'):
        addr = request.args.get('addr')
        sql="select * from house_info where address=%s order by publish_time desc"
        cursor.execute(sql,(addr))
        result = cursor.fetchall()
        return render_template('search_list.html', house_list=result)

    # 获取户型字段的查询
    if request.args.get('rooms'):
        rooms_info = request.args.get('rooms')
        sql = "select * from house_info where rooms=%s order by publish_time desc"
        cursor.execute(sql, (rooms_info))
        result = cursor.fetchall()
        return render_template('search_list.html', house_list=result)
    # 重定向到index函数
    return redirect(url_for('index'))

(2)在app.py文件中,定义两个过滤器,分别用于处理过长的房源标题和空选项。

def deal_title_over(word):
    if len(word) > 15:
        return word[:15] + '...'  # 当房源标题长度大于15时,用省略号替换
    else:
        return word


def deal_direction(word):
    if len(word) == 0 or word is None:  # 房源朝向、交通条件为空时显示暂无信息
        return '暂无信息!'
    else:
        return word

(3)在app.py文件中,添加注册过滤器deal_title_over()和deal_direction()的代码。

app.add_template_filter(deal_title_over, 'dealover')
app.add_template_filter(deal_direction, 'dealdirection')

8.1.4 搜索房源列表页的前端实现

前端需要实现两个功能,分别是选中检索项和渲染列表页,其中选中检索项的功能代码无需进行任何修改。

1.选中检索项

选中检索项的逻辑代码位于index.html文件中。

// 单击检索项将其填入搜索框
function info_to_txt() {
    $('.li_style').on('click', function () {
        // 实现了重复点击的初始化
        if ($(this).hasClass('active')) {
            $(this).removeClass('active');
        }
        $(this).addClass('active');
        t_name = $(this).attr('title');
        $('#txt').val('');
        $('#txt').val(t_name);
        $('#list').empty()
    });}

2.渲染列表页

在search_list.html文件中查询class属性值为col-lg-10的div标签,在该标签内部保留第一个class属性值为row collection-line的div标签,并删除其余9个类似div标签,在保留的标签外部使用循环结构将固定的数据替换为相应的模板变量。

<!-- 模块1信息展示 -->
<div class="collection col-lg-10">
    <div id="fill-data" class="1">

        {% for house in house_list %}
            <div class="row collection-line">

                <div class="col-lg-5 col-md-5 mx-auto">
                    <div><a href="/house/{{ house[0] }}"><img class='img-fluid img-box'
                                                              src="/static/img/house-bg1.jpg"
                                                              alt=""></a></div>
                </div>
                <div class="col-lg-5 col-md-5 mx-auto">
                    <div class="collection-line-info">
                        <div class="title">
                            <span><a href="/house/{{ house[0] }}">{{ house[1] | dealover }}</a></span>
                        </div>
                        <div>
                            <span class="attribute-text">房源地址:</span>
                            &nbsp
                            <span class="info-text">{{ house[9] }} </span>
                        </div>
                        <div>
                            <span class="attribute-text">建筑面积:</span>
                            &nbsp
                            <span class="info-text">{{ house[3] }}平方米</span>
                        </div>
                        <div>
                            <span class="attribute-text">房源户型:</span>
                            &nbsp
                            <span class="info-text">{{ house[2] }}</span>
                        </div>
                        <div>
                            <span class="attribute-text">房源朝向:</span>
                            &nbsp
                            <span class="info-text">{{ house[5] | dealdirection }}</span>
                        </div>
                        <div>
                            <span class="attribute-text">交通条件:</span>
                            &nbsp
                            <span class="info-text">{{ house[10] | dealdirection }}</span>
                        </div>
                        <div>
                <span class="attribute-text"><i class="fa fa-heart" aria-hidden="true"
                                                style="color: #e74c3c"></i> {{ house[16] }}人浏览过</span>
                            &nbsp
                            <span class="info-text"></span>
                        </div>
                    </div>

                </div>
                <div class="col-lg-2 col-md-2 mx-auto">
                    <div class="info-more">
                        <span class="info-text" style="color: #e74c3c">¥&nbsp{{ house[4] }}</span>
                        <span><a href="/house/{{ house.id }}"><i class="fa fa-arrow-right"
                                                                 aria-hidden="true"></i></a></span>
                    </div>
                </div>

            </div>
        {% endfor %}
    </div>


    <div class="row my-page-line">
        <div class="col-lg-12 col-md-12 mx-auto">
            <div class="zxf_pagediv">
            </div>
        </div>
    </div>
</div>

8.2 最新房源列表页展示

8.2.1 最新房源列表页功能说明

智能租房网站中,单击首页的链接文本“更多北京房源”后,页面会跳转到最新房源列表页,该页面按照房源的发布时间(由晚到早)展示了当前城市的全部房源信息。

最新房源列表页以分页形式展示了全部房源数据,每页至多展示10套房源信息,当前页面是第1页,对应的链接地址为http://127.0.0.1:5000/list/pattern/1。

8.2.2 最新房源列表页的接口设计

最新房源列表页展示功能只涉及数据获取,不涉及数据提交,请求方式为GET,请求页面为list.html,返回数据为房源对象列表。

接口描述说明
请求页面list.html
请求方式GET
请求地址/list/pattern/int:page
返回数据房源对象列表

8.2.3 最新房源列表页的后端实现

最新房源列表页展示功能的后端逻辑:首先需要从数据库中查询所有的房源数据,将这些房源数据按照发布时间的先后顺序排列,发布时间晚的排在前面,发布时间早的排在后面,然后借用分页插件将排序后的数据进行分页展示。

在app.py文件编写代码,实现查询所有房源数据的功能,具体代码如下所示。

# 最新房源列表页展示的功能
@app.route('/list/pattern/<int:page>')
def return_new_list(page):
    # 获取房源总数量
    house_num = totalNums
    # 计算总的页码数,向上取整
    total_num = math.ceil(house_num / 10)
    sql="select * from house_info order by publish_time desc limit %s,%s"
    cursor.execute(sql,(page,10))
    result = cursor.fetchall()
    return render_template('list.html', house_list=result, page_num=page, total_num=total_num)

8.2.4 最新房源列表页的前端实现

前端需要实现两个功能,分别是分页显示和渲染列表页,这些功能代码均位于list.html文件中。

1.分页显示

前端借助分页插件实现分页显示的功能,分页插件位于项目的static目录下,包括zxf_page.css、jquery.min.js和zxf_page.js。在list.html文件中使用分页插件需要先引入分页插件,再根据分页插件的接口要求编写符合自己需求的回调函数。

<link href="/static/css/zxf_page.css" rel="stylesheet">
<script src="/static/vendor/jquery/jquery.min.js"></script>
<script src="/static/js/zxf_page.js"></script>
<script>
    $(document).ready(function () {
        $(".zxf_pagediv").createPage({
            pageNum: {{total_num}},  // 总的页码数
            {#pageNum: 10,  // 总的页码数#}
            current: Number($('#fill-data').attr('class')),  // 当前的页码
            backfun: function (e) {  // 回调函数
                console.log(e['current']);  // e['current] 是单击更多房源链接文本时候的页码
                var n_current = e['current'];
                // 获取当前页的地址
                var part_path = window.location.pathname;
                var path_list = part_path.split('/');
                // 将单击下一页的页码替换原来的页码
                path_list[3] = n_current;
                // 获取重新拼接的新URL地址
                var n_url = path_list.join('/');
                console.log(n_url);
                // 重新加载
                window.location.replace(n_url);
            }
        });
    });
</script>

2.渲染列表页

为了能够动态显示列表页的房源信息,在list.html文件中查询id属性值为fill-data的div标签,在该标签内部保留第一个class属性值为row collection-line的div标签,并删除其余9个类似div标签,在保留的标签外部使用循环结构将固定的数据替换为相应的模板变量。

<!-- 模块1信息展示 -->
<div class="collection col-lg-12 col-md-12">
    <div id="fill-data" class="{{ page_num }}">

        {% for house in house_list %}
            <div class="row collection-line">

                <div class="col-lg-5 col-md-5 mx-auto">
                    <div><a href="/house/{{ house[0] }}"><img class='img-fluid img-box'
                                                              src="/static/img/house-bg1.jpg" alt=""></a></div>
                </div>
                <div class="col-lg-5 col-md-5 mx-auto">
                    <div class="collection-line-info">
                        <div class="title">
                            <span><a href="/house/{{ house[0] }}">{{ house[1] | dealover }}</a></span>
                        </div>
                        <div>
                            <span class="attribute-text">房源地址:</span>
                            &nbsp
                            <span class="info-text">{{ house[9] }} </span>
                        </div>
                        <div>
                            <span class="attribute-text">建筑面积:</span>
                            &nbsp
                            <span class="info-text">{{ house[3] }}平方米</span>
                        </div>
                        <div>
                            <span class="attribute-text">房源户型:</span>
                            &nbsp
                            <span class="info-text">{{ house[2] }}</span>
                        </div>
                        <div>
                            <span class="attribute-text">房源朝向:</span>
                            &nbsp
                            <span class="info-text">{{ house[5] }}</span>
                        </div>
                        <div>
                            <span class="attribute-text">交通条件:</span>
                            &nbsp
                            <span class="info-text">{{ house[10] | dealdirection }}</span>
                        </div>

                        <div>
                        <span class="attribute-text"><i class="fa fa-heart" aria-hidden="true"
                                                        style="color: #e74c3c"></i> {{ house[16] }}人浏览过</span>
                            &nbsp
                            <span class="info-text"></span>
                        </div>

                    </div>
                </div>
                <div class="col-lg-2 col-md-2 mx-auto">
                    <div class="info-more">
                        <span class="info-text" style="color: #e74c3c">¥&nbsp{{ house[4] }}</span>
                        <span><a href="/house/{{ house.id }}"><i class="fa fa-arrow-right"
                                                                 aria-hidden="true"></i></a></span>
                    </div>
                </div>

            </div>
        {% endfor %}
    </div>

8.3 热点房源列表页展示

8.3.1 热点房源列表页功能说明

在智能租房网站中,单击首页的链接文本“更多热点房源”后,页面会跳转到热点房源列表页,该页面按照房源的浏览量(由大到小)展示了当前城市的全部房源信息。 热点房源列表页展示功能可以划分为3个功能,分别是查询所有的房源数据、分页显示和渲染列表页,其中查询所有的房源数据由后端实现,分页显示和渲染列表页由前端实现。

8.3.2 热点房源列表页的接口设计

热点房源列表页用于按浏览量由大至小的顺序展示全部的房源数据,所以请求方式为GET请求,请求页面为list.html,返回数据为包含多个房源对象的列表。

接口描述说明
请求页面list.html
请求方式GET
请求地址/list/hot_house/int:page
返回数据房源对象列表

8.3.3 热点房源列表页的后端实现

后端实现热点房源列表页具体的实现逻辑:首先需要从数据库中查询所有的房源数据,将这些房源数据按照浏览量排列,浏览量大的房源数据排在前面,浏览量小的房源数据排在后面,然后借用分页插件将排序后的数据进行分页展示。

在app.py文件编写代码,实现查询所有房源数据的功能。

# 最热房源列表页展示的功能
@app.route('/list/hot_house/<int:page>')
def return_hot_list(page):
    # 获取房源总数量
    house_num = totalNums
    # 计算总的页码数,向上取整
    total_num = math.ceil(house_num / 10)
    sql = "select * from house_info order by page_views desc limit %s,%s"
    cursor.execute(sql, (page, 10))
    result = cursor.fetchall()
    return render_template('list.html', house_list=result, page_num=page, total_num=total_num)

8.4 本章小结

本章围绕智能租房项目列表页模块的功能进行了介绍,包括搜索房源列表页展示、最新房源列表页展示和热点房源列表页展示。通过学习本章的内容,读者能够熟练地运用flask_sqlalchemy查询和操作数据表,使用分页插件实现分页效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux文本三剑客(2)

文章目录 一、Linux文本三剑客之awk使用方法awk 的原理实例一&#xff1a;只查看test.txt文件&#xff08;100行&#xff09;内第20到第30行的内容&#xff08;企业面试&#xff09;实例二&#xff1a;已知test.txt文件内容为 BEGIN 和 END 模块实例一&#xff1a;统计/etc/pas…

【单片机】简单的自定义延时程序设计(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

2、6作业

TCP和UDP的区别 TCP和UDP都是通信协议 TCP提供有连接的&#xff0c;稳定的&#xff0c;无误码无失真无乱序无丢失的通信 UDP提供无连接的&#xff0c;尽力的&#xff0c;可能误码可能乱序&#xff0c;可能丢失的通信 TCP每发一个数据包就需要对方回应一个应答包&#xff0c…

C++重新入门-C++判断语句

目录 1.if语句 嵌套 if 语句 2.switch语句 工作原理 语法 示例 3.三元运算符 示例 注意事项 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&…

Rust基础拾遗--核心功能

Rust基础拾遗 前言1.所有权与移动1.1 所有权 2.引用3.特型与泛型简介3.1 使用特型3.2 特型对象3.3 泛型函数与类型参数 4.实用工具特型5.闭包 前言 通过Rust程序设计-第二版笔记的形式对Rust相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡起来…

推荐知识付费源码,梦想贩卖机升级版

梦想贩卖机升级版&#xff0c;变现宝吸收了资源变现类产品的许多优势&#xff0c;并剔除了那些无关紧要的元素&#xff0c;使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 演示地址&#xff1a;runruncode.com/rjcx/19689.html

电商小程序03登录页面开发

目录 1 创建应用2 创建页面3 首页功能搭建4 登录页搭建5 设置叠加效果总结 小程序开发在经过需求分析和数据源设计之后&#xff0c;就可以进入到页面开发的阶段了。首先我们需要开发登录的功能。 登录功能要求用户输入用户名和密码&#xff0c;勾选同意用户协议和隐私协议&…

第77讲用户管理功能实现

用户管理功能实现 前端&#xff1a; views/user/index.vue <template><el-card><el-row :gutter"20" class"header"><el-col :span"7"><el-input placeholder"请输入用户昵称..." clearable v-model"…

JVM-类加载器 双亲委派机制

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&a…

Peter算法小课堂—背包问题

我们已经学过好久好久的动态规划了&#xff0c;动态规划_Peter Pan was right的博客-CSDN博客 那么&#xff0c;我用一张图片来概括一下背包问题。 大家有可能比较疑惑&#xff0c;优化决策怎么优化呢&#xff1f;答案是&#xff0c;滚动数组&#xff0c;一个神秘而简单的东西…

AI:125-基于深度学习的航拍图像中地物变化检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

uniapp vue3怎么调用uni-popup组件的this.$refs.message.open() ?

vue2代码 <!-- 提示信息弹窗 --><uni-popup ref"message" type"message"><uni-popup-message :type"msgType" :message"messageText" :duration"2000"></uni-popup-message></uni-popup>typ…

【集合系列】TreeMap 集合

TreeMap 集合 1. 概述2. 方法3. 遍历方式4. 排序方式5. 代码示例16. 代码示例27. 代码示例38. 注意事项9. 源码分析 其他集合类 父类 Map 集合类的遍历方式 TreeSet 集合 具体信息请查看 API 帮助文档 1. 概述 TreeMap 是 Java 中的一个集合类&#xff0c;它实现了 SortedMap…

ChatGPT高效提问—prompt常见用法(续篇九)

ChatGPT高效提问—prompt常见用法(续篇九) ​ 如何准确地向大型语言模型提出问题,使其更好地理解我们的意图,从而得到期望的答案呢?编写有效的prompt的技巧,精心设计的prompt,获得期望的的答案。 1.1 增加条件 ​ 在各种prompt技巧中,增加条件是最常用的。在prompt中…

人工智能之大数定理和中心极限定理

大数定律 大数定律&#xff1a;是一种描述当试验次数很大时所呈现的概率性致的定律&#xff0c;由概率统计定义“频率收敛于概率”引申而来。换而言之&#xff0c;就是n个独立分布的随机变量其观察值的均值依概率收敛于这些随机变量所属分布的理论均值&#xff0c;也就是总体均…

精读《js 模块化发展》

1 引言 如今&#xff0c;Javascript 模块化规范非常方便、自然&#xff0c;但这个新规范仅执行了 2 年&#xff0c;就在 4 年前&#xff0c;js 的模块化还停留在运行时支持&#xff0c;10 年前&#xff0c;通过后端模版定义、注释定义模块依赖。对经历过来的人来说&#xff0c;…

区间dp 笔记

区间dp一般是先枚举区间长度&#xff0c;再枚举左端点&#xff0c;再枚举分界点&#xff0c;时间复杂度为 环形石子合并 将 n 堆石子绕圆形操场排放&#xff0c;现要将石子有序地合并成一堆。 规定每次只能选相邻的两堆合并成新的一堆&#xff0c;并将新的一堆的石子数记做该…

qt学习:串口

头文件 #include <QSerialPort> #include <QSerialPortInfo> 模块 QT core gui serialport 编程步骤 配置一个ui界面&#xff0c;五个QComboBox和一个按钮和一个QTextEdit 添加一个成员 private:QSerialPort *serial; 在构造函数中初始化ui端口列表和…

【数据结构和算法】--- 基于c语言排序算法的实现(2)

目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想&#xff1a…

hexo 博客搭建以及踩雷总结

搭建时的坑 文章置顶 安装一下这个依赖 npm install hexo-generator-topindex --save然后再文章的上面设置 top: number&#xff0c;数字越大&#xff0c;权重越大&#xff0c;也就是越靠顶部 hexo 每次推送 nginx 都访问不到 宝塔自带的 nginx 的 config 里默认的角色是 …