house_service3.0.py
This commit is contained in:
+262
@@ -0,0 +1,262 @@
|
|||||||
|
from house_service import *
|
||||||
|
|
||||||
|
def print_menu():
|
||||||
|
print("\n===== 房屋出租系统 V4.0 =====")
|
||||||
|
print("1. 新增房源")
|
||||||
|
print("2. 删除房源")
|
||||||
|
print("3. 修改房源")
|
||||||
|
print("4. 查询房源")
|
||||||
|
print("5. 查看/管理操作记录")
|
||||||
|
print("6. 查看/管理浏览历史")
|
||||||
|
print("7. 地址字符串解析测试")
|
||||||
|
print("8. 按区域关键词模糊查询")
|
||||||
|
print("9. 初始化小区邻接矩阵")
|
||||||
|
print("10. 更新小区间距离")
|
||||||
|
# 【V4.0 新增菜单】
|
||||||
|
print("11. 房源二叉树范围查询(租金/面积)")
|
||||||
|
print("12. 房源冒泡排序(租金/面积)")
|
||||||
|
print("13. 房源快速排序(租金/面积)")
|
||||||
|
print("14. 退出系统")
|
||||||
|
print("============================")
|
||||||
|
|
||||||
|
# V2操作记录子菜单
|
||||||
|
def op_record_menu():
|
||||||
|
while True:
|
||||||
|
print("\n----- 操作记录管理 -----")
|
||||||
|
print("1. 查看最近10条")
|
||||||
|
print("2. 取出最新一条")
|
||||||
|
print("3. 清空记录")
|
||||||
|
print("4. 返回")
|
||||||
|
c = input("请选择:")
|
||||||
|
if c == "1":
|
||||||
|
lst = get_recent_records("operation", 10)
|
||||||
|
print(lst if lst else "暂无记录")
|
||||||
|
elif c == "2":
|
||||||
|
print(pop_operation_stack() or "暂无记录")
|
||||||
|
elif c == "3":
|
||||||
|
clear_stack("operation")
|
||||||
|
elif c == "4":
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("输入有误")
|
||||||
|
|
||||||
|
|
||||||
|
#v2
|
||||||
|
def browse_history_menu():
|
||||||
|
while True:
|
||||||
|
print("\n----- 浏览历史管理 -----")
|
||||||
|
print("1. 查看最近10条")
|
||||||
|
print("2. 取出最新一条")
|
||||||
|
print("3. 清空历史")
|
||||||
|
print("4. 返回")
|
||||||
|
c = input("请选择:")
|
||||||
|
if c == "1":
|
||||||
|
id_list = get_recent_records("browse", 10)
|
||||||
|
if not id_list:
|
||||||
|
print("暂无浏览历史")
|
||||||
|
continue
|
||||||
|
for idx, hid in enumerate(id_list, 1):
|
||||||
|
info = query_house("id", hid)
|
||||||
|
if info:
|
||||||
|
h = info[0]
|
||||||
|
print(f"{idx}. ID:{hid} 地址:{h['address']}")
|
||||||
|
else:
|
||||||
|
print(f"{idx}. ID:{hid} 房源已不存在")
|
||||||
|
elif c == "2":
|
||||||
|
hid = pop_browse_stack()
|
||||||
|
if not hid:
|
||||||
|
print("暂无浏览历史")
|
||||||
|
continue
|
||||||
|
info = query_house("id", hid)
|
||||||
|
print(f"最近浏览ID:{hid}")
|
||||||
|
elif c == "3":
|
||||||
|
clear_stack("browse")
|
||||||
|
elif c == "4":
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("输入有误")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
while True:
|
||||||
|
print_menu()
|
||||||
|
choice = input("请输入功能编号:")
|
||||||
|
|
||||||
|
#v1
|
||||||
|
if choice == "1":
|
||||||
|
addr = input("输入房源地址:")
|
||||||
|
try:
|
||||||
|
price = float(input("输入月租金:"))
|
||||||
|
area = float(input("输入面积:"))
|
||||||
|
except:
|
||||||
|
print("租金面积必须是数字!")
|
||||||
|
continue
|
||||||
|
htype = input("输入户型:")
|
||||||
|
if add_house(addr, price, area, htype):
|
||||||
|
new_id = get_next_house_id() - 1
|
||||||
|
push_operation_stack(f"新增房源ID:{new_id} 地址:{addr}")
|
||||||
|
|
||||||
|
elif choice == "2":
|
||||||
|
try:
|
||||||
|
hid = int(input("输入要删除房源ID:"))
|
||||||
|
res = query_house("id", hid)
|
||||||
|
addr = res[0]["address"] if res else "未知地址"
|
||||||
|
if delete_house(hid):
|
||||||
|
push_operation_stack(f"删除房源ID:{hid} 地址:{addr}")
|
||||||
|
except:
|
||||||
|
print("ID必须是整数")
|
||||||
|
|
||||||
|
elif choice == "3":
|
||||||
|
try:
|
||||||
|
hid = int(input("输入要修改房源ID:"))
|
||||||
|
edit = {}
|
||||||
|
a = input("新地址(回车不修改):")
|
||||||
|
if a: edit["address"] = a
|
||||||
|
p = input("新租金(回车不修改):")
|
||||||
|
if p: edit["price"] = float(p)
|
||||||
|
ar = input("新面积(回车不修改):")
|
||||||
|
if ar: edit["area"] = float(ar)
|
||||||
|
t = input("新户型(回车不修改):")
|
||||||
|
if t: edit["house_type"] = t
|
||||||
|
if edit:
|
||||||
|
if update_house(hid, edit):
|
||||||
|
push_operation_stack(f"修改房源ID:{hid} 变更:{edit}")
|
||||||
|
else:
|
||||||
|
print("未填写任何修改内容")
|
||||||
|
except:
|
||||||
|
print("输入格式错误")
|
||||||
|
|
||||||
|
elif choice == "4":
|
||||||
|
print("1-ID 2-地址 3-租金 4-户型")
|
||||||
|
sel = input("选择查询类型:")
|
||||||
|
map_dic = {"1": "id", "2": "address", "3": "price", "4": "house_type"}
|
||||||
|
if sel not in map_dic:
|
||||||
|
print("选择无效")
|
||||||
|
continue
|
||||||
|
val = input("输入查询值:")
|
||||||
|
res_list = query_house(map_dic[sel], val)
|
||||||
|
if not res_list:
|
||||||
|
print("未找到房源")
|
||||||
|
continue
|
||||||
|
for h in res_list:
|
||||||
|
print(f"ID:{h['id']} 地址:{h['address']} 租金:{h['price']}")
|
||||||
|
if map_dic[sel] == "id":
|
||||||
|
push_browse_stack(h["id"])
|
||||||
|
|
||||||
|
# v2
|
||||||
|
elif choice == "5":
|
||||||
|
op_record_menu()
|
||||||
|
elif choice == "6":
|
||||||
|
browse_history_menu()
|
||||||
|
|
||||||
|
#v3
|
||||||
|
elif choice == "7":
|
||||||
|
full_addr = input("输入完整地址(如:四川省德阳市什邡市XX小区):")
|
||||||
|
res = parse_address_string(full_addr)
|
||||||
|
print("解析结果:", res)
|
||||||
|
|
||||||
|
elif choice == "8":
|
||||||
|
keyword = input("输入区域关键词(如:什邡、德阳):")
|
||||||
|
res_list = fuzzy_query_by_district(keyword)
|
||||||
|
if not res_list:
|
||||||
|
print("未找到该区域房源")
|
||||||
|
else:
|
||||||
|
for h in res_list:
|
||||||
|
print(f"ID:{h['id']} 地址:{h['address']}")
|
||||||
|
|
||||||
|
elif choice == "9":
|
||||||
|
community_input = input("输入所有小区名称,用英文逗号分隔:")
|
||||||
|
community_list = community_input.split(",")
|
||||||
|
init_community_matrix(community_list)
|
||||||
|
|
||||||
|
elif choice == "10":
|
||||||
|
c1 = input("输入小区A名称:")
|
||||||
|
c2 = input("输入小区B名称:")
|
||||||
|
try:
|
||||||
|
dis = float(input("输入两小区距离:"))
|
||||||
|
update_matrix_distance(c1, c2, dis)
|
||||||
|
except:
|
||||||
|
print("距离必须是数字")
|
||||||
|
|
||||||
|
# v4
|
||||||
|
elif choice == "11":
|
||||||
|
# 二叉树范围查询
|
||||||
|
print("请选择查询维度:1-租金 2-面积")
|
||||||
|
dim_choice = input("输入维度编号:")
|
||||||
|
key_field = "price" if dim_choice == "1" else "area"
|
||||||
|
field_name = "租金" if dim_choice == "1" else "面积"
|
||||||
|
|
||||||
|
try:
|
||||||
|
min_val = float(input(f"输入{field_name}最小值:"))
|
||||||
|
max_val = float(input(f"输入{field_name}最大值:"))
|
||||||
|
except:
|
||||||
|
print("数值必须是数字!")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 读取所有房源,构建二叉树
|
||||||
|
all_houses = read_houses()
|
||||||
|
if not all_houses:
|
||||||
|
print("暂无房源数据!")
|
||||||
|
continue
|
||||||
|
bst_root = build_house_bst(all_houses, key_field)
|
||||||
|
# 范围查询
|
||||||
|
result = search_bst_range(bst_root, min_val, max_val, key_field)
|
||||||
|
if not result:
|
||||||
|
print(f"未找到{field_name}在{min_val}-{max_val}之间的房源")
|
||||||
|
else:
|
||||||
|
print(f"\n{field_name}在{min_val}-{max_val}之间的房源:")
|
||||||
|
for h in result:
|
||||||
|
print(f"ID:{h['id']} 地址:{h['address']} {field_name}:{h[key_field]}")
|
||||||
|
|
||||||
|
elif choice == "12":
|
||||||
|
# 冒泡排序
|
||||||
|
print("请选择排序维度:1-租金 2-面积")
|
||||||
|
dim_choice = input("输入维度编号:")
|
||||||
|
sort_field = "price" if dim_choice == "1" else "area"
|
||||||
|
field_name = "租金" if dim_choice == "1" else "面积"
|
||||||
|
|
||||||
|
print("请选择排序方式:1-升序 2-降序")
|
||||||
|
sort_way = input("输入方式编号:")
|
||||||
|
reverse = (sort_way == "2")
|
||||||
|
|
||||||
|
all_houses = read_houses()
|
||||||
|
if not all_houses:
|
||||||
|
print("暂无房源数据!")
|
||||||
|
continue
|
||||||
|
# 冒泡排序
|
||||||
|
sorted_houses = bubble_sort_houses(all_houses, sort_field, reverse)
|
||||||
|
print(f"\n按{field_name}{'降序' if reverse else '升序'}排序结果(冒泡排序):")
|
||||||
|
for h in sorted_houses:
|
||||||
|
print(f"ID:{h['id']} 地址:{h['address']} {field_name}:{h[sort_field]}")
|
||||||
|
|
||||||
|
elif choice == "13":
|
||||||
|
# 快速排序
|
||||||
|
print("请选择排序维度:1-租金 2-面积")
|
||||||
|
dim_choice = input("输入维度编号:")
|
||||||
|
sort_field = "price" if dim_choice == "1" else "area"
|
||||||
|
field_name = "租金" if dim_choice == "1" else "面积"
|
||||||
|
|
||||||
|
print("请选择排序方式:1-升序 2-降序")
|
||||||
|
sort_way = input("输入方式编号:")
|
||||||
|
reverse = (sort_way == "2")
|
||||||
|
|
||||||
|
all_houses = read_houses()
|
||||||
|
if not all_houses:
|
||||||
|
print("暂无房源数据!")
|
||||||
|
continue
|
||||||
|
# 快速排序
|
||||||
|
sorted_houses = quick_sort_houses(all_houses, sort_field, reverse)
|
||||||
|
print(f"\n按{field_name}{'降序' if reverse else '升序'}排序结果(快速排序):")
|
||||||
|
for h in sorted_houses:
|
||||||
|
print(f"ID:{h['id']} 地址:{h['address']} {field_name}:{h[sort_field]}")
|
||||||
|
|
||||||
|
elif choice == "14":
|
||||||
|
print("系统退出成功!")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("请输入有效编号")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user