From 2a26acec8a2a91833aed8cdc55baa09b7ea5085b Mon Sep 17 00:00:00 2001
From: 123 <2070873540@qq.com>
Date: Mon, 27 May 2024 12:01:00 +0800
Subject: [PATCH] 0527
---
智能家居系统/.idea/.gitignore | 8 +
智能家居系统/.idea/dataSources.xml | 12 ++
.../inspectionProfiles/profiles_settings.xml | 6 +
智能家居系统/.idea/misc.xml | 7 +
智能家居系统/.idea/modules.xml | 8 +
.../.idea/智能家居系统.iml | 10 +
智能家居系统/1.py | 182 ++++++++++++++++++
智能家居系统/2.py | 7 +
.../__pycache__/主页面.cpython-311.pyc | Bin 0 -> 1855 bytes
.../__pycache__/家居.cpython-311.pyc | Bin 0 -> 1881 bytes
.../__pycache__/家居信息.cpython-311.pyc | Bin 0 -> 1887 bytes
.../__pycache__/测试.cpython-311.pyc | Bin 0 -> 1637 bytes
智能家居系统/user_data.json | 1 +
智能家居系统/user_info.txt | 0
智能家居系统/主页面.py | 26 +++
智能家居系统/增删改查窗口.html | 32 +++
智能家居系统/家居信息.py | 182 ++++++++++++++++++
智能家居系统/智能家居数据库.py | 89 +++++++++
智能家居系统/测试.py | 22 +++
智能家居系统/登录界面.py | 45 +++++
计科2101 雷浩 21412030125.doc | Bin 0 -> 723456 bytes
21 files changed, 637 insertions(+)
create mode 100644 智能家居系统/.idea/.gitignore
create mode 100644 智能家居系统/.idea/dataSources.xml
create mode 100644 智能家居系统/.idea/inspectionProfiles/profiles_settings.xml
create mode 100644 智能家居系统/.idea/misc.xml
create mode 100644 智能家居系统/.idea/modules.xml
create mode 100644 智能家居系统/.idea/智能家居系统.iml
create mode 100644 智能家居系统/1.py
create mode 100644 智能家居系统/2.py
create mode 100644 智能家居系统/__pycache__/主页面.cpython-311.pyc
create mode 100644 智能家居系统/__pycache__/家居.cpython-311.pyc
create mode 100644 智能家居系统/__pycache__/家居信息.cpython-311.pyc
create mode 100644 智能家居系统/__pycache__/测试.cpython-311.pyc
create mode 100644 智能家居系统/user_data.json
create mode 100644 智能家居系统/user_info.txt
create mode 100644 智能家居系统/主页面.py
create mode 100644 智能家居系统/增删改查窗口.html
create mode 100644 智能家居系统/家居信息.py
create mode 100644 智能家居系统/智能家居数据库.py
create mode 100644 智能家居系统/测试.py
create mode 100644 智能家居系统/登录界面.py
create mode 100644 计科2101 雷浩 21412030125.doc
diff --git a/智能家居系统/.idea/.gitignore b/智能家居系统/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/智能家居系统/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/智能家居系统/.idea/dataSources.xml b/智能家居系统/.idea/dataSources.xml
new file mode 100644
index 0000000..9540313
--- /dev/null
+++ b/智能家居系统/.idea/dataSources.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ mysql.8
+ true
+ com.mysql.cj.jdbc.Driver
+ jdbc:mysql://localhost:3306/智能家居系统
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/智能家居系统/.idea/inspectionProfiles/profiles_settings.xml b/智能家居系统/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/智能家居系统/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/智能家居系统/.idea/misc.xml b/智能家居系统/.idea/misc.xml
new file mode 100644
index 0000000..b377d79
--- /dev/null
+++ b/智能家居系统/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/智能家居系统/.idea/modules.xml b/智能家居系统/.idea/modules.xml
new file mode 100644
index 0000000..05948d0
--- /dev/null
+++ b/智能家居系统/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/智能家居系统/.idea/智能家居系统.iml b/智能家居系统/.idea/智能家居系统.iml
new file mode 100644
index 0000000..2c80e12
--- /dev/null
+++ b/智能家居系统/.idea/智能家居系统.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/智能家居系统/1.py b/智能家居系统/1.py
new file mode 100644
index 0000000..d2aa9ae
--- /dev/null
+++ b/智能家居系统/1.py
@@ -0,0 +1,182 @@
+import tkinter as tk
+import pymysql
+from tkinter import messagebox
+
+
+class JiaJuPage:
+ def __init__(self, master):
+ self.root = master
+ self.page = tk.Frame(self.root)
+ self.page.pack()
+ self.root.geometry('600x400')
+ self.create_page()
+
+ def create_page(self):
+ menubar = tk.Menu(self.root)
+
+ # 数据库连接配置
+ self.conn = pymysql.connect(host='localhost', user='root', password='LH20021212', db='智能家居系统',
+ charset='utf8mb4')
+ self.cursor = self.conn.cursor()
+
+ menubar.add_command(label='录入家居', command=self.add_jiaju)
+ menubar.add_command(label='查询家居', command=self.query_jiaju)
+ menubar.add_command(label='删除家居', command=self.delete_jiaju)
+ menubar.add_command(label='修改家居', command=self.update_jiaju)
+ menubar.add_separator() # 添加分隔线使菜单更加清晰
+ menubar.add_command(label='退出', command=self.exit_app) # 新增退出功能
+
+ self.root.config(menu=menubar)
+
+ def exit_app(self):
+ """退出应用程序的函数"""
+ if messagebox.askyesno("退出确认", "确定要退出吗?"):
+ self.close_conn() # 确保关闭数据库连接
+ self.root.destroy() # 关闭主窗口
+
+ def add_jiaju(self):
+ def submit():
+ # 获取用户输入
+ name = entry_name.get()
+ color = entry_color.get()
+ brand = entry_brand.get()
+ price = entry_price.get()
+ production_date = entry_production_date.get()
+ # 插入数据库操作
+ sql = f"INSERT INTO jia_ju(name, color, brand, price, production_date) VALUES ('{name}', '{color}', '{brand}', {price}, '{production_date}')"
+ try:
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo("成功", "家居信息录入成功!")
+ except Exception as e:
+ messagebox.showerror("错误", f"录入失败: {e}")
+ finally:
+ add_window.destroy() # 关闭对话框
+
+ add_window = tk.Toplevel(self.root)
+ add_window.title("录入家居信息")
+ tk.Label(add_window, text="名称:").pack()
+ entry_name = tk.Entry(add_window)
+ entry_name.pack()
+ tk.Label(add_window, text="颜色:").pack()
+ entry_color = tk.Entry(add_window)
+ entry_color.pack()
+ tk.Label(add_window, text="品牌:").pack()
+ entry_brand = tk.Entry(add_window)
+ entry_brand.pack()
+ tk.Label(add_window, text="价格:").pack()
+ entry_price = tk.Entry(add_window)
+ entry_price.pack()
+ tk.Label(add_window, text="生产日期:").pack()
+ entry_production_date = tk.Entry(add_window)
+ entry_production_date.pack()
+ tk.Button(add_window, text="提交", command=submit).pack()
+
+ def query_jiaju(self):
+ self.cursor.execute("SELECT * FROM jia_ju")
+ results = self.cursor.fetchall()
+ if results:
+ result_text = "\n".join([str(row) for row in results])
+ messagebox.showinfo("查询结果", result_text)
+ else:
+ messagebox.showinfo("查询结果", "无数据")
+
+ def delete_jiaju(self):
+ def confirm_delete():
+ item_id = entry_id.get()
+ # 执行删除操作
+ sql = f"DELETE FROM jia_ju WHERE id={item_id}"
+ try:
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo("成功", "家居信息已删除!")
+ except Exception as e:
+ messagebox.showerror("错误", f"删除失败: {e}")
+ finally:
+ delete_window.destroy()
+
+ delete_window = tk.Toplevel(self.root)
+ delete_window.title("删除家居")
+ tk.Label(delete_window, text="请输入家居ID:").pack()
+ entry_id = tk.Entry(delete_window)
+ entry_id.pack()
+ tk.Button(delete_window, text="确认删除", command=confirm_delete).pack()
+
+ def update_jiaju(self):
+ def fetch_jiaju_info():
+ item_id = entry_id.get()
+ sql = f"SELECT * FROM jia_ju WHERE id={item_id}"
+ try:
+ self.cursor.execute(sql)
+ result = self.cursor.fetchone()
+ if result:
+ entry_name.delete(0, tk.END)
+ entry_name.insert(tk.END, result[1])
+ entry_color.delete(0, tk.END)
+ entry_color.insert(tk.END, result[2])
+ entry_brand.delete(0, tk.END)
+ entry_brand.insert(tk.END, result[3])
+ entry_price.delete(0, tk.END)
+ entry_price.insert(tk.END, str(result[4]))
+ entry_production_date.delete(0, tk.END)
+ entry_production_date.insert(tk.END, result[5])
+ else:
+ messagebox.showinfo("查询结果", "未找到该家居信息")
+ except Exception as e:
+ messagebox.showerror("错误", f"查询失败: {e}")
+
+ def submit_update():
+ item_id = entry_id.get()
+ name = entry_name.get()
+ color = entry_color.get()
+ brand = entry_brand.get()
+ price = entry_price.get()
+ production_date = entry_production_date.get()
+ sql = f"UPDATE jia_ju SET name='{name}', color='{color}', brand='{brand}', price={price}, production_date='{production_date}' WHERE id={item_id}"
+ try:
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo("成功", "家居信息已更新!")
+ except Exception as e:
+ messagebox.showerror("错误", f"更新失败: {e}")
+ finally:
+ update_window.destroy()
+
+ update_window = tk.Toplevel(self.root)
+ update_window.title("修改家居信息")
+ tk.Label(update_window, text="请输入家居ID:").pack()
+ entry_id = tk.Entry(update_window)
+ entry_id.pack()
+ tk.Button(update_window, text="查询", command=fetch_jiaju_info).pack()
+
+ tk.Label(update_window, text="名称:").pack()
+ entry_name = tk.Entry(update_window)
+ entry_name.pack()
+ tk.Label(update_window, text="颜色:").pack()
+ entry_color = tk.Entry(update_window)
+ entry_color.pack()
+ tk.Label(update_window, text="品牌:").pack()
+ entry_brand = tk.Entry(update_window)
+ entry_brand.pack()
+ tk.Label(update_window, text="价格:").pack()
+ entry_price = tk.Entry(update_window)
+ entry_price.pack()
+ tk.Label(update_window, text="生产日期:").pack()
+ entry_production_date = tk.Entry(update_window)
+ entry_production_date.pack()
+
+ tk.Button(update_window, text="提交修改", command=submit_update).pack()
+
+ def close_conn(self):
+ # 关闭数据库连接
+ self.cursor.close()
+ self.conn.close()
+
+
+if __name__ == '__main__':
+ root = tk.Tk()
+ app = JiaJuPage(root)
+
+ # 确保在程序结束时关闭数据库连接
+ root.protocol("WM_DELETE_WINDOW", app.close_conn)
+ root.mainloop()
\ No newline at end of file
diff --git a/智能家居系统/2.py b/智能家居系统/2.py
new file mode 100644
index 0000000..6f5404f
--- /dev/null
+++ b/智能家居系统/2.py
@@ -0,0 +1,7 @@
+from 测试 import db, Jia
+
+s1 = Jia(编号=1, 名称='电脑', 品牌='联想', 颜色='黑色', 价格='5000', 生产日期='2020-01-01')
+s2 = Jia(编号=2, 名称='冰箱', 品牌='联想', 颜色='白色', 价格='6000', 生产日期='2020-01-02')
+s3 = Jia(编号=2, 名称='电视机', 品牌='联想', 颜色='黑色', 价格='3000', 生产日期='2020-01-02')
+db.session.add(s)
+db.session.commit()
\ No newline at end of file
diff --git a/智能家居系统/__pycache__/主页面.cpython-311.pyc b/智能家居系统/__pycache__/主页面.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7fc05826844a99a9a3017e394cfd74b246720937
GIT binary patch
literal 1855
zcmb7E&u<$=6rTNIdz_?6(^`-kM4SedX+Z9s;5~z3iU4hvUk@tlQ@;
zdnelt(S*+R1hj<8{`Lr0KRCCB;0(lZ7I-O>O-zLnDQZ9k`fG^97)<}D`A8hNW8;wFKUNLz5wt@=Os>CVF&-^N7xB=}h%
zW#n>dUaRwKDu!v08+~u8GeoD|T<^OEd8;
z_OM>0Iwo
zl(*+pz2%|DAlAv|E^=_K^f*;07yP<0M?n<5ry=@$Pc@JydIP=}8tAZSO~)tU8_B_y
zsVK1^3s~879{zZzR+MwyS%{wGf#PJA@_U_0YN5a|2kC}Upiv&i({i@=H-4p+&8zfz
zu<^2(AAx8{f*{mT$adcvddBX28*-ljyFD!aFi%GX7xf-LV^&mM;~Zrx8GM7$DAO{{b)Io%sL&
literal 0
HcmV?d00001
diff --git a/智能家居系统/__pycache__/家居.cpython-311.pyc b/智能家居系统/__pycache__/家居.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6a8c86fd2c8fb67028841c2484cb36ce0e714f81
GIT binary patch
literal 1881
zcmb7E-D@0G6hC)9vNxaBWtHs)p-9p=4~9)qiy}T1KLXhZ?TbrbnC?vCe$IM#7ED-S
z)dW`w`Vz?&3thxSq@^MS(U#JGVK*#f8K@NOrtRBG^u;I7oykmQ+Z4>*xo6M)o!>cg
z?z!jAkE5eQfaAM*V(~Wt;7`8rhIF9pZ=kXXI_M+^Ng}{IpbM*@i`(dN6{kCrf+6Zs
z)>*T-00zl;5nvlBS3M#mWwZ*0yiE|r=?(&h+!*jy!T)}5f_a>GrXoM$v_vXM_Tufw
z5Zwd=Gu9y~=wua=BF{T1>Ed}%Bztf+t<9F-*OrWwzX|ja59aD&h2paHp;;(0Gh?Kzg}qBRAAWwjd;Qn$FKZ8O+mR=GTVWQ_O|SyC
zjIZM%`Hj$j7@v>|Y4}IZ1A0Rz*Mxp99^BKo;xV|=F}U(ExC2LU1N%O@oh#&8=eAN+~=a^H8DGZ
zAR9%o^4wud2AY2uO{FaqRk$0DY)sWBE-S6@L_0iD3*Dp7?9%ZaI^LLW((x9ZY15e|
zop}n}IhuVu_#W?nx3lX@*!?Yfx=l|vy@!P{(}W`Pn^wTvt*Z8rs^(3-oa6e4s(w_~
za;}9vi(F^xKY`=t)`DL{#szQc(is$0|JM^_dAtX{7#otOdhn!h!|@LXV9q-j|A5=Vg{*sUlv8u2S!6FDewft1^i6jUZ?PBAz^`R#8AVSdgmfU%
z^q!s+CYaHa;xCTtsGV7V^~U?#+
WBhfGBKAUqFRRnq=kYecKr1l?2?3yY7
literal 0
HcmV?d00001
diff --git a/智能家居系统/__pycache__/家居信息.cpython-311.pyc b/智能家居系统/__pycache__/家居信息.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fa57ffc12e265a0120c83555769a022be9d4d1cc
GIT binary patch
literal 1887
zcmb7E-D?|15TCsdYyH_&s6~+}gks0N7bB-1p{4XG^uu7g;Jj2Aj*IT>>hsjq32LK)
z(%MulrhRd-1A(Zeb}0!7B~aRgkbglk0*iyBfm%-TrsDRcPo2H3k)e+`v&&_O3zNDu+u16^1KUED&Ct2o_}5DZb5
zGR~UC1u#h3ivU|lx#|%iA){3=0<>3$!9GW^dX0v17-wnJ~k4IVA42vz={YhqMmZ5T^BG^*V$j;k6Ijv|J
ztjKF}>eN54;@`Qq<_e3}$7a63%(RiT=Jqb#di2Ge_Vr)ezpOmGdHdn*D|7B*_wM(5
z7jKLg7Hz7kseH;()uph1I^!P3YgU{?QGr$@R+UzJ??ql*dw=8n<&PSXv1Vk9LoGV6
z+WYO$*Fy~&ZPI9+Mjd2_#+j0G6VC=ezdGrrQV#vE{6G!N@w6y(^oKZv5a{TxzxU_|lI7VE69z
zy|v#1Kzrrp?yYb9U{cP=mlT;%e2*Ni#p6T2KTw#BCw&
zb3yZ3nVmq84Wd|j;jkqGSD+tF#Z43yxEGGBjctrvRvO`vW_Y9;dO)Asp~KsBxHev=
z!wovoq!V>I@eH_iH2Zk)1K$5`XKyTE_c!S2COuvE9u~$-rxlssv^?H%Rkiz6HD~Ij
zEY}BA^^=m8buH|9i7W^7AE_hQH&!DLIzm6cw!yWL&P@g>3fv1HVjtAk1
z?Rq+cHvNEYWeny-FbKb%DXWSOfXWWCMoSHSw0(%MZ!=(PDZ@YVVhrNsjel3fO
zC^{k`qy>?>_jIH%!Hk|3e{t;ZL&GZ|4OEx5#gldMWUK!~^~~z)U!7e&TRGQ~1}h&_
d^@}shGnJW^M8BN+e9B!^5a@(JilK{>+J76-pBVrE
literal 0
HcmV?d00001
diff --git a/智能家居系统/__pycache__/测试.cpython-311.pyc b/智能家居系统/__pycache__/测试.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..33e178d5d48fd143bac61a07bf0b787fa71635b9
GIT binary patch
literal 1637
zcmcIkO-vI(6rSB}x1~@pqA^k9!DzHW1r<#|Vys}LS|Cz5w1G^P?()0at=smnCL~M5
z1pi{yYL$?*ng|$(phitZajCBZ@%}vc`vhX-@XZ}
z)dJA?k#u(_NdUfKB{vLNupUJq23WunJP-&kL10Ysq?bfH#Z!X8Yajp#ID#{d697!1
zr4KL78aTS&l+#&b9fB;K$C)sPywS-m-ewY91gv=&utnqOc2j8S!&}6XZeX*lV%0{d
zMhDLX2bvMGxUabEyswuNcnw0&+(#<;d{kk
zsP^Q^s?(L}ryp0Ye_np|e);u{%-gxlTwL9SBf9DvFEn{zgT2ju-tN8t+gqIub>AjS
zTdTePGHhyTa5|jz_BLlrv)iZNRhP!Bvi=<a1A
zr>QL|F#X>zVb1w&-dRI_dRgN%y(MN*0b*JT5VN=dF-r;%)5@AqnVMDVQXdm8K_5e}
ztfeo{(nB+Cs9cK!QlG#`G92LK)g9=71CeHbnCF=;o@=(1s%8lNjKD#tS|AieHq2vO
z0^!v#!)Gm42t)XMRwdakm97{0u;5osPJf8&;iL^*N|{fOm+yU0X?IBK^Y>`fa^!Ai
zVpfL_hcY+sXmIuU*vic}8eE$DkWPHsz?aWN<4YeW(y{psn*0Ot^Tb_s%y*3#d
z@g%L)3)X7I@rRDd59Gx5`-9QJ$uKsbTCkofw7Gm|tmZ+@lh(Lr)RT~&c8+zty_1XS85`n&sj
zq;0uK(r%2jzf@%4%JyNP;7a#xlhlp@!fvRLC`hiKtrxe~TZO+xUk;
GyZdiwC7Hee
literal 0
HcmV?d00001
diff --git a/智能家居系统/user_data.json b/智能家居系统/user_data.json
new file mode 100644
index 0000000..edf164e
--- /dev/null
+++ b/智能家居系统/user_data.json
@@ -0,0 +1 @@
+{"lh": "123"}
\ No newline at end of file
diff --git a/智能家居系统/user_info.txt b/智能家居系统/user_info.txt
new file mode 100644
index 0000000..e69de29
diff --git a/智能家居系统/主页面.py b/智能家居系统/主页面.py
new file mode 100644
index 0000000..d59f0c1
--- /dev/null
+++ b/智能家居系统/主页面.py
@@ -0,0 +1,26 @@
+import tkinter as tk
+from tkinter import messagebox
+
+class MainPage:
+ def __init__(self, master):
+ self.root = master
+ self.page = tk.Frame(self.root)
+ self.page.pack()
+ self.root.geometry('600x400')
+ self.create_page()
+
+ def create_page(self):
+ # 创建一个标签用于展示简单的家居信息标题
+ self.home_info_title = tk.Label(self.page, text="主页面区", font=("Helvetica", 16))
+ self.home_info_title.pack(pady=20)
+
+ # 创建一个按钮,点击后显示更详细的家居信息
+ self.view_details_button = tk.Button(self.page, text="家居信息", command=self.view_home_details)
+ self.view_details_button.pack(pady=10)
+
+
+
+if __name__ == '__main__':
+ root = tk.Tk()
+ app = MainPage(root)
+ root.mainloop()
\ No newline at end of file
diff --git a/智能家居系统/增删改查窗口.html b/智能家居系统/增删改查窗口.html
new file mode 100644
index 0000000..d17cd3c
--- /dev/null
+++ b/智能家居系统/增删改查窗口.html
@@ -0,0 +1,32 @@
+
+
+
+ 家居管理
+
+
+
+
+
+
+
+
+
diff --git a/智能家居系统/家居信息.py b/智能家居系统/家居信息.py
new file mode 100644
index 0000000..d2aa9ae
--- /dev/null
+++ b/智能家居系统/家居信息.py
@@ -0,0 +1,182 @@
+import tkinter as tk
+import pymysql
+from tkinter import messagebox
+
+
+class JiaJuPage:
+ def __init__(self, master):
+ self.root = master
+ self.page = tk.Frame(self.root)
+ self.page.pack()
+ self.root.geometry('600x400')
+ self.create_page()
+
+ def create_page(self):
+ menubar = tk.Menu(self.root)
+
+ # 数据库连接配置
+ self.conn = pymysql.connect(host='localhost', user='root', password='LH20021212', db='智能家居系统',
+ charset='utf8mb4')
+ self.cursor = self.conn.cursor()
+
+ menubar.add_command(label='录入家居', command=self.add_jiaju)
+ menubar.add_command(label='查询家居', command=self.query_jiaju)
+ menubar.add_command(label='删除家居', command=self.delete_jiaju)
+ menubar.add_command(label='修改家居', command=self.update_jiaju)
+ menubar.add_separator() # 添加分隔线使菜单更加清晰
+ menubar.add_command(label='退出', command=self.exit_app) # 新增退出功能
+
+ self.root.config(menu=menubar)
+
+ def exit_app(self):
+ """退出应用程序的函数"""
+ if messagebox.askyesno("退出确认", "确定要退出吗?"):
+ self.close_conn() # 确保关闭数据库连接
+ self.root.destroy() # 关闭主窗口
+
+ def add_jiaju(self):
+ def submit():
+ # 获取用户输入
+ name = entry_name.get()
+ color = entry_color.get()
+ brand = entry_brand.get()
+ price = entry_price.get()
+ production_date = entry_production_date.get()
+ # 插入数据库操作
+ sql = f"INSERT INTO jia_ju(name, color, brand, price, production_date) VALUES ('{name}', '{color}', '{brand}', {price}, '{production_date}')"
+ try:
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo("成功", "家居信息录入成功!")
+ except Exception as e:
+ messagebox.showerror("错误", f"录入失败: {e}")
+ finally:
+ add_window.destroy() # 关闭对话框
+
+ add_window = tk.Toplevel(self.root)
+ add_window.title("录入家居信息")
+ tk.Label(add_window, text="名称:").pack()
+ entry_name = tk.Entry(add_window)
+ entry_name.pack()
+ tk.Label(add_window, text="颜色:").pack()
+ entry_color = tk.Entry(add_window)
+ entry_color.pack()
+ tk.Label(add_window, text="品牌:").pack()
+ entry_brand = tk.Entry(add_window)
+ entry_brand.pack()
+ tk.Label(add_window, text="价格:").pack()
+ entry_price = tk.Entry(add_window)
+ entry_price.pack()
+ tk.Label(add_window, text="生产日期:").pack()
+ entry_production_date = tk.Entry(add_window)
+ entry_production_date.pack()
+ tk.Button(add_window, text="提交", command=submit).pack()
+
+ def query_jiaju(self):
+ self.cursor.execute("SELECT * FROM jia_ju")
+ results = self.cursor.fetchall()
+ if results:
+ result_text = "\n".join([str(row) for row in results])
+ messagebox.showinfo("查询结果", result_text)
+ else:
+ messagebox.showinfo("查询结果", "无数据")
+
+ def delete_jiaju(self):
+ def confirm_delete():
+ item_id = entry_id.get()
+ # 执行删除操作
+ sql = f"DELETE FROM jia_ju WHERE id={item_id}"
+ try:
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo("成功", "家居信息已删除!")
+ except Exception as e:
+ messagebox.showerror("错误", f"删除失败: {e}")
+ finally:
+ delete_window.destroy()
+
+ delete_window = tk.Toplevel(self.root)
+ delete_window.title("删除家居")
+ tk.Label(delete_window, text="请输入家居ID:").pack()
+ entry_id = tk.Entry(delete_window)
+ entry_id.pack()
+ tk.Button(delete_window, text="确认删除", command=confirm_delete).pack()
+
+ def update_jiaju(self):
+ def fetch_jiaju_info():
+ item_id = entry_id.get()
+ sql = f"SELECT * FROM jia_ju WHERE id={item_id}"
+ try:
+ self.cursor.execute(sql)
+ result = self.cursor.fetchone()
+ if result:
+ entry_name.delete(0, tk.END)
+ entry_name.insert(tk.END, result[1])
+ entry_color.delete(0, tk.END)
+ entry_color.insert(tk.END, result[2])
+ entry_brand.delete(0, tk.END)
+ entry_brand.insert(tk.END, result[3])
+ entry_price.delete(0, tk.END)
+ entry_price.insert(tk.END, str(result[4]))
+ entry_production_date.delete(0, tk.END)
+ entry_production_date.insert(tk.END, result[5])
+ else:
+ messagebox.showinfo("查询结果", "未找到该家居信息")
+ except Exception as e:
+ messagebox.showerror("错误", f"查询失败: {e}")
+
+ def submit_update():
+ item_id = entry_id.get()
+ name = entry_name.get()
+ color = entry_color.get()
+ brand = entry_brand.get()
+ price = entry_price.get()
+ production_date = entry_production_date.get()
+ sql = f"UPDATE jia_ju SET name='{name}', color='{color}', brand='{brand}', price={price}, production_date='{production_date}' WHERE id={item_id}"
+ try:
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo("成功", "家居信息已更新!")
+ except Exception as e:
+ messagebox.showerror("错误", f"更新失败: {e}")
+ finally:
+ update_window.destroy()
+
+ update_window = tk.Toplevel(self.root)
+ update_window.title("修改家居信息")
+ tk.Label(update_window, text="请输入家居ID:").pack()
+ entry_id = tk.Entry(update_window)
+ entry_id.pack()
+ tk.Button(update_window, text="查询", command=fetch_jiaju_info).pack()
+
+ tk.Label(update_window, text="名称:").pack()
+ entry_name = tk.Entry(update_window)
+ entry_name.pack()
+ tk.Label(update_window, text="颜色:").pack()
+ entry_color = tk.Entry(update_window)
+ entry_color.pack()
+ tk.Label(update_window, text="品牌:").pack()
+ entry_brand = tk.Entry(update_window)
+ entry_brand.pack()
+ tk.Label(update_window, text="价格:").pack()
+ entry_price = tk.Entry(update_window)
+ entry_price.pack()
+ tk.Label(update_window, text="生产日期:").pack()
+ entry_production_date = tk.Entry(update_window)
+ entry_production_date.pack()
+
+ tk.Button(update_window, text="提交修改", command=submit_update).pack()
+
+ def close_conn(self):
+ # 关闭数据库连接
+ self.cursor.close()
+ self.conn.close()
+
+
+if __name__ == '__main__':
+ root = tk.Tk()
+ app = JiaJuPage(root)
+
+ # 确保在程序结束时关闭数据库连接
+ root.protocol("WM_DELETE_WINDOW", app.close_conn)
+ root.mainloop()
\ No newline at end of file
diff --git a/智能家居系统/智能家居数据库.py b/智能家居系统/智能家居数据库.py
new file mode 100644
index 0000000..f6ccf94
--- /dev/null
+++ b/智能家居系统/智能家居数据库.py
@@ -0,0 +1,89 @@
+from datetime import datetime
+from flask import request, jsonify
+
+from flask import *
+from flask_sqlalchemy import SQLAlchemy
+import pymysql
+
+app = Flask(__name__)
+app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:LH20021212@localhost:3306/智能家居系统'
+db = SQLAlchemy(app)
+
+try:
+ with app.app_context():
+ # 尝试连接数据库
+
+ db.create_all()
+ print("数据库连接成功!")
+
+except Exception as e:
+ print(f"数据库连接失败: {str(e)}")
+
+
+class JiaJu(db.Model):
+ _tablename_ = 'JiaJu' # 这里应该是__tablename__
+ id = db.Column(db.Integer, primary_key=True)
+ name = db.Column(db.String(100), nullable=False)
+ color = db.Column(db.String(50))
+ brand = db.Column(db.String(50))
+ price = db.Column(db.Float, nullable=False)
+ production_date = db.Column(db.Date, nullable=False)
+
+#增
+@app.route('/add_jiaju', methods=['POST'])
+def add_jiaju():
+ data = request.get_json() # 假设前端发送的是JSON数据
+ new_jiaju = JiaJu(
+ name=data['name'],
+ color=data.get('color'), # 如果color可选,则使用get
+ brand=data.get('brand'),
+ price=data['price'],
+ production_date=datetime.strptime(data['production_date'], '%Y-%m-%d') # 假定日期格式为YYYY-MM-DD
+ )
+ db.session.add(new_jiaju)
+ db.session.commit()
+ return jsonify({"message": "家居添加成功"}), 201
+#查
+@app.route('/jiaju', methods=['GET'])
+def get_all_jiaju():
+ jiaju_list = JiaJu.query.all()
+ result = [{"id": item.id, "name": item.name, "color": item.color, "brand": item.brand,
+ "price": item.price, "production_date": item.production_date.strftime('%Y-%m-%d')} for item in jiaju_list]
+ return jsonify(result)
+#获取
+@app.route('/jiaju/', methods=['GET'])
+def get_jiaju(jiaju_id):
+ jiaju = JiaJu.query.get_or_404(jiaju_id)
+ return jsonify({
+ "id": jiaju.id,
+ "name": jiaju.name,
+ "color": jiaju.color,
+ "brand": jiaju.brand,
+ "price": jiaju.price,
+ "production_date": jiaju.production_date.strftime('%Y-%m-%d')
+ })
+#更
+@app.route('/jiaju/', methods=['PUT'])
+def update_jiaju(jiaju_id):
+ jiaju = JiaJu.query.get_or_404(jiaju_id)
+ data = request.get_json()
+ if 'name' in data:
+ jiaju.name = data['name']
+ if 'color' in data:
+ jiaju.color = data['color']
+ if 'brand' in data:
+ jiaju.brand = data['brand']
+ if 'price' in data:
+ jiaju.price = data['price']
+ if 'production_date' in data:
+ jiaju.production_date = datetime.strptime(data['production_date'], '%Y-%m-%d')
+ db.session.commit()
+ return jsonify({"message": "家居信息更新成功"})
+#删
+@app.route('/jiaju/', methods=['DELETE'])
+def delete_jiaju(jiaju_id):
+ jiaju = JiaJu.query.get_or_404(jiaju_id)
+ db.session.delete(jiaju)
+ db.session.commit()
+ return jsonify({"message": "家居删除成功"})
+
diff --git a/智能家居系统/测试.py b/智能家居系统/测试.py
new file mode 100644
index 0000000..dcbfbea
--- /dev/null
+++ b/智能家居系统/测试.py
@@ -0,0 +1,22 @@
+from flask import Flask
+
+import pymysql
+
+from flask_sqlalchemy import SQLAlchemy
+
+
+app = Flask(__name__)
+
+app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:LH20021212@localhost:3306/智能家居系统'
+app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
+
+db = SQLAlchemy(app)
+
+class Jia():
+ __tablename__ = '家居信息' # 注意这里使用英文表名
+ 编号 = db.Column(db.Integer, primary_key=True)
+ 名称 = db.Column(db.String(20), nullable=False)
+ 品牌 = db.Column(db.String(20), nullable=False)
+ 颜色 = db.Column(db.String(20), nullable=False)
+ 价格 = db.Column(db.String(20), nullable=False)
+ 生产日期 = db.Column(db.String(20), nullable=False)
\ No newline at end of file
diff --git a/智能家居系统/登录界面.py b/智能家居系统/登录界面.py
new file mode 100644
index 0000000..07bc514
--- /dev/null
+++ b/智能家居系统/登录界面.py
@@ -0,0 +1,45 @@
+import tkinter as tk
+
+import tkinter.messagebox
+
+from 主页面 import MainPage
+#from 家居信息 import JiaJuPage
+
+
+class LoginPage:
+ def __init__(self,master):
+ self.root = master
+ self.page = tk.Frame(self.root)
+ self.page.pack()
+ self.root.title('智能家居系统')
+ self.root.geometry("300x180")
+
+ self.username = tk.StringVar()
+ self.password = tk.StringVar()
+
+ tk.Label(self.page).grid(row=0, column=0)
+ tk.Label(self.page, text='账户').grid(row=1,column=0)
+ tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1)
+ tk.Label(self.page, text='密码').grid(row=2, column=0)
+ tk.Entry(self.page, textvariable=self.password).grid(row=2, column=1, pady=10)
+
+ tk.Button(self.page, text='登录', command=self.login_check).grid(row=3, column=0, pady=10)
+ tk.Button(self.page, text='退出', command=root.quit).grid(row=3, column=1, pady=10,stick=tk.E)
+
+ def login_check(self):
+ name = self.username.get()
+ pwd = self.password.get()
+
+ if name == '123' or pwd == '123' :
+ tkinter.messagebox.showinfo(title='恭喜', message='登录成功')
+ self.page.destroy()
+ #JiaJuPage(self.root)
+ MainPage(self.root)
+ else:
+ tkinter.messagebox.showinfo(title='错误', message='账户或密码错误')
+
+if __name__ == '__main__':
+ root = tk.Tk()
+ root.title("智能家居系统")
+ LoginPage(root)
+ root.mainloop()
\ No newline at end of file
diff --git a/计科2101 雷浩 21412030125.doc b/计科2101 雷浩 21412030125.doc
new file mode 100644
index 0000000000000000000000000000000000000000..2f2b2b4aeb05b679a60d9060ea6603a2c5c4aa79
GIT binary patch
literal 723456
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