fastapi房产销售系统

说明:
我希望用fastapi写几个接口,查询房产交易系统的几条数据,然后在postman里面测试

  1. 查询客户所有预约记录(含房源信息)需要对应销售经理
  2. 查询客户所有订单(含房源信息)
  3. 统计销售经理名下所有房源销售情况和销售金额
  4. 查看房源详情及评价列表

step1:sql数据库,建表,添加数据,写查询sql

-- 用户表(管理员/客户/销售经理)
CREATE TABLE `user` (`user_id` INT PRIMARY KEY AUTO_INCREMENT,`username` VARCHAR(50) UNIQUE NOT NULL,`password` VARCHAR(100) NOT NULL,`role` ENUM('admin', 'customer', 'sales') NOT NULL DEFAULT 'customer',`real_name` VARCHAR(50),`phone` VARCHAR(20),`email` VARCHAR(50),`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 房源信息表
CREATE TABLE `house` (`house_id` INT PRIMARY KEY AUTO_INCREMENT,`title` VARCHAR(100) NOT NULL,`price` DECIMAL(12,2) NOT NULL,`area` DECIMAL(6,2) COMMENT '面积(平方米)',`room_type` VARCHAR(20) COMMENT '户型(如3室2厅)',`address` VARCHAR(200),`status` ENUM('pending', 'listed', 'sold') DEFAULT 'pending',`sales_id` INT COMMENT '负责的销售经理ID',`description` TEXT,`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (`sales_id`) REFERENCES `user`(`user_id`)
);-- 预约看房表
CREATE TABLE `appointment` (`appoint_id` INT PRIMARY KEY AUTO_INCREMENT,`user_id` INT NOT NULL,`house_id` INT NOT NULL,`appoint_time` DATETIME NOT NULL,`status` ENUM('pending', 'confirmed', 'canceled') DEFAULT 'pending',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`),FOREIGN KEY (`house_id`) REFERENCES `house`(`house_id`)
);-- 订单表
CREATE TABLE `order` (`order_id` VARCHAR(32) PRIMARY KEY COMMENT '订单号(如UUID)',`user_id` INT NOT NULL,`house_id` INT NOT NULL,`total_price` DECIMAL(12,2) NOT NULL,`payment_status` ENUM('unpaid', 'paid') DEFAULT 'unpaid',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`),FOREIGN KEY (`house_id`) REFERENCES `house`(`house_id`)
);-- 房源评价表
CREATE TABLE `comment` (`comment_id` INT PRIMARY KEY AUTO_INCREMENT,`user_id` INT NOT NULL,`house_id` INT NOT NULL,`content` TEXT NOT NULL,`rating` TINYINT CHECK (rating BETWEEN 1 AND 5),`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`),FOREIGN KEY (`house_id`) REFERENCES `house`(`house_id`)
);-- 用户表(包含10条记录)
INSERT INTO `user` (username, password, role, real_name, phone, email, create_time) VALUES('admin', '123456', 'admin', '系统管理员', '13800000000', 'admin@example.com', '2025-03-01 09:00:00'),('sales_01', '123456', 'sales', '张伟', '13911111111', 'sales_01@example.com', '2025-03-01 09:00:00'),('sales_02', '123456', 'sales', '李娜', '13922222222', 'sales_02@example.com', '2025-03-01 09:00:00'),('sales_03', '123456', 'sales', '王刚', '13933333333', 'sales_03@example.com', '2025-03-01 09:00:00'),('customer_01', '123456', 'customer', '陈浩', '13844444444', 'customer_01@example.com', '2025-03-01 09:00:00'),('customer_02', '123456', 'customer', '刘芳', '13855555555', 'customer_02@example.com', '2025-03-01 09:00:00'),('customer_03', '123456', 'customer', '张婷', '13866666666', 'customer_03@example.com', '2025-03-01 09:00:00'),('customer_04', '123456', 'customer', '廖学彬', '13877777777', 'customer_04@example.com', '2025-03-01 09:00:00'),('customer_05', '123456', 'customer', '王芳', '13888888888', 'customer_05@example.com', '2025-03-01 09:00:00'),('customer_06', '123456', 'customer', '赵敏', '13899999999', 'customer_06@example.com', '2025-03-01 09:00:00');-- 房源信息表(10条记录)
INSERT INTO `house` (title, price, area, room_type, address, sales_id, status, description, create_time) VALUES('SOHO', 12000000.00, 150.0, '3室2厅', '北街道', 2, 'listed', '高端商务公寓,带健身房和游泳池', '2025-03-01 09:00:00'),('村学区房', 18000000.00, 120.0, '2室1厅', '北大街', 3, 'sold', '重点小学学区房,南北通透', '2025-03-01 09:00:00'),('陆景房', 25000000.00, 200.0, '4室3厅', '上环路', 4, 'pending', '高层江景住宅,视野开阔', '2025-03-01 09:00:00'),('金街铺', 30000000.00, 80.0, '临街商铺', '北融街', 2, 'listed', '黄金地段商铺,租金回报率高', '2025-03-01 09:00:00'),('东环别墅', 60000000.00, 300.0, '独栋别墅', '北北路', 3, 'sold', '豪华独栋别墅,带私人花园', '2025-03-01 09:00:00'),('科技园写字楼', 80000000.00, 150.0, '甲级写字楼', '深技园', 4, 'pending', '现代化办公大楼,配套完善', '2025-03-01 09:00:00'),('老洋房', 45000000.00, 100.0, '2室1厅', '上路', 2, 'listed', '历史建筑改造,复古风格', '2025-03-01 09:00:00'),('广高端公寓', 10000000.00, 130.0, '3室2厅', '广江新城', 3, 'sold', 'CBD核心区高端公寓', '2025-03-01 09:00:00'),('州湖区景观房', 28000000.00, 180.0, '4室2厅', '州杨公堤', 4, 'pending', '湖滨景观住宅,环境优美', '2025-03-01 09:00:00'),('都府新科技园', 15000000.00, 120.0, '3室2厅', '都府大道', 2, 'listed', '新兴科技产业园区,交通便利', '2025-03-01 09:00:00');-- 预约看房表(10条记录)
INSERT INTO `appointment` (user_id, house_id, appoint_time, status, create_time) VALUES(6, 1, '2025-04-15 10:00:00', 'confirmed', '2025-04-10 09:00:00'),(7, 2, '2025-04-16 14:30:00', 'pending', '2025-04-10 09:00:00'),(8, 3, '2025-04-17 09:00:00', 'canceled', '2025-04-10 09:00:00'),(9, 4, '2025-04-18 11:00:00', 'confirmed', '2025-04-10 09:00:00'),(10,5, '2025-04-19 15:00:00', 'pending', '2025-04-10 09:00:00'),(6, 6, '2025-04-20 10:00:00', 'confirmed', '2025-04-10 09:00:00'),(7, 7, '2025-04-21 14:00:00', 'canceled', '2025-04-10 09:00:00'),(8, 8, '2025-04-22 09:00:00', 'confirmed', '2025-04-10 09:00:00'),(9, 9, '2025-04-23 11:00:00', 'pending', '2025-04-10 09:00:00'),(10,10, '2025-04-24 15:00:00', 'confirmed', '2025-04-10 09:00:00');-- 订单表(10条记录)
INSERT INTO `order` (order_id, user_id, house_id, total_price, payment_status, create_time) VALUES('202504100001', 6, 1, 12000000.00, 'paid', '2025-04-10 09:00:00'),('202504100002', 7, 2, 18000000.00, 'unpaid', '2025-04-10 09:00:00'),('202504100003', 8, 3, 25000000.00, 'paid', '2025-04-10 09:00:00'),('202504100004', 9, 4, 30000000.00, 'unpaid', '2025-04-10 09:00:00'),('202504100005', 10,5, 60000000.00, 'paid', '2025-04-10 09:00:00'),('202504100006', 6, 6, 80000000.00, 'unpaid', '2025-04-10 09:00:00'),('202504100007', 7, 7, 45000000.00, 'paid', '2025-04-10 09:00:00'),('202504100008', 8, 8, 10000000.00, 'unpaid', '2025-04-10 09:00:00'),('202504100009', 9, 9, 28000000.00, 'paid', '2025-04-10 09:00:00'),('202504100010', 10,10, 15000000.00, 'unpaid', '2025-04-10 09:00:00');-- 房源评价表(10条记录)
INSERT INTO `comment` (user_id, house_id, content, rating, create_time) VALUES(6, 1, '房屋设施非常完善,交通便利!', 5, '2025-04-10 09:00:00'),(7, 2, '学区房位置优越,但周边配套一般。', 4, '2025-04-10 09:00:00'),(8, 3, '江景房视野开阔,但物业费较高。', 3, '2025-04-10 09:00:00'),(9, 4, '商铺租金回报率高,适合投资。', 5, '2025-04-10 09:00:00'),(10,5, '别墅面积大,适合家庭居住。', 4, '2025-04-10 09:00:00'),(6,6, '写字楼采光好,租赁需求旺。', 5, '2025-04-10 09:00:00'),(7,7, '老洋房设计独特,但维护成本高。', 3, '2025-04-10 09:00:00'),(8,8, '公寓性价比高,适合年轻人。', 4, '2025-04-10 09:00:00'),(9,9, '景观房环境优美,但离市区较远。', 3, '2025-04-10 09:00:00'),(10,10, '科技园区交通便利,未来发展潜力大。', 5, '2025-04-10 09:00:00');# 1. 查询客户所有预约记录(含房源信息)需要对应销售经理
SELECTu.real_name AS customer_name,u.user_id AS customer_id,a.appoint_time,a.status,h.title,h.address,h.price,h.room_type,s.real_name,s.phone
FROMappointment aINNER JOIN user u ON a.user_id = u.user_idLEFT JOIN house h ON a.house_id = h.house_idINNER JOIN user s ON h.sales_id = s.user_id
WHEREu.role = 'customer'
ORDER BYa.create_time DESC;# 2. 查询客户所有订单(含房源信息)
SELECT o.order_id, u.real_name AS customer_name,  u.user_id AS customer_id,o.total_price,o.payment_status, h.title, h.address, h.status AS house_status
FROM `order` oJOIN user u ON o.user_id = u.user_idJOIN house h ON o.house_id = h.house_id
WHERE u.role = 'customer'
ORDER BY o.create_time DESC;# 3. 统计销售经理名下所有房源销售情况和销售金额 ,并列出房源位置信息,和交易时间
SELECT u.real_name AS sales_manager,COUNT(DISTINCT h.house_id) AS sold_count,SUM(o.total_price) AS total_sales
FROM house hJOIN user u ON h.sales_id = u.user_idJOIN `order` o ON h.house_id = o.house_id
WHERE u.role = 'sales' AND h.status = 'sold'
GROUP BY u.user_id;# 4. 查看房源详情及评价列表
SELECT h.title, h.price, h.area, h.room_type, h.address,c.content AS evaluation, c.rating,c.house_id, c.content,  c.create_time AS eval_time
FROM house hLEFT JOIN comment c ON h.house_id = c.house_id
ORDER BY h.house_id, c.create_time DESC;

step2:fastapi路由和查询 C:\Users\Administrator\PycharmProjects\FastAPIProject\main.py

from fastapi import FastAPI, HTTPException
import pymysql.cursors
app = FastAPI()
# 数据库连接配置
DB_CONFIG = {'host': 'localhost','user': 'root','password': '123456','db': 'school_db','charset': 'utf8mb4','cursorclass': pymysql.cursors.DictCursor
}
# 查询数据库的函数
def query_database(query: str, params=None):try:connection = pymysql.connect(**DB_CONFIG)with connection.cursor() as cursor:cursor.execute(query, params)result = cursor.fetchall()connection.close()return resultexcept Exception as e:raise HTTPException(status_code=500, detail=str(e))@app.get("/customer_appointments/{customer_id}")
async def get_customer_appointments(customer_id: int):query = """SELECT a.appoint_time, a.status, a.create_time,h.title, h.address, h.room_type, h.price,s.real_name AS sales_manager, s.phoneFROM appointment aINNER JOIN user u ON a.user_id = u.user_idLEFT JOIN house h ON a.house_id = h.house_idINNER JOIN user s ON h.sales_id = s.user_idWHERE u.role = 'customer' AND a.user_id = %sORDER BY a.create_time DESC"""data = query_database(query, (customer_id,))return {"data": data}@app.get("/customer_orders/{customer_id}")
async def get_customer_orders(customer_id: int):query = """SELECT o.order_id, o.total_price, o.payment_status, o.create_time,h.title, h.address, h.status AS house_statusFROM `order` oJOIN user u ON o.user_id = u.user_idJOIN house h ON o.house_id = h.house_idWHERE u.role = 'customer' AND o.user_id = %sORDER BY o.create_time DESC"""data = query_database(query, (customer_id,))return {"data": data}@app.get("/sales_stats/{sales_id}")
async def get_sales_stats(sales_id: int):query = """SELECT COUNT(DISTINCT o.house_id) AS sold_count,SUM(o.total_price) AS total_sales,AVG(o.total_price) AS avg_priceFROM `order` oJOIN house h ON o.house_id = h.house_idWHERE h.sales_id = %s AND h.status = 'sold'"""data = query_database(query, (sales_id,))return {"data": data[0] if data else {}}@app.get("/house_details/{house_id}")
async def get_house_details(house_id: int):# 房源基本信息house_query = """SELECT title, price, area, room_type, address, description, status, create_timeFROM house WHERE house_id = %s"""house_data = query_database(house_query, (house_id,))# 关联评价信息comment_query = """SELECT c.content, c.rating, c.create_time, u.real_nameFROM comment cJOIN user u ON c.user_id = u.user_idWHERE c.house_id = %sORDER BY c.create_time DESC"""comment_data = query_database(comment_query, (house_id,))return {"house_info": house_data[0] if house_data else {},"comments": comment_data}
# 启动应用
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

step3:postman验证

用fastapi帮我写4个查询接口,参考下面的代码格式 
1. 查询客户所有预约记录(含房源信息)需要对应销售经理 
2. 查询客户所有订单(含房源信息)3. 统计销售经理名下所有房源销售情况和销售金额4. 查看房源详情及评价列表http://localhost:8000/customer_appointments/6{"data": [{"appoint_time": "2025-04-15T10:00:00","status": "confirmed","create_time": "2025-04-10T09:00:00","title": "朝","address": "街道","room_type": "3室2厅","price": 12000000.0,"sales_manager": "张伟","phone": "13911111111"},{"appoint_time": "2025-04-20T10:00:00","status": "confirmed","create_time": "2025-04-10T09:00:00","title": "字楼","address": "技园","room_type": "楼","price": 80000000.0,"sales_manager": "王刚","phone": "13933333333"}]
}http://localhost:8000/customer_orders/6{"data": [{"order_id": "202504100001","total_price": 12000000.0,"payment_status": "paid","create_time": "2025-04-10T09:00:00","title": "","address": "道","house_status": "listed"},{"order_id": "202504100006","total_price": 80000000.0,"payment_status": "unpaid","create_time": "2025-04-10T09:00:00","title": "字楼","address": "技园","house_status": "pending"}]
}http://localhost:8000/sales_stats/3{"data": {"sold_count": 3,"total_sales": 88000000.0,"avg_price": 29333333.333333}
}http://localhost:8000/house_details/1{"house_info": {"title": "","price": 12000000.0,"area": 150.0,"room_type": "3室2厅","address": "道","description": "高端商务公寓,带健身房和游泳池","status": "listed","create_time": "2025-03-01T09:00:00"},"comments": [{"content": "房屋设施非常完善,交通便利!","rating": 5,"create_time": "2025-04-10T09:00:00","real_name": "刘芳"}]
}

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30660.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch是哪家的

Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…

Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring? spring是一个开源轻量级的java开发应用框架,可以简化企业级应用开发 轻量级 1.轻量级(对于运行环境没有额外要求) 2.代码移植性高(不需要实现额外接口) JavaEE的解决方案 Spring更像是一种解决方案,对于控制层,它有Spring…

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序: …

前端学习——CSS

CSS CSS(Cascading Style Sheets)级联样式表语法 选择器全局选择器元素选择器类选择器ID选择器合并选择器选择器的优先级 字体属性字体颜色 背景属性background-color属性background-image属性background-repeat属性background-size属性background-posit…

【Python 2D绘图】Matplotlib绘图(统计图表)

【Python 2D绘图】Matplotlib绘图(统计图表) 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…

学习笔记:Python网络编程初探之基本概念(一)

一、网络目的 让你设备上的数据和其他设备上进行共享,使用网络能够把多方链接在一起,然后可以进行数据传递。 网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…

Spark-TTS:基于大模型的文本语音合成工具

GitHub:https://github.com/SparkAudio/Spark-TTS Spark-TTS是一个先进的文本到语音系统,它利用大型语言模型(LLM)的强大功能进行高度准确和自然的语音合成;旨在高效、灵活、强大地用于研究和生产用途。 一、介绍 Sp…

【RAG】检索后排序 提高回答精度

问题: RAG中,有时,最合适的答案不一定排在检索的最前面 user_query "how safe is llama 2" search_results vector_db.search(user_query, 5)for doc in search_results[documents][0]:print(doc"\n")response bot.chat(user_qu…

线程安全问题(面试重难点)

这里只是简单介绍以下线程安全,具体情况要结合代码进行判断 线程 是随机调度,及 抢占式执行 ,具有随机性,就可能会让我们的结果出现不同 当我们得到的结果并不是我们想要的时候(不符合需求),就会被认定为BUG,此时就是出现了线程安全问题 那么存在线程不安全的代码就被认为是…

数据结构第七节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 ,是一种 二叉搜索树 ,但 在每个结点上增加一个存储位表示结点的颜色,可以是 Red和 Black 。 通过对 任何…

读书报告」网络安全防御实战--蓝军武器库

一眨眼,20天过去了,刷完了这本书「网络安全防御实战--蓝军武器库」,回味无穷,整理概览如下,可共同交流读书心得。在阅读本书的过程中,我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…

从传统到智能:Node-red工控机助力农业大棚高效监控

智慧农业逐渐成为现代农业发展的主流方向。在这一背景下,农业用工控机(简称“农控机”)作为智慧农业的核心设备之一,正在为农业大棚的智能化管理提供强有力的支持。本文将详细探讨农控机在智慧农业大棚监控中的应用,并…

硬件学习笔记--48 磁保持继电器相关基础知识介绍

目录 1.磁保持继电器工作原理 2.磁保持继电器内部结构及组成部分 3.磁保持继电器主要参数 4.总结 1.磁保持继电器工作原理 磁保持继电器利用永磁体的磁场和线圈通电产生的磁场相互作用,实现触点的切换。其特点在于线圈断电后,触点状态仍能保持&#…

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现) 目录 WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现WOA-Transformer鲸鱼算法优化编…

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service 四层负载均衡Service 在k8s中,访问pod可以通过ip端口的方式,但是pod是由生命 周期的,pod在重启的时候ip地址往往会发生变化,访问pod就需要新的ip地址,这样就会很麻烦,每次pod地址改变就…

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…

LLM 模型 Prompt 工程

目录 1、Prompt 基础概念 2、Prompt 主要构成 3、Prompt 相关技术 3.1、思维链 3.2、自洽性 3.3、思维树 1、Prompt 基础概念 Prompt 工程是通过设计和优化自然语言提示&#xff08;Prompt&#xff09;&#xff0c;引导LLM生成符合特定任务需求的输出的技术。其核心目标是…

Springboot基础篇(4):自动配置原理

1 自动配置原理剖析 1.1 加载配置类的源码追溯 自动配置的触发入口&#xff1a; SpringBootApplication 组合注解是自动配置的起点&#xff0c;其核心包含 EnableAutoConfiguration&#xff0c;该注解使用AutoConfigurationImportSelector 实现配置类的动态加载。 启动类的注…

【大模型系列】开发工具Cursor使用配置及备忘

开发工具cursor使用过程的配置备忘 最近一段时间大模型开发工具cursor是比较火爆的&#xff0c;其提供的一个比较有价值的特性就是其ai辅助功能&#xff0c;其内部集成了若干大模型 提供免费使用期&#xff1b; 做大模型开发这个话题应该是绕不过的&#xff0c;就像开发java使…

vtkAppendPolyData vtkMultiBlockDataGroupFilter 区别 合并数据

Summary: vtkAppendPolyData vtkMultiBlockDataGroupFilter 区别 两个都是合并数据&#xff1b; 用于处理多块数据集的两种不同的过滤器&#xff08;filters&#xff09;&#xff0c;它们在处理和合并多块数据集方面有不同的用途和实现方式。 Part2:区别 它们的主要区别在于…