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

发布于:2025-06-20 ⋅ 阅读:(12) ⋅ 点赞:(0)

摘要

本研究针对传统租房管理模式存在的信息不透明、流程繁琐、效率低下等问题,设计并实现了一个基于 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 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

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

七、其他案例: 

 

  

 


网站公告

今日签到

点亮在社区的每一天
去签到