该Flask项目历时3天,开发小组6人,目的是开发一个租房web项目,该项目采用前后端分离模式。

Flask租房项目总结

  1. 分析需求文档,需要完成的功能模块有:

    • 登陆注册

    • 首页展示,首页搜索

    • 详情展示,订单预定

    • 个人中心的用户信息修改

    • 我的订单展示,客户订单展示

    • 我的房源,上传图片和实名认证

  2. 该项目是前后端分离的项目,后端需要根据接口文档的要求,对数据库进行增加,修改,删除,查询的操作

  3. 根据需求分析E-R图,为构建模型类做准备:

    1. 模型类构建完毕,进行数据库迁移和测试数据的添加

    2. 小组项目分工,将项目分为6个模块,每个模块相对独立,小组成员独立完成。每过半日,进行临时小组会议,汇报进度和遇到的问题。

    3. 项目中犯的错误:

      • 没有严格按照接口文档的url路径写接口。比如接口路径:/api/v1.0/houses/<int:house_id>,为了方便在Blueprint中添加了url_preifx=/api/v1.0/,导致前端静态文件路径出错,不得不修改前端路径,犯了大忌。当然也可以创建2个蓝图对象来解决问题,一个用来返回静态资源,一个用来做视图函数,以下采取这种方法。

      • 测试功能时,因为客户订单没有数据,误以为代码有bug,在客户订单接口上花费太长时间。

      • 项目分工不合适,组内成员代码水平差异大,导致工作压力不均衡。

      • 没有写任何单元测试。

    4. 项目遇到的bug:

      • avtar_url网址返回给前端时没有加上七牛云地址

      • query抄写为quary

      • 时间单位直接相减

      • 返回数据格式不正确等

    5. 项目逻辑实现:

      1. 创建蓝图对象,为了返回静态资源和视图函数:

        • # 1. 创建蓝图
          html_blu = Blueprint("html", __name__)

          # 访问静态文件
          @html_blu.route('/<path:file_name>')
          def get_html_file(file_name):
            # 判断是否是网站的Logo,如果不是,添加前缀
            if file_name != "favicon.ico":
                file_name = "html/" + file_name
            return current_app.send_static_file(file_name)
        • # 创建 /api/v1.0 接口的蓝图
          api_blu = Blueprint("api", __name__, url_prefix="/api/v1.0")
      2. 注册:

        • 获取前端发送的UUID

        • 借助captcha生成图片验证码,储存在redis中

        • 返回带有图片验证码的响应体对象

        • 前端点击发送短信验证码,获取前端发送的UUID,image_code,mobile

        • 检验数据,使用UUID取出验证码和image_code做对比

        • 借助云通讯发送短信,将短信内容sms_code存储在redis中

        • 前端点击注册按钮,获取前端发送的mobile,sms_code,password

        • 检验数据,对比sms_code和redis中存储短信内容

        • 初始化user模型对象,添加一条新的用户记录

        • 实现状态保持

      3. 登录/退出登录:

        • 获取mobile,password参数,检验参数

        • 查询对应的用户对象,实现状态保持

        • 退出登录即是清除session中存储的状态保持

      4. 我发布的房屋列表:

        • 获取登录的user_id

        • 查询用户所有的房屋对象,返回房屋信息

      5. 发布房源/上传房源图片

        • 获取前端发送的参数,并做参数校检

        • 在房屋-设施多对多关系表添加记录

          house.facilities.append(facility_list)
        • 保存house模型对象到数据库

        • 获取前端发送的图片,根据house_id判断房屋是否存在

        • 上传图片在七牛云储存

        • 房屋图片表存储图片相对地址,返回数据

      6. 首页展示内容:

        • 以订单量降序的方式查询房屋

          houses = House.query.order_by(House.order_count.desc()).limit(constants.HOME_PAGE_MAX_HOUSES).all()

          houses_list = [house.to_basic_dict() for house in houses]
      7. 搜索房屋列表

        • 获取前端参数:aid,start_time,end_time,sort_key,page

        • 参数检验,结束时间要大于开始时间

        • 查询对象和增加过滤条件

          house_query = House.query
          filters = []
          filters.append(House.area_id == area_id)
        • 过滤已预定的房屋

          conflict_order = Order.query.filter(Order.begin_date<=end_date, Order.end_date>=start_date).all()

          conflict_house_id = [order.house_id for order in conflict_order]

          filters.append(House.id.notin_(conflict_house_id))
        • 根据筛选条件进行排序

          house_query = house_query.
          filter(*[filters]).order_by(House.order_count.desc())
        • 进行分页展示,返回数据

          paginate = house_query.
          paginate(int(page),constants.HOUSE_LIST_PAGE_CAPACITY, False)
          houses = paginate.items
          total_page = paginate.pages
      8. 下单/预定房间

        • 获取参数user_id,house_id,start_date,end_date,检验参数

        • 查询房屋对象是否存在,判断用户是否是房东,判断房屋是否有冲突订单

          filters = [Order.house_id == house_id, 
                Order.begin_date < end_date, Order.end_date > begin_date]
          count = Order.query.filter(*filters).count()
        • 生成订单模型,存储在order表,返回结果

      9. 获取订单列表

        • 获取当前角色标识,[custom,landlord]

        • 房客订单查询

          orders = Order.query.filter(Order.user_id 
          == user_id).order_by(Order.create_time.desc()).all()
        • 房东订单查询

          houses = House.query.filter(House.user_id == user_id).all()

          houses_id = [house.id for house in houses]

          orders = Order.query.filter(Order.house_id in_(houses_id)).filter_by(Order.create_time.desc()).all()
      10. 接单/拒单/评论订单(略)

      11. 用户中心(略)

      12. 项目注意点:

        • 大量的参数检验,不同功能模块,前端、后端内都要进行参数检验,保证参数准确性。

        • 通过将每一次查询后的结果储存在redis中可以提高用户下次查询相同结果的效率,能够提高用户体验。

Flask租房项目总结的更多相关文章

  1. 巡风代码架构简介以及Flask的项目文件结构简介

    一.巡风: 巡风是一款什么东西,想必安全同行都不陌生吧.用它作为内网漏洞扫描管理架构是一种很好的选择,扫描快,开源,还可自己编写符合规则的POC直接放入相应目录来扩展.今天下午趁着有点时间捋了一下巡风 ...

  2. Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验

    (一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...

  3. Flask大型项目框架结构理解

    导语:前段时间学习狗书的flask大型项目框架结构的时候有点混乱,到现在也知道是个啥了,想着,把关系理一理,写一篇博客.也方便后来学习的人查阅.以下是我创建项目时候的结构. myproject --- ...

  4. Python之Flask框架项目Demo入门

    Python+Flask框架项目Demo入门 本例子用到了 Flask+蓝图+Flask-Login+SQLAlchemy+WTForms+PyMySQL相关架构 Flask Web框架介绍 Flas ...

  5. JavaEE在职加薪课好客租房项目实战视频教程

    JavaEE在职加薪课好客租房项目实战视频教程课程介绍:       本课程采用SOA架构思想进行设计,基于目前主流后端技术框架SpringBoot.SpringMVC.Mybaits.Dubbo等来 ...

  6. 【Flask】 项目结构说明

    项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和Django这种框架又不一样,Fl ...

  7. Flask速成项目:Flask实现计算机资源的实时监控

    很多人都说使用Python开发WEB应用非常方便,那么对于WEB新手来说,到底有多方便呢?本文即将展示给你Python的魔法. 本文将通过一个实例:Flask实现计算机资源的实时监控,迅速带你入门Fl ...

  8. Flask之项目配置,目录构建,闪现

    综合案例:学生成绩管理 新建项目目录students,并创建虚拟环境 mkvirtualenv students 安装开发中使用的依赖模块 pip install flask==0.12.4pip i ...

  9. Flask之项目创建,路由以及会话控制

    Flask Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎 ...

随机推荐

  1. 线程间的通信方式2--管道流Pipes

    “管道”是java.io包的一部分.它是Java的特性,而不是Android特有的.一条“管道”为两个线程建立一个单向的通道.生产者负责写数据,消费者负责读取数据. 下面是一个使用管道流进行通信的例子 ...

  2. 精华阅读第 12 期 | 最新 App Store 审核指南与10大被拒理由?

    很多时候,我们对技术的追求是没有止境的,我们需要不断的学习,进步,再学习,再进步!本文系移动精英开发俱乐部的第12期文章推荐阅读整理,其中涉及到了 Android 数据库框架,架构设计中的循环引用,同 ...

  3. Java对于表达式中的自动类型提升

    1 表达式中的自动类型提升: 表达式求值时,Java自动的隐含的将每个byte.short或char操作数提升为int类型,这些类型的包装类型也是可以的. 例如: short s1 = 1; s1 = ...

  4. 【转】Kettle发送邮件步骤遇到附件名是中文名变成乱码的问题解决办法

    原文:http://www.ukettle.org/thread-607-1-1.html 本帖最后由 大白菜 于 2016-3-7 10:18 编辑 导语:看到群里很多朋友问Kettle发送邮件附件 ...

  5. MySQL Group Replication配置

    MySQL Group Replication简述 MySQL 组复制实现了基于复制协议的多主更新(单主模式). 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事 ...

  6. InputStream转换为String, byte[] data = new byte[1024]详解

    /** * This file created at 2018年2月28日. * * Copyright (c) 2002-2018 Bingosoft, Inc. All rights reserv ...

  7. iOS设计模式 - 享元

    iOS设计模式 - 享元 原理图 说明 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件.通常物件中的部分 ...

  8. 通过nginx 访问 centos 7 服务器上的.Net Core

    先安装依赖 # yum -y install pcre-devel openssl openssl-devel # yum -y install gcc gcc-c++ autoconf automa ...

  9. Xman资格选拔赛-web

    variacover 这道题一打开就是源码,主要就是根据源码构造url.其中,它接收的参数只有b,但源码中要获取flag的关键参数是a[0].parse_str()函数的作用是把查询字符串解析到变量中 ...

  10. YBB.DBUtils用法

    通用数据访问类库,兼容ADO.ADO.NET方式访问. 利用ProviderFactory工厂方法,支持Oracle(不需要安装客户端).SQL Server.OleDb和ODBC等数据库访问. ht ...