个人项目——智租:面向AI时代的智能房屋租赁平台
个人第一次全栈开发,系统架构、核心设计与技术实现深度解析
摘要
随着城市化进程加速和人口流动日益频繁,房屋租赁市场呈现出信息不对称、交易效率低下、服务质量参差不齐等突出问题。本文提出并实现了一套基于AI技术的智能房屋租赁管理平台——"智租"(SmartRent)。该平台采用前后端分离架构,以Python FastAPI异步框架为核心,结合MySQL关系型数据库与Dify.ai大模型工作流引擎,构建了覆盖房源管理、租客匹配、订单追踪、AI智能辅助等全链路的数字化解决方案。本文从系统架构设计、数据模型构建、核心功能实现、AI赋能机制四个维度对该平台进行深度剖析,旨在为房屋租赁领域的信息化与智能化建设提供可参考的技术范式。
关键词:房屋租赁;人工智能;FastAPI;大语言模型;平台架构;全栈开发
1. 引言
1.1 研究背景与问题陈述
房屋租赁是城市居住体系的重要组成部分。根据国家统计局数据,我国流动人口规模已超过3.7亿,其中超过70%通过租赁方式解决居住需求。然而,传统房屋租赁模式长期面临三大核心痛点:
-
信息不对称:租客难以全面获取房源真实信息,房东难以精准触达目标租客群体;
-
交易效率低:从信息发布、筛选匹配、实地看房到签约入住的链条冗长,缺乏有效的自动化手段;
-
服务标准化缺失:租赁过程中的咨询响应、合同管理、售后跟进等环节高度依赖人工,服务质量的波动性较大。
近年来,大语言模型(Large Language Models, LLMs)的突破性进展为行业数字化转型提供了新的技术路径。然而,如何将AI能力有机嵌入租赁业务的全流程,构建兼具实用性与可扩展性的智能平台,仍是亟待解决的技术命题。
1.2 本文贡献
本文围绕"智租"系统设计与实现,做出以下贡献:
-
提出了一套融合AI能力的房屋租赁平台架构设计方案,覆盖前端交互、后端服务、数据持久化与AI工作流四个层次;
-
设计并实现了基于角色的双用户体系(房东/租客)与完整的数据模型;
-
探索了LLM在房源描述生成、智能客服对话、租客意图识别等租赁场景中的落地路径;
-
总结了平台开发过程中的关键技术决策与工程实践经验。
2. 系统架构设计
2.1 整体架构概览
智租平台采用经典的前后端分离架构,整体分为四层:

架构设计原则:
-
关注点分离(Separation of Concerns):各层职责明确,展示层仅负责UI渲染与用户交互,API层处理HTTP协议转换,业务逻辑层承载领域规则,数据层专注持久化与外部服务调用。
-
异步非阻塞(Async Non-blocking):全链路采用Python
async/await协程模型,确保在高并发场景下保持吞吐能力。 -
约定优于配置(Convention over Configuration):RESTful API设计遵循统一的URL命名、请求/响应格式与错误处理规范。
2.2 技术选型分析
| 层次 | 技术选型 | 选型理由 |
| 后端框架 | FastAPI | 原生异步支持、自动生成OpenAPI文档、Pydantic类型验证、高性能 |
| ORM | SQLAlchemy | 声明式映射、成熟的异步会话管理、连接池支持、数据库无关性 |
| 数据库 | MySQL | 事务支持完善、读写性能均衡、社区生态成熟、中文全文检索支持 |
| 数据库驱动 | aiomysql | 纯Python异步MySQL驱动,与SQLAlchemy async引擎无缝集成 |
| AI引擎 | Dify.ai | 低代码LLM工作流编排、Prompt模板管理、API化调用、国产化部署友好 |
| 前端架构 | JS + Axios | 无框架依赖、轻量化部署、学习成本低、适合中小规模管理后台 |
| UI图标库 | Font Awesome | 矢量图标丰富、CDN加速、语义化类名 |
| 数据验证 | Pydantic | 声明式Schema定义、自动类型转换、与FastAPI原生集成 |
关键选型决策讨论:
在AI能力集成方面,我们选择Dify.ai而非直接调用大模型API,核心理由包括:① Dify提供可视化的Prompt编排与版本管理能力,降低了非技术人员维护AI行为的门槛;② 工作流引擎支持多步骤链式调用,可实现"意图识别→槽位填充→知识检索→回复生成"的复杂Pipeline;③ API接口标准化,与业务代码解耦,当底层模型升级时无需修改平台代码。
在前端技术路线方面,选择Vanilla JS而非React/Vue等现代框架,主要考量:① 该平台为管理后台场景,交互复杂度可控,不涉及大量组件嵌套与状态共享;② 零构建步骤,部署即用,降低运维复杂度;③ 避免框架版本升级带来的技术债务。
2.3 部署架构与中间件配置
# 应用工厂模式:FastAPI实例化与中间件注册
app = FastAPI()
# CORS中间件:允许跨域请求(开发/测试阶段配置为全开放)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 路由注册:统一前缀管理
app.include_router(zz_router)
# 静态资源服务:前端页面与上传文件的独立挂载点
app.mount("/", StaticFiles(directory="frontend", html=True), name="frontend")
app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")
该配置实现了:① 前后端一体化部署——FastAPI同时承载API服务与静态资源分发;② 文件上传资源通过独立挂载点对外暴露,支持后续扩展CDN或对象存储;③ 数据库表结构通过Base.metadata.create_all在应用启动时自动同步,简化了部署流程。
3. 数据模型设计
3.1 实体关系模型
平台核心包含五大实体,其关系如下图所示:

3.2 核心表结构设计
3.2.1 抽象基类(Base)
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(
DateTime, server_default=func.now()
)
update_time: Mapped[datetime] = mapped_column(
DateTime, server_default=func.now(), onupdate=func.now()
)
设计要点:通过SQLAlchemy 2.0的声明式基类,统一为所有业务表注入create_time和update_time审计字段。server_default=func.now()确保时间戳由数据库服务器生成,避免了应用层时钟不一致的问题;onupdate=func.now()则实现了行级自动更新。
3.2.2 用户模型:房东与租客的双表设计
平台采用房东(Landlord)与租客(User)独立建模的策略,而非统一的User表加角色字段。这一设计的考量:
| 维度 | 双标设计 | 单表+角色字段 |
| 数据独立性 | 各角色字段互不干扰 | 需大量nullable字段 |
| 查询效率 | 无需角色过滤 | 需额外WHERE条件 |
| 扩展灵活性 | 可为不同角色独立扩展属性 | 字段膨胀 |
| 认证逻辑 | 需维护两套登录接口 | 统一认证入口 |
考虑到租赁场景中房东与租客的业务属性差异显著(如房东需关联房源、租客需关联订单),且当前阶段字段集合相对稳定,选择双表设计以换取更高的数据内聚性。
class Landlord(Base):
__tablename__ = "landlord"
landlord_id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
landlord_name: Mapped[str] = mapped_column(String(20), nullable=False)
landlord_phone: Mapped[str] = mapped_column(String(11), nullable=False)
landlord_pwd: Mapped[str] = mapped_column(String(100), nullable=False, default='123456')
class User(Base):
__tablename__ = "user"
user_id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
user_name: Mapped[str] = mapped_column(String(20), nullable=False)
user_phone: Mapped[str] = mapped_column(String(11), nullable=False)
user_pwd: Mapped[str] = mapped_column(String(100), nullable=False, default='123456')
安全性说明:当前密码以明文存储(String(100)),这是演示系统的简化处理。生产环境中应使用bcrypt或argon2等算法进行哈希加盐存储。字段长度100已为此预留空间。
3.2.3 房源模型(Listings)
房源是平台的核心实体,其字段设计反映了租赁业务的信息需求:
class Listings(Base):
__tablename__ = "listings"
listing_id: Mapped[int] # 主键,自增
listing_title: Mapped[str] # 房源标题(100字符)
listing_price: Mapped[float] # 月租金
listing_address: Mapped[str] # 地址
listing_layout: Mapped[str] # 户型(如"两室一厅一卫")
listing_area: Mapped[float] # 面积(平方米)
listing_description: Mapped[str]# 房源描述(Text类型,支持长文本)
listing_facilities: Mapped[str] # 配套设施(逗号分隔,如"wifi,aircon")
listing_status: Mapped[str] # 状态(active/inactive/rented)
listing_image_urls: Mapped[str] # 图片URL列表(逗号分隔)
landlord_id: Mapped[int] # 房东外键
user_id: Mapped[int] # 当前租客外键(nullable,未出租时为空)
关键设计决策——逗号分隔存储:listing_facilities与listing_image_urls采用逗号分隔字符串存储而非关系表。这看似违反了数据库范式,但在当前场景下是务实的折中:
-
配套设施为简单的标签集合,无需独立查询或统计;
-
图片URL列表的修改总是整体替换(上传、删除、重新排序),不存在对单张图片的复杂查询;
-
避免了
facilities和images两张关联表带来的JOIN查询开销; -
应用层在读写时进行
split(",")/join(",")转换,成本极低。
3.2.4 订单模型(Order)与对话日志模型(ChatLog)
class Order(Base):
__tablename__ = "orders"
order_id: Mapped[int] # 主键
property_id: Mapped[int] # 关联房源ID
tenant_name: Mapped[str] # 租客姓名(冗余字段,提升查询效率)
phone: Mapped[str] # 联系电话
status: Mapped[str] # 状态:待签约→已签约→已完成
create_time: Mapped[str] # 创建时间(字符串格式)
class ChatLog(Base):
__tablename__ = "chat_logs"
log_id: Mapped[int]
user_message: Mapped[str] # 用户消息(Text)
ai_response: Mapped[str] # AI回复(Text)
create_time: Mapped[str] # 对话时间
ChatLog的设计体现了AI可观测性(Observability)的理念:每次AI对话都被持久化记录,为后续的对话质量评估、用户意图分析、模型效果对比提供数据基础。
3.3 Pydantic Schema层
数据验证通过Pydantic模型实现,与SQLAlchemy ORM模型形成"双模型"架构:
class PropertyCreate(BaseModel):
title: str
price: float
address: str
layout: str
area: float
description: Optional[str] = ""
facilities: Optional[List[str]] = [] # API层使用List,存储层使用逗号分隔字符串
image_urls: Optional[List[str]] = []
landlord_id: int = 1
class PropertyUpdate(BaseModel):
# 所有字段均为Optional,支持部分更新(PATCH语义)
title: Optional[str] = None
price: Optional[float] = None
设计收益:① API层与数据库层类型解耦——API接收List[str]而存储层使用逗号分隔字符串,转换逻辑集中在路由处理函数中;② 自动请求验证——非法类型或缺失必填字段时,FastAPI自动返回422错误;③ OpenAPI文档自动生成——Pydantic Schema被用于生成交互式API文档。
4. 核心功能实现
4.1 异步数据库会话管理
# 异步引擎配置
engine = create_async_engine(
DATABASE_URL, # mysql+aiomysql://...
echo=True, # 开发阶段打印SQL日志
pool_size=10, # 连接池常驻连接数
max_overflow=20 # 溢出连接上限(峰值可达30连接)
)
# 依赖注入式会话管理
async def get_session():
async with AsyncSessionLocal() as session:
try:
yield session
await session.commit()
except Exception:
await session.rollback()
raise
finally:
await session.close()
设计亮点:
-
依赖注入模式(Dependency Injection):通过FastAPI的
Depends(get_session)机制,路由函数无需手动管理会话生命周期,框架自动在请求进入时创建会话、在响应返回时提交事务或回滚异常。 -
连接池配置:
pool_size=10, max_overflow=20意味着系统最多可承载30个并发数据库连接。对于中小规模的管理后台而言绰绰有余。 -
自动事务管理:正常返回时自动
commit,异常时自动rollback,避免了手动事务管理的内存泄漏和死锁风险。
4.2 RESTful API设计
平台API遵循RESTful设计规范,以房源管理为例:
| 方法 | 路径 | 功能 | 请求体 | 响应 |
GET |
/api/properties |
获取房源列表 | — | {success, data[], total} |
GET |
/api/properties/{id} |
获取房源详情 | — | {success, data} |
POST |
/api/properties |
创建房源 | PropertyCreate |
{success, data: {id}, message} |
PUT |
/api/properties/{id} |
更新房源 | PropertyUpdate |
{success, message} |
DELETE |
/api/properties/{id} |
删除房源 | — | {success, message} |
统一响应格式:
{
"success": true,
"data": { ... },
"message": "操作成功",
"total": 100
}
统一的响应结构简化了前端错误处理逻辑——common.js中的Axios拦截器统一处理HTTP错误并展示通知,业务层仅需关注success字段判断。
4.3 图片上传机制
@zz_router.post("/api/upload/image")
async def upload_image(file: UploadFile = File(...)):
ext = file.filename.split('.')[-1]
new_filename = f"{uuid.uuid4().hex}.{ext}"
file_path = os.path.join(UPLOAD_DIR, new_filename)
content = await file.read()
with open(file_path, "wb") as f:
f.write(content)
return {"success": True, "url": f"/uploads/{new_filename}"}
设计要点:
-
UUID命名:使用
uuid4().hex生成32位十六进制随机文件名,彻底避免文件名冲突; -
异步读取:
await file.read()配合FastAPI的异步文件处理,不阻塞事件循环; -
本地存储:当前采用本地文件系统存储,通过
/uploads静态挂载对外服务;生产环境可无缝切换至阿里云OSS或AWS S3。
4.4 用户认证体系
平台实现了双角色认证系统,支持租客与房东的独立登录与注册:
# 租客登录
@zz_router.post("/api/user/login")
async def user_login(login: UserLogin, session=Depends(get_session)):
stmt = select(User).where(User.user_name == login.user_name)
user = (await session.execute(stmt)).scalar_one_or_none()
if not user or user.user_pwd != login.user_pwd:
raise HTTPException(status_code=401, detail="用户名或密码错误")
return {"success": True, "user_type": "tenant", "user_id": user.user_id, ...}
当前认证方案与演进方向:
当前采用基于用户名+密码的简单认证,前端通过localStorage持久化用户信息。这适用于演示与内部管理场景。生产环境中应从以下维度加固:
-
密码安全:引入
passlib[bcrypt]进行哈希存储与验证; -
会话管理:采用JWT(JSON Web Token)替代localStorage明文存储;
-
HTTPS强制:通过Nginx反向代理终止TLS,保护传输层安全;
-
速率限制:引入
slowapi中间件防止暴力破解。
5. AI赋能机制
5.1 AI能力全景
智租平台的AI能力围绕Dify.ai工作流引擎构建,覆盖租赁业务的三个关键场景。
5.2 AI房源描述生成
@zz_router.post("/api/ai/generate-description")
async def generate_description(data: dict):
prompt = (
f"帮我生成一段房屋租赁的房源描述,标题:{title},"
f"户型:{layout},面积:{area}平方米,租金:{price}元/月。"
f"要求:突出房源优势,语言吸引人。"
)
async with httpx.AsyncClient(timeout=30) as client:
resp = await client.post(
"https://api.dify.ai/v1/workflows/run",
headers={"Authorization": f"Bearer {DIFY_API_KEY}"},
json={"inputs": {"input": prompt}, "response_mode": "blocking", "user": "api-user"}
)
outputs = resp.json().get("data", {}).get("outputs", {})
desc = outputs.get("text") or outputs.get("result") or outputs.get("output")
return {"success": True, "description": desc}
实现分析:
-
Prompt Engineering:通过结构化模板将房源属性(标题、户型、面积、价格)注入Prompt,确保生成的描述与房源实际信息一致,避免了LLM"幻觉"(Hallucination)问题;
-
同步阻塞模式:
response_mode: "blocking"确保在HTTP超时(30秒)内获取完整生成结果,避免了异步回调带来的状态管理复杂度; -
优雅降级(Graceful Degradation):当Dify API不可用或超时时,返回预置的模板化文案作为fallback,确保房源发布流程不因AI服务故障而中断。
5.3 AI智能客服
@zz_router.post("/api/ai/chat")
async def ai_chat(data: dict, session=Depends(get_session)):
prompt = f"你是智租平台的AI助手,请回答用户关于租房的问题:{message}"
# ... 调用Dify API ...
# 持久化对话日志
chat_log = ChatLog(user_message=message, ai_response=reply)
session.add(chat_log)
await session.flush()
return {"success": True, "reply": reply}
设计特点:
-
角色设定(System Prompt):通过在Prompt中注入"你是智租平台的AI助手"的角色定义,引导模型聚焦于租赁领域的专业回答;
-
对话日志全量记录:每次交互都被持久化到
chat_logs表,支持历史回溯、质量审计与数据标注; -
失败降级:AI服务异常时返回友好提示而非技术错误信息,提升用户体验。
5.4 前端AI交互体验
平台前端通过浮动AI按钮(Floating Action Button)实现全局AI助手的快速唤起:
// AI聊天面板状态管理
function initAIChat() {
const btn = document.querySelector('.ai-float-btn');
const panel = document.querySelector('.ai-chat-panel');
btn.onclick = () => panel.classList.toggle('active');
// 消息发送与流式显示
async function sendMsg() {
messages.innerHTML += `<div class="message user">...</div>`;
messages.innerHTML += `<div class="message ai">思考中...</div>`;
const reply = await API.chat(msg);
// 替换"思考中"为实际回复
lastMsg.querySelector('.message-content').innerText = reply;
}
}
交互设计考量:
-
非侵入式设计:浮动按钮位于页面右下角,不干扰主流程操作;
-
乐观更新(Optimistic Update):用户消息立即显示,AI回复位置预留"思考中..."占位,降低感知延迟;
-
全局可用性:AI聊天面板在所有页面(首页、房源管理、订单管理、用户管理、AI中心)均保持一致体验。
6. 前端架构与交互设计
6.1 页面架构
智租前端采用多页面应用(MPA)架构,共7个独立页面:
| 页面 | 文件 | 核心功能 |
| 首页 | index.html |
统计面板、快捷入口、热门房源展示 |
| 房源管理 | properties.html |
房源列表、多维筛选、分页浏览 |
| 房源详情 | property-detail.html |
图片画廊、信息展示、房东联系 |
| 发布/编辑房源 | publish-property.html |
表单录入、图片上传、AI文案生成 |
| 订单管理 | orders.html |
订单列表、状态筛选、客服查看 |
| 用户管理 | users.html |
房东/租客管理、搜索过滤、添加用户 |
| AI中心 | ai-center.html |
实时对话、意图配置、智能文案生成 |
| 登录/注册 | login.html / register.html |
双角色认证 |
6.2 公共JavaScript模块设计
common.js(约220行)作为平台的公共基础设施层,遵循模块化设计原则:
// API客户端:全局单例,Axios实例 + 拦截器
const apiClient = axios.create({
baseURL: 'http://localhost:8000/api',
timeout: 30000,
headers: {'Content-Type': 'application/json'}
});
// 响应拦截器:统一错误处理
apiClient.interceptors.response.use(
response => response.data, // 自动解包data
error => {
showNotification(error.response?.data?.detail || '请求失败', 'error');
return Promise.reject(error);
}
);
// API命名空间:语义化方法封装
const API = {
async getProperties() { ... },
async createProperty(data) { ... },
async chat(message) { ... },
async generateDescription(data) { ... },
// ...
};
设计收益:① 全局Notification统一展示;② API调用自动解包response.data,业务代码直接获取业务数据;③ 集中的API方法命名空间便于维护与重构。
6.3 全局CSS设计系统
/* 设计令牌(Design Tokens)隐式定义 */
:root {
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--card-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
--border-radius: 12px;
--transition: all 0.3s;
}
/* 响应式Grid系统 */
.grid-4 { grid-template-columns: repeat(4, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
/* 移动端适配 */
@media (max-width: 768px) {
.grid-4, .grid-3 { grid-template-columns: repeat(2, 1fr); }
}
视觉设计采用紫蓝渐变(#667eea → #764ba2)作为品牌主色调,传达"智慧科技"的品牌调性。CSS通过Grid布局实现响应式适配,在移动端自动将3列/4列布局折叠为2列。
7. 关键技术决策与工程反思
7.1 数据一致性保障
当前平台通过SQLAlchemy的async with session保证单请求内的事务一致性。但跨服务的分布式事务(如创建订单同时更新房源状态)仍需增强。建议引入事件溯源(Event Sourcing)或Saga模式处理跨实体状态变更。
7.2 API安全加固路径
| 维度 | 当前状态 | 建议方案 |
|---|---|---|
| 认证 | 明文密码比对 | bcrypt哈希 + JWT |
| 授权 | 无角色权限控制 | RBAC(角色-权限矩阵) |
| 传输 | HTTP明文 | Nginx + Let's Encrypt TLS |
| 输入 | Pydantic基础验证 | 增加SQL注入/XSS防护 |
| 速率 | 无限流 | slowapi + Redis滑动窗口 |
7.3 性能优化方向
-
数据库查询优化:为高频查询字段(
listing_status、landlord_id、listing_price)添加复合索引; -
静态资源CDN化:图片上传后异步同步至CDN,前端通过CDN域名加载;
-
LLM响应缓存:对高频相似问题(如"附近有哪些房源")引入Redis缓存,减少Dify API调用成本;
-
前端资源懒加载:房源列表页的图片采用Intersection Observer实现滚动到视口时才加载。
7.4 可扩展性设计
平台在以下维度预留了扩展接口:
-
AI引擎切换:通过
httpx调用Dify API的代码封装在路由函数内,未来可抽取为独立的AIProvider抽象类,支持切换至OpenAI、文心一言等不同后端; -
存储层抽象:图片上传逻辑可扩展为
StorageBackend接口,支持本地存储、阿里云OSS、AWS S3的即插即用; -
消息通知:订单状态变更时可接入WebSocket推送或短信/邮件通知服务。
8. 与传统租赁平台的对比
| 维度 | 传统租赁平台 | 智租平台 |
|---|---|---|
| AI集成 | 无或仅关键词匹配 | LLM驱动的智能客服与文案生成 |
| 技术架构 | LAMP单体架构为主 | 异步Python + 前后端分离 |
| 部署方式 | 依赖Apache/Nginx + PHP | 单进程Python应用,Docker友好 |
| 扩展性 | 垂直扩展为主 | 支持水平扩展(无状态API + 外部会话存储) |
| 开发效率 | 模板渲染 + jQuery | 声明式API + 现代JavaScript |
9. 结论与展望
本文详细阐述了"智租"智能房屋租赁平台的设计理念、系统架构与核心技术实现。平台以FastAPI异步框架为基础,结合SQLAlchemy ORM与MySQL构建了稳健的数据层,通过Dify.ai大模型工作流引擎实现了AI能力的业务嵌入,以前后端分离的Web架构交付了完整的租赁管理功能。工程实践证明,将AI能力有机融入传统租赁业务流程,能够显著提升信息匹配效率与用户体验。
未来工作将从以下方向展开:
-
多模态能力增强:引入图像理解模型,自动识别房源图片中的户型、装修风格、配套设施,实现"以图搜房"和智能标签生成;
-
个性化推荐系统:基于租客浏览行为与偏好标签,构建协同过滤+深度学习的混合推荐算法;
-
智能定价引擎:整合周边房源价格、季节因素、市场供需等数据,为房东提供动态定价建议;
-
区块链租赁合约:探索基于智能合约的租赁协议自动执行与存证,降低信任成本;
-
跨平台小程序化:将前端重构为微信小程序/支付宝小程序,覆盖更广泛的用户群体。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)