zoukankan      html  css  js  c++  java
  • Flask租房项目总结

    该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中可以提高用户下次查询相同结果的效率,能够提高用户体验。

          •  

  • 相关阅读:
    pgloader 学习(七) 从归档文件加载数据
    pgloader 学习(六) 加载csv 数据
    pgloader 学习(五)pgloader 参考手册
    pgloader 学习(四)一些简单操作例子
    pgloader 学习(三)快速使用
    pgloader 学习(二)特性矩阵&&命令行
    pgloader 学习(一)支持的特性
    使用readthedocs 发布 sphinx doc文档
    pgloader 方便的数据迁移工具
    circus && web comsole docker-compose 独立部署web console 的一个bug
  • 原文地址:https://www.cnblogs.com/CodeWorkerMan/p/10447660.html
Copyright © 2011-2022 走看看