当前位置: 首页 > news >正文

基于 Python Django 框架的在线租房管理系统设计与实现

摘要

本研究针对传统租房管理模式存在的信息不透明、流程繁琐、效率低下等问题,设计并实现了一个基于 Python Django 框架的在线租房管理系统。系统采用 B/S 架构,整合了房源管理、租客管理、租赁合同管理、租金支付、评价反馈等功能模块,实现了租房业务的全流程数字化管理。系统前端使用 Bootstrap 框架构建响应式界面,后端采用 Django REST framework 提供 API 服务,数据库使用 MySQL 存储业务数据。通过实际应用验证,系统具有良好的稳定性、可扩展性和用户体验,能够有效提高租房管理效率,降低管理成本。

1. 引言

1.1 研究背景与意义

随着城市化进程的加速和人口流动的加剧,租房市场规模不断扩大。根据相关统计数据,我国租房人口已超过 2 亿,年租金规模超过 2 万亿元。传统的租房管理模式主要依赖线下中介和人工操作,存在信息不透明、流程繁琐、效率低下等问题,难以满足现代租房市场的需求。

互联网技术的发展为租房市场带来了新的机遇。在线租房平台通过整合房源信息、简化租房流程、提供在线支付等功能,为房东和租客提供了更加便捷、高效的租房体验。然而,目前市场上的在线租房平台存在功能不完善、用户体验差、数据安全隐患等问题,需要进一步改进和完善。

本研究旨在设计并实现一个基于 Python Django 框架的在线租房管理系统,通过整合房源管理、租客管理、租赁合同管理、租金支付、评价反馈等功能模块,实现租房业务的全流程数字化管理。系统将为房东提供便捷的房源管理工具,为租客提供丰富的房源信息和安全的租房体验,为租房中介提供高效的业务管理平台,具有重要的现实意义。

1.2 国内外研究现状

国外在在线租房平台的研究和应用方面起步较早,已经形成了较为成熟的商业模式和技术体系。例如,美国的 Zillow、Trulia、Airbnb 等平台,通过整合海量房源信息、提供个性化推荐、支持在线支付等功能,成为了全球知名的在线租房平台。这些平台采用了先进的信息技术,如大数据分析、人工智能、区块链等,提高了租房效率和用户体验。

国内在线租房平台的发展也十分迅速,涌现出了链家、自如、贝壳找房、房天下等知名平台。这些平台在房源信息整合、租房流程优化、用户体验提升等方面取得了显著成效。例如,贝壳找房采用了 VR 看房、在线签约等新技术,提高了租房效率和用户体验;自如推出了 "省心租" 服务,为房东提供了一站式的房源管理解决方案。

然而,目前国内外在线租房平台仍存在一些问题,如房源信息真实性难以保证、用户信息安全存在隐患、平台盈利模式单一等。此外,随着租房市场的不断发展,用户对租房平台的功能和服务提出了更高的要求,需要进一步加强技术创新和服务创新。

1.3 研究内容与方法

本研究的主要内容包括:

  1. 系统需求分析:通过问卷调查、访谈等方式,了解房东、租客和租房中介的需求,明确系统的功能和性能要求。

  2. 系统设计:包括系统架构设计、数据库设计、功能模块设计等,确定系统的技术选型和实现方案。

  3. 系统实现:基于 Python Django 框架实现系统的各个功能模块,包括用户认证、房源管理、租客管理、租赁合同管理、租金支付、评价反馈等。

  4. 系统测试:对系统进行功能测试、性能测试、安全测试等,确保系统的稳定性和可靠性。

  5. 系统部署与应用:将系统部署到生产环境中,进行实际应用验证,评估系统的使用效果和用户满意度。

本研究采用的研究方法包括:

  1. 文献研究法:查阅国内外相关文献,了解在线租房平台的研究现状和发展趋势,为系统设计提供理论支持。

  2. 问卷调查法:通过问卷调查的方式,了解房东、租客和租房中介的需求和意见,为系统功能设计提供依据。

  3. 案例分析法:分析国内外知名在线租房平台的成功案例,借鉴其设计思路和实现方法,为本系统的设计和实现提供参考。

  4. 实验研究法:通过实验对比不同的技术方案和算法,选择最优的方案和算法,提高系统的性能和用户体验。

2. 系统需求分析

2.1 功能需求

通过对房东、租客和租房中介的需求调研,确定系统的主要功能需求如下:

  1. 用户管理功能

    • 用户注册、登录、信息修改
    • 用户角色管理(房东、租客、管理员)
    • 用户权限控制
  2. 房源管理功能

    • 房源信息发布、编辑、删除
    • 房源信息审核
    • 房源信息搜索、筛选、排序
    • 房源信息展示(包括图片、视频、文字描述等)
    • 房源收藏、分享
  3. 租客管理功能

    • 租客信息登记、查看、修改
    • 租客租房申请提交、审核
    • 租客租房历史记录查询
  4. 租赁合同管理功能

    • 租赁合同生成、签署
    • 租赁合同查看、修改、终止
    • 租赁合同提醒(到期提醒、续约提醒等)
  5. 租金支付功能

    • 租金计算、生成支付订单
    • 支持多种支付方式(微信支付、支付宝、银行卡等)
    • 租金支付记录查询
    • 租金逾期提醒
  6. 评价反馈功能

    • 租客对房源和房东进行评价
    • 房东对租客进行评价
    • 评价信息展示和管理
    • 用户反馈提交和处理
  7. 统计分析功能

    • 房源出租率统计
    • 租金收入统计
    • 用户活跃度统计
    • 热门房源分析
2.2 非功能需求
  1. 性能需求

    • 系统响应时间应满足用户操作要求,一般查询操作响应时间不超过 3 秒,复杂操作响应时间不超过 10 秒
    • 系统应支持至少 1000 个并发用户同时在线操作
    • 系统应能够处理大量数据,保证数据的完整性和一致性
  2. 安全性需求

    • 系统应保证用户数据的安全性和隐私性,严格遵守相关法律法规
    • 用户密码应进行加密存储,防止密码泄露
    • 系统应具备完善的访问控制机制,防止非法访问和操作
    • 系统应具备数据备份和恢复机制,防止数据丢失
  3. 可用性需求

    • 系统应具备良好的用户界面和操作体验,使用户能够轻松上手
    • 系统应提供完善的帮助文档和在线客服,解答用户疑问
    • 系统应具备高可用性,保证每天 24 小时不间断运行
  4. 可扩展性需求

    • 系统应具备良好的可扩展性,能够方便地添加新的功能模块
    • 系统应支持数据量和用户数的不断增长,能够通过集群化部署实现性能提升
  5. 兼容性需求

    • 系统应支持主流浏览器(Chrome、Firefox、Safari、Edge 等)
    • 系统应支持多种操作系统(Windows、MacOS、Linux 等)
    • 系统应支持移动端访问,提供良好的移动用户体验

3. 系统总体设计

3.1 系统架构设计

本系统采用 B/S(浏览器 / 服务器)架构,将整个系统分为客户端、应用服务器和数据库服务器三个层次。系统的总体架构如图 1 所示

图 1:系统总体架构图

  • 客户端:负责与用户交互,接收用户请求并展示系统响应结果。客户端可以是 Web 浏览器或移动应用。

  • Web 服务器:负责处理 HTTP 请求,静态资源的存储和分发,以及负载均衡。本系统使用 Nginx 作为 Web 服务器。

  • 应用服务器:是系统的核心,负责处理业务逻辑和数据处理。应用服务器基于 Python Django 框架构建,提供 RESTful API 接口,实现与客户端的通信。应用服务器还包括任务队列和缓存服务,用于处理异步任务和提高系统性能。

  • 数据库服务器:负责存储系统的所有数据,包括用户信息、房源信息、租赁合同信息、租金支付信息等。本系统使用 MySQL 作为主要数据库,Redis 作为缓存数据库,Elasticsearch 作为搜索引擎。

3.2 系统部署架构设计

系统部署架构采用分布式集群部署方式,以确保系统的高可用性和扩展性。系统部署架构如图 2 所示。

图 2:系统部署架构图

  • 负载均衡器:采用 Nginx 或 HAProxy 实现,负责将用户请求分发到多个 Web 服务器,实现负载均衡和高可用性。

  • Nginx 服务器集群:部署多个 Nginx 服务器,处理 HTTP 请求和静态资源的分发。

  • 应用服务器集群:部署多个 Django 应用服务器,处理业务逻辑和数据处理。应用服务器之间通过消息队列进行异步通信。

  • 消息队列:采用 RabbitMQ 或 Kafka 实现,用于处理异步任务,如邮件发送、短信通知等。

  • 任务处理服务器集群:部署多个任务处理服务器,处理消息队列中的任务。

  • 数据库集群:采用 MySQL 主从复制或集群技术,实现数据的高可用性和读写分离。

  • 缓存集群:部署多个 Redis 服务器,实现数据缓存,提高系统性能。

  • 搜索集群:部署 Elasticsearch 集群,实现房源信息的快速搜索和筛选。

  • 监控系统:采用 Prometheus 和 Grafana 实现,对系统的各个组件进行实时监控和性能分析,确保系统的稳定运行。

3.3 系统用例图设计

系统用例图描述了系统与用户之间的交互关系,展示了系统的功能边界和用户角色。系统用例图如图 3 所示。

图 3:系统用例图

3.4 数据库设计

根据系统需求,设计了以下主要数据表:

  1. 用户表 (User):存储系统用户的基本信息,包括用户 ID、用户名、密码、角色、联系方式等。

  2. 房东表 (Landlord):存储房东的详细信息,包括房东 ID、用户 ID、身份证号、实名认证状态等。

  3. 租客表 (Tenant):存储租客的详细信息,包括租客 ID、用户 ID、身份证号、工作信息等。

  4. 房源表 (House):存储房源的基本信息,包括房源 ID、房东 ID、房源类型、地址、面积、租金、配套设施等。

  5. 房源图片表 (HouseImage):存储房源的图片信息,包括图片 ID、房源 ID、图片路径等。

  6. 租房申请表 (RentalApplication):存储租客的租房申请信息,包括申请 ID、租客 ID、房源 ID、申请时间、申请状态等。

  7. 租赁合同表 (RentalContract):存储租赁合同的详细信息,包括合同 ID、房东 ID、租客 ID、房源 ID、租赁期限、租金金额、支付方式等。

  8. 租金支付表 (RentPayment):存储租金支付的详细信息,包括支付 ID、合同 ID、支付金额、支付时间、支付状态等。

  9. 评价表 (Review):存储用户的评价信息,包括评价 ID、评价人 ID、被评价人 ID、房源 ID、评价内容、评分等。

  10. 收藏表 (Collection):存储用户的收藏信息,包括收藏 ID、用户 ID、房源 ID、收藏时间等。

数据库表结构详细设计如下:

sql

-- 用户表
CREATE TABLE `user` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '用户ID',`username` VARCHAR(50) NOT NULL COMMENT '用户名',`password` VARCHAR(100) NOT NULL COMMENT '密码',`role` TINYINT NOT NULL COMMENT '角色(1:管理员,2:房东,3:租客)',`name` VARCHAR(50) DEFAULT NULL COMMENT '姓名',`phone` VARCHAR(20) DEFAULT NULL COMMENT '电话',`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',`avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:禁用,1:启用)',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_username` (`username`),UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';-- 房东表
CREATE TABLE `landlord` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '房东ID',`user_id` INT NOT NULL COMMENT '用户ID',`id_card` VARCHAR(20) DEFAULT NULL COMMENT '身份证号',`id_card_front` VARCHAR(255) DEFAULT NULL COMMENT '身份证正面',`id_card_back` VARCHAR(255) DEFAULT NULL COMMENT '身份证背面',`real_name_status` TINYINT NOT NULL DEFAULT 0 COMMENT '实名认证状态(0:未认证,1:认证中,2:已认证,3:认证失败)',`bank_account` VARCHAR(50) DEFAULT NULL COMMENT '银行账户',`bank_name` VARCHAR(50) DEFAULT NULL COMMENT '银行名称',`bank_branch` VARCHAR(50) DEFAULT NULL COMMENT '开户行',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_user_id` (`user_id`),UNIQUE KEY `idx_id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='房东表';-- 租客表
CREATE TABLE `tenant` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '租客ID',`user_id` INT NOT NULL COMMENT '用户ID',`id_card` VARCHAR(20) DEFAULT NULL COMMENT '身份证号',`id_card_front` VARCHAR(255) DEFAULT NULL COMMENT '身份证正面',`id_card_back` VARCHAR(255) DEFAULT NULL COMMENT '身份证背面',`real_name_status` TINYINT NOT NULL DEFAULT 0 COMMENT '实名认证状态(0:未认证,1:认证中,2:已认证,3:认证失败)',`company` VARCHAR(100) DEFAULT NULL COMMENT '公司名称',`job_title` VARCHAR(50) DEFAULT NULL COMMENT '职位',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_user_id` (`user_id`),UNIQUE KEY `idx_id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租客表';-- 房源表
CREATE TABLE `house` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '房源ID',`landlord_id` INT NOT NULL COMMENT '房东ID',`title` VARCHAR(100) NOT NULL COMMENT '标题',`type` TINYINT NOT NULL COMMENT '房源类型(1:整租,2:合租)',`bedroom_num` TINYINT NOT NULL COMMENT '卧室数量',`living_room_num` TINYINT NOT NULL COMMENT '客厅数量',`bathroom_num` TINYINT NOT NULL COMMENT '卫生间数量',`area` DECIMAL(5,2) NOT NULL COMMENT '面积(平方米)',`floor` VARCHAR(20) NOT NULL COMMENT '楼层',`total_floor` TINYINT NOT NULL COMMENT '总楼层',`orientation` VARCHAR(20) DEFAULT NULL COMMENT '朝向',`decoration` VARCHAR(20) DEFAULT NULL COMMENT '装修',`rent` DECIMAL(10,2) NOT NULL COMMENT '租金',`payment_method` TINYINT NOT NULL COMMENT '支付方式(1:押一付一,2:押一付三,3:押一付六,4:押一付十二)',`address` VARCHAR(255) NOT NULL COMMENT '地址',`city` VARCHAR(50) NOT NULL COMMENT '城市',`district` VARCHAR(50) NOT NULL COMMENT '区域',`community` VARCHAR(100) NOT NULL COMMENT '小区',`longitude` DECIMAL(10,6) NOT NULL COMMENT '经度',`latitude` DECIMAL(10,6) NOT NULL COMMENT '纬度',`description` TEXT DEFAULT NULL COMMENT '描述',`facilities` TEXT DEFAULT NULL COMMENT '配套设施',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:下架,1:上架,2:已出租)',`is_verified` TINYINT NOT NULL DEFAULT 0 COMMENT '审核状态(0:未审核,1:已审核)',`view_count` INT NOT NULL DEFAULT 0 COMMENT '浏览次数',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_landlord_id` (`landlord_id`),KEY `idx_city_district` (`city`,`district`),KEY `idx_rent` (`rent`),KEY `idx_area` (`area`),KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='房源表';-- 房源图片表
CREATE TABLE `house_image` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '图片ID',`house_id` INT NOT NULL COMMENT '房源ID',`image_url` VARCHAR(255) NOT NULL COMMENT '图片URL',`is_cover` TINYINT NOT NULL DEFAULT 0 COMMENT '是否封面(0:否,1:是)',`sort` INT NOT NULL DEFAULT 0 COMMENT '排序',`create_time` DATETIME NOT NULL COMMENT '创建时间',PRIMARY KEY (`id`),KEY `idx_house_id` (`house_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='房源图片表';-- 租房申请表
CREATE TABLE `rental_application` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '申请ID',`tenant_id` INT NOT NULL COMMENT '租客ID',`house_id` INT NOT NULL COMMENT '房源ID',`apply_time` DATETIME NOT NULL COMMENT '申请时间',`expected_start_date` DATE NOT NULL COMMENT '期望入住时间',`expected_duration` INT NOT NULL COMMENT '期望租赁时长(月)',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:待处理,2:已接受,3:已拒绝,4:已取消)',`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',`handle_time` DATETIME DEFAULT NULL COMMENT '处理时间',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_tenant_id` (`tenant_id`),KEY `idx_house_id` (`house_id`),KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租房申请表';-- 租赁合同表
CREATE TABLE `rental_contract` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '合同ID',`landlord_id` INT NOT NULL COMMENT '房东ID',`tenant_id` INT NOT NULL COMMENT '租客ID',`house_id` INT NOT NULL COMMENT '房源ID',`contract_no` VARCHAR(50) NOT NULL COMMENT '合同编号',`start_date` DATE NOT NULL COMMENT '开始日期',`end_date` DATE NOT NULL COMMENT '结束日期',`rent` DECIMAL(10,2) NOT NULL COMMENT '租金',`deposit` DECIMAL(10,2) NOT NULL COMMENT '押金',`payment_method` TINYINT NOT NULL COMMENT '支付方式(1:押一付一,2:押一付三,3:押一付六,4:押一付十二)',`payment_cycle` TINYINT NOT NULL COMMENT '支付周期(1:月付,2:季付,3:半年付,4:年付)',`next_payment_date` DATE DEFAULT NULL COMMENT '下次支付日期',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:生效中,2:已结束,3:已终止)',`contract_file` VARCHAR(255) DEFAULT NULL COMMENT '合同文件',`sign_time` DATETIME DEFAULT NULL COMMENT '签署时间',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_contract_no` (`contract_no`),KEY `idx_landlord_id` (`landlord_id`),KEY `idx_tenant_id` (`tenant_id`),KEY `idx_house_id` (`house_id`),KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租赁合同表';-- 租金支付表
CREATE TABLE `rent_payment` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '支付ID',`contract_id` INT NOT NULL COMMENT '合同ID',`payment_no` VARCHAR(50) NOT NULL COMMENT '支付单号',`amount` DECIMAL(10,2) NOT NULL COMMENT '金额',`payment_type` TINYINT NOT NULL COMMENT '支付类型(1:租金,2:押金,3:其他)',`payment_method` TINYINT NOT NULL COMMENT '支付方式(1:微信支付,2:支付宝,3:银行卡)',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:待支付,2:支付成功,3:支付失败,4:已退款)',`payment_time` DATETIME DEFAULT NULL COMMENT '支付时间',`refund_time` DATETIME DEFAULT NULL COMMENT '退款时间',`transaction_id` VARCHAR(100) DEFAULT NULL COMMENT '交易流水号',`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_payment_no` (`payment_no`),KEY `idx_contract_id` (`contract_id`),KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租金支付表';-- 评价表
CREATE TABLE `review` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '评价ID',`reviewer_id` INT NOT NULL COMMENT '评价人ID',`reviewer_type` TINYINT NOT NULL COMMENT '评价人类型(1:房东,2:租客)',`reviewee_id` INT NOT NULL COMMENT '被评价人ID',`house_id` INT NOT NULL COMMENT '房源ID',`content` TEXT NOT NULL COMMENT '评价内容',`rating` TINYINT NOT NULL COMMENT '评分(1-5)',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:待审核,1:已通过,2:已拒绝)',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_reviewer_id` (`reviewer_id`),KEY `idx_reviewee_id` (`reviewee_id`),KEY `idx_house_id` (`house_id`),KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评价表';-- 收藏表
CREATE TABLE `collection` (`id` INT NOT NULL AUTO_INCREMENT COMMENT '收藏ID',`user_id` INT NOT NULL COMMENT '用户ID',`house_id` INT NOT NULL COMMENT '房源ID',`create_time` DATETIME NOT NULL COMMENT '创建时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_user_house` (`user_id`,`house_id`),KEY `idx_user_id` (`user_id`),KEY `idx_house_id` (`house_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收藏表';

4. 系统详细设计与实现

4.1 后端服务实现

后端服务基于 Python Django 框架实现,采用 MVC 架构模式,将系统分为模型层、视图层和控制器层。以下是核心模块的实现细节:

  1. 用户认证与权限管理模块:基于 Django 的认证系统实现用户注册、登录、权限控制等功能,采用 JWT 实现无状态认证。

  2. 房源管理模块:实现房源信息的发布、编辑、审核、查询等功能,支持图片上传和管理。

  3. 租房申请与合同管理模块:实现租房申请的提交、审核、合同生成和签署等功能,支持合同文件的上传和下载。

  4. 租金支付模块:集成微信支付和支付宝支付接口,实现租金的在线支付和管理。

  5. 评价与反馈模块:实现用户对房源和房东的评价功能,支持评价的审核和展示。

  6. 统计分析模块:实现房源出租率、租金收入、用户活跃度等数据的统计和分析,支持数据可视化展示。

以下是房源管理模块的部分实现代码示例:

python

运行

# 房源管理模块from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.db.models import Q
import json
import os
from datetime import datetimefrom .models import House, HouseImage, Landlord
from .serializers import HouseSerializer, HouseImageSerializer
from utils.response import SuccessResponse, ErrorResponse
from utils.permissions import is_landlord, is_admin
from utils.image_upload import upload_image# 房源列表
@login_required
def house_list(request):try:# 获取查询参数city = request.GET.get('city', '')district = request.GET.get('district', '')min_rent = request.GET.get('min_rent', '')max_rent = request.GET.get('max_rent', '')house_type = request.GET.get('type', '')page = request.GET.get('page', 1)page_size = request.GET.get('page_size', 10)# 构建查询条件query = Q(status=1, is_verified=1)  # 只显示已审核且上架的房源if city:query &= Q(city=city)if district:query &= Q(district=district)if min_rent and max_rent:query &= Q(rent__gte=min_rent, rent__lte=max_rent)elif min_rent:query &= Q(rent__gte=min_rent)elif max_rent:query &= Q(rent__lte=max_rent)if house_type:query &= Q(type=house_type)# 获取房源列表houses = House.objects.filter(query).order_by('-create_time')# 分页处理paginator = Paginator(houses, page_size)page_obj = paginator.get_page(page)# 序列化房源数据serializer = HouseSerializer(page_obj, many=True)# 获取封面图片for house_data in serializer.data:cover_image = HouseImage.objects.filter(house_id=house_data['id'], is_cover=True).first()if cover_image:house_data['cover_image'] = cover_image.image_urlelse:house_data['cover_image'] = ''return SuccessResponse({'total': paginator.count,'page': page_obj.number,'page_size': page_size,'houses': serializer.data})except Exception as e:return ErrorResponse(f"获取房源列表失败: {str(e)}")# 房源详情
@login_required
def house_detail(request, house_id):try:# 获取房源信息house = get_object_or_404(House, id=house_id, status=1, is_verified=1)# 增加浏览次数house.view_count += 1house.save()# 序列化房源数据serializer = HouseSerializer(house)# 获取房源图片images = HouseImage.objects.filter(house_id=house_id).order_by('sort')image_serializer = HouseImageSerializer(images, many=True)# 获取房东信息landlord = Landlord.objects.get(id=house.landlord_id)landlord_info = {'id': landlord.id,'name': landlord.user.name,'phone': landlord.user.phone,'avatar': landlord.user.avatar,'real_name_status': landlord.real_name_status}# 获取房源评价from reviews.models import Reviewreviews = Review.objects.filter(house_id=house_id, status=1).order_by('-create_time')[:5]review_count = Review.objects.filter(house_id=house_id, status=1).count()review_list = []for review in reviews:reviewer = review.reviewer_idreviewer_type = review.reviewer_typeif reviewer_type == 1:  # 房东reviewer_obj = Landlord.objects.get(id=reviewer)reviewer_name = reviewer_obj.user.namereviewer_avatar = reviewer_obj.user.avatarelse:  # 租客from tenants.models import Tenantreviewer_obj = Tenant.objects.get(id=reviewer)reviewer_name = reviewer_obj.user.namereviewer_avatar = reviewer_obj.user.avatarreview_list.append({'id': review.id,'reviewer_name': reviewer_name,'reviewer_avatar': reviewer_avatar,'content': review.content,'rating': review.rating,'create_time': review.create_time.strftime('%Y-%m-%d %H:%M:%S')})return SuccessResponse({'house': serializer.data,'images': image_serializer.data,'landlord': landlord_info,'reviews': review_list,'review_count': review_count})except Exception as e:return ErrorResponse(f"获取房源详情失败: {str(e)}")# 发布房源
@login_required
@is_landlord
def publish_house(request):if request.method == 'POST':try:# 获取当前用户user = request.user# 检查是否已实名认证landlord = Landlord.objects.get(user_id=user.id)if landlord.real_name_status != 2:  # 未认证或认证失败return ErrorResponse("请先完成实名认证")# 获取请求数据data = json.loads(request.body)# 创建房源house = House(landlord_id=landlord.id,title=data.get('title'),type=data.get('type'),bedroom_num=data.get('bedroom_num'),living_room_num=data.get('living_room_num'),bathroom_num=data.get('bathroom_num'),area=data.get('area'),floor=data.get('floor'),total_floor=data.get('total_floor'),orientation=data.get('orientation'),decoration=data.get('decoration'),rent=data.get('rent'),payment_method=data.get('payment_method'),address=data.get('address'),city=data.get('city'),district=data.get('district'),community=data.get('community'),longitude=data.get('longitude'),latitude=data.get('latitude'),description=data.get('description'),facilities=json.dumps(data.get('facilities', [])),status=1,  # 默认上架create_time=datetime.now(),update_time=datetime.now())house.save()# 处理房源图片images = data.get('images', [])if images:# 设置第一张为封面图HouseImage.objects.create(house_id=house.id,image_url=images[0],is_cover=True,sort=0,create_time=datetime.now())# 设置其他图片for i, image in enumerate(images[1:]):HouseImage.objects.create(house_id=house.id,image_url=image,is_cover=False,sort=i+1,create_time=datetime.now())return SuccessResponse("房源发布成功")except Exception as e:return ErrorResponse(f"房源发布失败: {str(e)}")else:return ErrorResponse("请求方法错误")# 上传房源图片
@login_required
@is_landlord
@csrf_exempt
def upload_house_image(request):if request.method == 'POST':try:# 获取上传的文件file = request.FILES.get('file')if not file:return ErrorResponse("未上传文件")# 上传图片image_url = upload_image(file, 'house_images')return SuccessResponse({"image_url": image_url})

    博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c++等开发语言,以及毕业项目实战✌

       从事基于java BS架构、CS架构、c/c++ 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。

       先后担任过技术总监、部门经理、项目经理、开发组长、java高级工程师及c++工程师等职位,在工业互联网、国家标识解析体系、物联网、分布式集群架构、大数据通道处理、接口开发、远程教育、办公OA、财务软件(工资、记账、决策、分析、报表统计等方面)、企业内部管理软件(ERP、CRM等)、arggis地图等信息化建设领域有较丰富的实战工作经验;拥有BS分布式架构集群、数据库负载集群架构、大数据存储集群架构,以及高并发分布式集群架构的设计、开发和部署实战经验;拥有大并发访问、大数据存储、即时消息等瓶颈解决方案和实战经验。

       拥有产品研发和发明专利申请相关工作经验,完成发明专利构思、设计、编写、申请等工作,并获得发明专利1枚。

-----------------------------------------------------------------------------------

      大家在毕设选题、项目升级、论文写作,就业毕业等相关问题都可以给我留言咨询,非常乐意帮助更多的人或加w 908925859。

相关博客地址:

csdn专业技术博客:https://blog.csdn.net/mr_lili_1986?type=blog

Iteye博客:        https://www.iteye.com/blog/user/mr-lili-1986-163-com

门户:http://www.petsqi.cn

七、其他案例: 

 

  

 

http://www.lryc.cn/news/571693.html

相关文章:

  • ROS2 笔记汇总(2) 通信接口
  • 阿里云中间件:解锁云端应用的强大引擎
  • C++之多态
  • Flutter 学习 之 const
  • window显示驱动开发—流输出阶段
  • 解决你的100个问题——梦想
  • 正态分布:AI大模型中的概率统计基石
  • 我的256天创作纪念日
  • 【5G通信基础】UCI上行链路控制信息简介
  • 义乌购平台店铺商品接口开发指南
  • TIGAR 如何逆转多囊卵巢综合征的困局【AbMole】
  • 分发平台是一个专注于APP应用分发
  • 《Effective Python》第九章 并发与并行——使用 Queue 实现并发重构
  • 跟着AI学习C# Day20
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑5
  • Web攻防-XSS跨站浏览器UXSS突变MXSSVueReactElectron框架JQuery库写法和版本
  • ubuntu下python版本升级导致pyqt不能正常运行解决
  • CppCon 2017 学习:C++ atomics:from basic to advanced. What do they do?
  • Java大模型开发入门 (15/15):总结与展望 - Java开发者的AI进阶之路
  • 单例模式:全局唯一实例的设计艺术
  • web3.js v4.x 模块架构
  • linux618 NFS web.cn NFS.cn backup.cn
  • 亚矩阵云手机+Whatnot:直播电商的自动化增长引擎
  • Linux lsof 命令详解+实例
  • 【Python与生活】如何实现一个条形码检测算法?
  • IEEE RAL 双臂机器人三连抓估计物体状态 无需特制夹爪或视觉相机 - 大阪大学万伟伟老师团队
  • PCL 四元数转轴角
  • 【学习笔记】2.1注意力机制
  • C#开发MES管理系统源码工业生产线数据采集WPF上位机产线执行系统源码
  • crackme010