1. 项目概述
最近帮朋友开发了一套基于Python Flask的房屋租赁销售管理系统,主要解决中介公司在房源管理、合同签订和客户预约看房环节的痛点。这个系统上线后,朋友公司的业务处理效率提升了40%以上,客户满意度也有明显改善。
作为一个全栈开发者,我发现这类业务系统有几个关键需求:房源信息可视化展示、合同模板化管理、预约时段智能分配,以及销售业绩自动统计。下面我就从技术实现角度,分享这个项目的完整开发过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型考量
选择Flask框架主要基于以下考虑:
- 轻量级:相比Django更适合中小型业务系统
- 灵活性:可以自由组合扩展组件
- 开发效率:快速实现RESTful API接口
数据库选用MySQL 8.0,主要因为:
- 事务处理能力强(合同签订需要ACID特性)
- 空间数据支持(后续可能扩展地图找房功能)
- 企业级备份方案(业务数据安全性要求高)
前端采用Vue.js + ElementUI组合:
- 组件化开发效率高
- 响应式布局适配多终端
- 丰富的表单验证功能
2.2 核心功能模块
系统主要包含6个核心模块:
- 房源管理(CRUD+图片上传)
- 客户管理(客户画像+跟进记录)
- 预约系统(时段冲突检测)
- 合同管理(模板引擎+电子签名)
- 销售统计(数据可视化)
- 权限控制(RBAC模型)
3. 关键技术实现
3.1 Flask应用结构
采用工厂模式创建应用,目录结构如下:
code复制/house_rental
/app
/static # 静态资源
/templates # 前端模板
/blueprints # 蓝图模块
auth.py
house.py
contract.py
__init__.py # 工厂函数
config.py
requirements.txt
关键配置示例:
python复制# config.py
class Config:
SECRET_KEY = os.getenv('SECRET_KEY')
SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{DB_USER}:{DB_PASS}@{DB_HOST}/{DB_NAME}"
SQLALCHEMY_TRACK_MODIFICATIONS = False
UPLOAD_FOLDER = 'app/static/uploads'
3.2 数据库模型设计
核心表关系设计:
python复制# models.py
class House(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
price = db.Column(db.Numeric(10,2))
address = db.Column(db.String(200))
# 其他字段...
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
phone = db.Column(db.String(20), unique=True)
# 关联预约记录
appointments = db.relationship('Appointment', backref='customer')
class Appointment(db.Model):
id = db.Column(db.Integer, primary_key=True)
house_id = db.Column(db.Integer, db.ForeignKey('house.id'))
customer_id = db.Column(db.Integer, db.ForeignKey('customer.id'))
appointment_time = db.Column(db.DateTime)
status = db.Column(db.String(20)) # pending/confirmed/completed
3.3 预约系统实现
预约冲突检测算法:
python复制def check_availability(house_id, datetime):
existing = Appointment.query.filter_by(
house_id=house_id,
status='confirmed'
).filter(
func.abs(func.timestampdiff(
'minute',
Appointment.appointment_time,
datetime
)) < 30
).first()
return existing is None
4. 核心功能实现细节
4.1 合同模板引擎
采用Jinja2模板生成合同:
python复制from flask import render_template_string
def generate_contract(contract_template, data):
template = """
{{ title }}
甲方:{{ party_a }}
乙方:{{ party_b }}
房屋地址:{{ house.address }}
租赁期限:{{ start_date }}至{{ end_date }}
"""
return render_template_string(template, **data)
4.2 文件上传处理
安全处理房源图片上传:
python复制from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify(error='No file part'), 400
file = request.files['file']
if file.filename == '':
return jsonify(error='No selected file'), 400
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return jsonify(url=url_for('static', filename=f'uploads/{filename}'))
4.3 权限控制实现
基于角色的访问控制:
python复制from flask_login import current_user
def admin_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_admin:
abort(403)
return f(*args, **kwargs)
return decorated_function
5. 系统部署方案
5.1 生产环境配置
推荐部署方案:
- Web服务器:Nginx + Gunicorn
- 数据库:MySQL 8.0主从复制
- 缓存:Redis(用于会话存储)
- 监控:Prometheus + Grafana
Gunicorn启动配置:
bash复制gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app
5.2 性能优化建议
-
数据库优化:
- 为常用查询字段添加索引
- 使用连接池管理数据库连接
- 定期执行ANALYZE TABLE
-
前端优化:
- 使用CDN分发静态资源
- 实现懒加载图片
- 启用HTTP/2协议
6. 开发经验总结
6.1 踩坑记录
-
时区问题:
- 所有时间戳必须统一使用UTC存储
- 在前端展示时转换为本地时区
-
并发控制:
- 使用SELECT FOR UPDATE处理房源状态更新
- 实现乐观锁防止超卖
-
安全防护:
- 所有表单必须CSRF保护
- 文件上传限制扩展名和MIME类型
- 密码必须加盐哈希存储
6.2 扩展建议
-
未来可扩展功能:
- 微信小程序客户端
- 电子签名认证
- 智能推荐算法
-
性能监控:
- 实现慢查询日志
- 添加APM监控
- 定期进行压力测试
这套系统经过3个月的迭代开发,目前已经稳定运行半年多。最大的收获是深入理解了房地产中介行业的业务流程,也验证了Flask在中小型业务系统中的适用性。如果重新设计,我会考虑引入Celery来处理异步任务,比如合同生成的PDF转换和邮件发送。
