#运维一枚,想着用tkinter加sqlite3写一个服务器管理系统 用户可以自己创建多层文件夹分组,不限制层数
#遇到的问题:求帮忙看看,数据库设计了两个表,一个GroupTab表,用来存储用户创建的文件夹分组节点,另一个server表,用来存储服务器的远程信息和关联文件夹分组的字段,有两个问题死活想不明白,一个就是用户创建了文件夹,这个文件夹的节点id该怎么往数据库里记,界面上展示文件夹列表时不至于乱了,比如a和b两个根目录文件夹,a下面有个a1,b下面有个b1,节点id该怎么设计呢,因为展示到tkinter界面上应该是用for循环插入到treeview表内
# 创建数据库的代码块
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS servers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
conn_type TEXT,
name TEXT,
host TEXT,
port INTEGER,
username TEXT,
password TEXT,
status TEXT,
ParentId INT
)
''')
self.cursor.execute('''
CREATE TABLE GroupTab (
id INTEGER PRIMARY KEY AUTOINCREMENT,
Name CHAR (64) NOT NULL,
ParentId INT NOT NULL
)
''')
# 添加文件夹分组的代码块
# 添加文件夹分组
def add_folder(self):
# 查询分组列表
conn = sqlite3.connect('rdp_db.db')
c = conn.cursor()
c.execute("SELECT * FROM GroupTab")
groups = c.fetchall()
ls1 = []
for group in groups:
ls1.append(group[1])
# 创建窗口
top = tk.Toplevel()
top.title("添加分组")
top.geometry('300x150+200+200')
# 设置窗口宽高固定
top.resizable(0, 0)
lab1 = tk.Label(top,text="添加到分组:")
lab1.pack()
down_menu = tk.StringVar()
down = ttk.Combobox(top, width=10, textvariable=down_menu) # #创建下拉菜单
# 车站下拉列表取值
down["value"] = ls1[0]
down.current(0)
down.pack()
lab2 = tk.Label(top, text="分组名称:")
lab2.pack()
name_entry = tk.Entry(top)
name_entry.pack()
qt_btn = tk.Button(top,text="确定",command=lambda :self.add_new_node(name_entry.get()))
qt_btn.pack()
if groups == '':
# 将根节点名称添加到groupId表中
self.c.execute("INSERT INTO groupId (name, parent_id) VALUES (?, ?)", (name_entry.get(), 0))
self.conn.commit()
conn.close()
def add_new_node(self,name):
# 在当前选中节点下创建新节点
selected_item = self.group_tree.focus()
self.group_tree.insert(selected_item,"end",text=name)
对于文件夹的节点id,可以使用层级编码,这样就可以很好区分不同级别的文件夹,将不同级别的文件夹分别以不同的编码标识出来。比如可以将a为1,a1为1.1,以此类推,就可以将文件夹的层级做到标识出来。最后将这些层级编码保存在GroupTab表的字段中即可。
对于server表的设计,可以使用group_id将关联的文件夹分组id存储在server表中,以此来标记某个服务器属于哪个文件夹分组,group_id可以使用GroupTab表中group_id字段保存,这样就可以使用group_id来确定某个服务器属于哪个文件夹分组,从而实现文件夹分组和服务器管理的组合使用。