Flask 二手房项目作业说明

准备

  1. 课程资料中下载python大作业压缩包。
  2. house.sql 导入本地 MySQL(库名 house),注意配置好你自己的电脑数据库与密码。
  3. 项目根目录已提供 app.pysettings.pymodels.pyutils/已经写好的内容无需修改

备注

  • utils/pearson_recommend.pyutils/regression_data.py 已给完整代码,直接 from utils.xxx import xxx 调用即可。
  • 所有视图文件请保留函数签名、注释和返回值结构,仅补全函数体内 # TODO 处的代码。

作业一:首页(验证: 访问 /

📌 功能需求

网站首页展示平台上现在有多少套房、最新挂牌的 6 套、当前浏览量最高的 4 套
在搜索框打字时,希望系统能根据我当前选的搜索类型(地区 / 户型)实时联想匹配项,比如选了”户型搜索”输个”2室”,下面就弹出”2室1厅 N 套””2室2厅 N 套”。
首页要做到:快、全、准。”


要求:在根目录新建 index_page.py,并补全两个视图函数体。

  1. app.py 中以 url_prefix='/' 注册 index_page 蓝图(app.py 已写好 import)。

  2. index_page.py 中实现:

    • GET / :查询并传递”总房源数 + 最新房源 TOP6 + 热点房源 TOP4”给 index.html
    • POST /search/keyword/ :接收 kwinfo'地区搜索''户型搜索'),按所选字段聚合查询前 9 条,返回 JSON {code:1, info:[{t_name, num}, ...]}
  3. 需要补全的位置(文件中已用 # TODO 题目一 标记):

    • 第 1 处:index() 函数体内 3 行查询(总房源数、最新 TOP6、最热 TOP4)。
    • 第 2 处:search_kw() 函数体内聚合查询与 JSON 返回。
    • 第 3 处:index.html 中 AJAX 联想的 success 回调函数体(约 15 行 jQuery DOM 操作)。
  4. 验证:启动服务,浏览器访问 http://127.0.0.1:5000/。首页能看到”最新房源””热点房源”卡片即为正确;在搜索框输入文字时下拉出现联想项即为正确。

  5. 提交:index_page.py 全代码截图 + index.html 截图(AJAX 回调部分)+ 首页运行截图及搜索功能运行图。


作业二:列表页(验证:直接访问 /list/pattern/1

📌 功能需求

点击首页的’更多地区房源’或’更多热点房源’会进到完整列表页每页只显示 10 套,有分页功能。
另外在首页搜索框点了某条联想项,回车查询后也要跳到一个搜索结果页,把搜的地区/户型下所有符合的房源列出来。
还有两个细节——标题超过 15 个字的要用 ... 截断(列表页面看着不拥挤),**朝向如果是空的不要显示空白,写’暂无信息’**(用户不会以为是 bug)。”


要求:在根目录新建 list_page.py,并补全三个视图函数与两个自定义过滤器。

  1. app.py 中注册 list_page 蓝图。

  2. list_page.py 中实现:

    • GET /query :接收 addrrooms 参数,渲染 search_list.html
    • GET /list/pattern/<int:page> :按发布时间倒序分页(per_page=10),渲染 list.html
    • GET /list/hot_house/<int:page> :按浏览量倒序分页,渲染 list.html
  3. 注册两个自定义模板过滤器:

    • dealover :标题超过 15 字符末尾替换为 ...
    • dealdirection :朝向为空时显示”暂无信息”。
  4. 需要补全的位置(文件中已用 # TODO 题目二 标记):

    • 第 1 处:search_txt_info() 函数体(按 addr/rooms 过滤查询)。
    • 第 2 处:return_new_list() 函数体(paginate 分页调用)。
    • 第 3 处:return_hot_list() 函数体(paginate 分页调用)。
    • 第 4 处:deal_title_over()deal_direction() 两个过滤器函数体。
    • 第 5 处:两个 add_app_template_filter 注册调用。
    • 第 6 处:list.htmlcreatePage 分页器初始化 JS(约 15 行 jQuery)。
  5. 验证

    • 浏览器访问 http://127.0.0.1:5000/list/pattern/1,能看到房源列表与分页器。
    • 访问 http://127.0.0.1:5000/list/hot_house/1,标题超过 15 字符自动加 ...
    • 访问 http://127.0.0.1:5000/query?addr=xxx(替换为数据库中的小区名),能看到搜索结果。
  6. 提交:list_page.py 全代码截图 + list.html 截图(分页器部分)+ search_list.html 截图。


作业三:详情页(验证:直接访问 /house/1

📌 功能需求

在列表上点了某个房子,跳到详情页。这个页面要完整告诉我这套房的情况——基本信息(户型、朝向、面积、楼层、交通、房东电话等)+ 配套设施(哪些有、哪些没有)。配套设施用图标 + 文字展示,有的高亮,没的用删除线,一眼看出。
下面再推荐几套类似或同小区的房子——如果我已经登录,平台应该根据之前的浏览历史给用户推荐;如果没登录或者推荐不出来,就直接给用户同小区浏览量最高的 6 套当备选。
右侧有几个图表看这个小区的情况(户型占比、价格走势等),这部分需要写好 JS,Python调用接口看效果”


要求:在根目录新建 detail_page.py,并补全主视图函数体;模板中挖空配套设施图标与推荐循环。

  1. app.py 中注册 detail_page 蓝图。

  2. detail_page.py 中实现:

    • GET /house/<int:hid>
      ① 查询当前房源详情
      ② 调用 utils.pearson_recommend.recommend(user_id, hid) 获取推荐(已给完整函数,直接 import
      ③ 推荐为空或用户未登录时,降级查询同小区按 page_views 倒序前 6
      ④ 渲染 detail_page.html,传递 housefacilitiesrecommend_li
  3. templates/detail_page.html 中补全:

    • 9 个配套设施图标的 {% if '设施名' in facilities %} 模板判断(洗衣机、电视、空调、暖气、热水器、天然气、床、宽带、电梯;”冰箱”已给出示例)。
    • 推荐房源 {% for house in recommend_li %} 循环(约 15 行 Jinja)。
    • 4 个 ECharts 图标 AJAX 调用(约 25 行 jQuery)。
  4. 需要补全的位置(文件中已用 # TODO 题目三 标记):

    • 第 1 处:detail_page.pydetail() 函数体内推荐/降级逻辑(约 10 行)。
    • 第 2 处:detail_page.html 的 9 个设施图标 {% if %} 模板判断(每个 5 行,已用 `` Jinja 注释标出位置)。
    • 第 3 处:detail_page.html 推荐房源 {% for %} 循环(约 15 行)。
    • 第 4 处:detail_page.html 的 4 个 ECharts AJAX 调用(约 25 行 jQuery,分别调用 /get/piedata/get/columndata/get/scatterdata/get/brokenlinedata,后端接口已在 detail_page.py 写好)。。
  5. 验证

    • 浏览器访问 http://127.0.0.1:5000/house/1(前提:数据库 house_info 表中存在 id=1 的房源;如不存在可换成其他 id)。
    • 页面正确显示房源标题、价格、朝向等基本信息。
    • 配套设施图标:有该设施时为黄色高亮,无该设施时为删除线灰色。
    • 推荐房源区域显示同小区 6 条记录(用户未登录或无推荐时走降级逻辑)。
    • 右侧 4 个 ECharts 图表正常加载(饼图、柱状图、折线图、回归预测图)。
  6. 提交:detail_page.py 全代码截图 + detail_page.html 截图。