摘要
本研究针对传统租房管理模式存在的信息不透明、流程繁琐、效率低下等问题,设计并实现了一个基于 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 研究内容与方法
本研究的主要内容包括:
-
系统需求分析:通过问卷调查、访谈等方式,了解房东、租客和租房中介的需求,明确系统的功能和性能要求。
-
系统设计:包括系统架构设计、数据库设计、功能模块设计等,确定系统的技术选型和实现方案。
-
系统实现:基于 Python Django 框架实现系统的各个功能模块,包括用户认证、房源管理、租客管理、租赁合同管理、租金支付、评价反馈等。
-
系统测试:对系统进行功能测试、性能测试、安全测试等,确保系统的稳定性和可靠性。
-
系统部署与应用:将系统部署到生产环境中,进行实际应用验证,评估系统的使用效果和用户满意度。
本研究采用的研究方法包括:
-
文献研究法:查阅国内外相关文献,了解在线租房平台的研究现状和发展趋势,为系统设计提供理论支持。
-
问卷调查法:通过问卷调查的方式,了解房东、租客和租房中介的需求和意见,为系统功能设计提供依据。
-
案例分析法:分析国内外知名在线租房平台的成功案例,借鉴其设计思路和实现方法,为本系统的设计和实现提供参考。
-
实验研究法:通过实验对比不同的技术方案和算法,选择最优的方案和算法,提高系统的性能和用户体验。
2. 系统需求分析
2.1 功能需求
通过对房东、租客和租房中介的需求调研,确定系统的主要功能需求如下:
-
用户管理功能
- 用户注册、登录、信息修改
- 用户角色管理(房东、租客、管理员)
- 用户权限控制
-
房源管理功能
- 房源信息发布、编辑、删除
- 房源信息审核
- 房源信息搜索、筛选、排序
- 房源信息展示(包括图片、视频、文字描述等)
- 房源收藏、分享
-
租客管理功能
- 租客信息登记、查看、修改
- 租客租房申请提交、审核
- 租客租房历史记录查询
-
租赁合同管理功能
- 租赁合同生成、签署
- 租赁合同查看、修改、终止
- 租赁合同提醒(到期提醒、续约提醒等)
-
租金支付功能
- 租金计算、生成支付订单
- 支持多种支付方式(微信支付、支付宝、银行卡等)
- 租金支付记录查询
- 租金逾期提醒
-
评价反馈功能
- 租客对房源和房东进行评价
- 房东对租客进行评价
- 评价信息展示和管理
- 用户反馈提交和处理
-
统计分析功能
- 房源出租率统计
- 租金收入统计
- 用户活跃度统计
- 热门房源分析
2.2 非功能需求
-
性能需求
- 系统响应时间应满足用户操作要求,一般查询操作响应时间不超过 3 秒,复杂操作响应时间不超过 10 秒
- 系统应支持至少 1000 个并发用户同时在线操作
- 系统应能够处理大量数据,保证数据的完整性和一致性
-
安全性需求
- 系统应保证用户数据的安全性和隐私性,严格遵守相关法律法规
- 用户密码应进行加密存储,防止密码泄露
- 系统应具备完善的访问控制机制,防止非法访问和操作
- 系统应具备数据备份和恢复机制,防止数据丢失
-
可用性需求
- 系统应具备良好的用户界面和操作体验,使用户能够轻松上手
- 系统应提供完善的帮助文档和在线客服,解答用户疑问
- 系统应具备高可用性,保证每天 24 小时不间断运行
-
可扩展性需求
- 系统应具备良好的可扩展性,能够方便地添加新的功能模块
- 系统应支持数据量和用户数的不断增长,能够通过集群化部署实现性能提升
-
兼容性需求
- 系统应支持主流浏览器(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 数据库设计
根据系统需求,设计了以下主要数据表:
-
用户表 (User):存储系统用户的基本信息,包括用户 ID、用户名、密码、角色、联系方式等。
-
房东表 (Landlord):存储房东的详细信息,包括房东 ID、用户 ID、身份证号、实名认证状态等。
-
租客表 (Tenant):存储租客的详细信息,包括租客 ID、用户 ID、身份证号、工作信息等。
-
房源表 (House):存储房源的基本信息,包括房源 ID、房东 ID、房源类型、地址、面积、租金、配套设施等。
-
房源图片表 (HouseImage):存储房源的图片信息,包括图片 ID、房源 ID、图片路径等。
-
租房申请表 (RentalApplication):存储租客的租房申请信息,包括申请 ID、租客 ID、房源 ID、申请时间、申请状态等。
-
租赁合同表 (RentalContract):存储租赁合同的详细信息,包括合同 ID、房东 ID、租客 ID、房源 ID、租赁期限、租金金额、支付方式等。
-
租金支付表 (RentPayment):存储租金支付的详细信息,包括支付 ID、合同 ID、支付金额、支付时间、支付状态等。
-
评价表 (Review):存储用户的评价信息,包括评价 ID、评价人 ID、被评价人 ID、房源 ID、评价内容、评分等。
-
收藏表 (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 架构模式,将系统分为模型层、视图层和控制器层。以下是核心模块的实现细节:
-
用户认证与权限管理模块:基于 Django 的认证系统实现用户注册、登录、权限控制等功能,采用 JWT 实现无状态认证。
-
房源管理模块:实现房源信息的发布、编辑、审核、查询等功能,支持图片上传和管理。
-
租房申请与合同管理模块:实现租房申请的提交、审核、合同生成和签署等功能,支持合同文件的上传和下载。
-
租金支付模块:集成微信支付和支付宝支付接口,实现租金的在线支付和管理。
-
评价与反馈模块:实现用户对房源和房东的评价功能,支持评价的审核和展示。
-
统计分析模块:实现房源出租率、租金收入、用户活跃度等数据的统计和分析,支持数据可视化展示。
以下是房源管理模块的部分实现代码示例:
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 datetime
from .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_url
else:
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 += 1
house.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 Review
reviews = 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_id
reviewer_type = review.reviewer_type
if reviewer_type == 1: # 房东
reviewer_obj = Landlord.objects.get(id=reviewer)
reviewer_name = reviewer_obj.user.name
reviewer_avatar = reviewer_obj.user.avatar
else: # 租客
from tenants.models import Tenant
reviewer_obj = Tenant.objects.get(id=reviewer)
reviewer_name = reviewer_obj.user.name
reviewer_avatar = reviewer_obj.user.avatar
review_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
七、其他案例:













