acdr-ui/tootls/代码生成工具.py
2024-09-13 11:21:59 +08:00

209 lines
6.9 KiB
Python

import os
import shutil
import pymysql
import tkinter as tk
from tkinter import filedialog, messagebox, StringVar, BooleanVar
import configparser
# 执行 SQL 文件
def execute_sql_file(sql_file_path, db_config):
connection = None
cursor = None
try:
# 连接 MySQL 数据库
connection = pymysql.connect(
host=db_config["host"],
user=db_config["user"],
password=db_config["password"],
database=db_config["database"],
port=int(db_config["port"]),
)
cursor = connection.cursor()
# 读取并处理 SQL 文件
with open(sql_file_path, "r", encoding="utf-8") as file:
sql_script = file.read()
# 拆分 SQL 语句
statements = sql_script.split(";")
for statement in statements:
# 去除空的语句
if statement.strip():
cursor.execute(statement)
print(f"执行 SQL 语句: {statement.strip()}")
# 提交事务
connection.commit()
messagebox.showinfo("SQL执行成功", f"SQL文件 {sql_file_path} 已成功执行")
except Exception as e:
messagebox.showerror("SQL执行失败", f"执行SQL文件时出错: {e}")
if connection:
connection.rollback()
finally:
if cursor:
cursor.close()
if connection:
connection.close()
# 处理解压后的文件
def handle_extracted_files(
temp_extract_dir, output_dir, ui_dir, db_config, execute_sql
):
for root_dir, dirs, files in os.walk(temp_extract_dir):
for file in files:
src_file_path = os.path.join(root_dir, file)
relative_path = os.path.relpath(root_dir, temp_extract_dir)
top_level_dir = relative_path.split(os.sep)[0] # 获取一级目录名
if "module" in top_level_dir:
dest_file_path = os.path.join(output_dir, relative_path, file)
os.makedirs(os.path.dirname(dest_file_path), exist_ok=True)
shutil.copy2(src_file_path, dest_file_path)
print(f"复制文件 {src_file_path}{dest_file_path}")
elif "sql" in top_level_dir and file == "sql.sql" and execute_sql:
execute_sql_file(src_file_path, db_config)
print(f"执行SQL文件: {src_file_path}")
elif "vue" in top_level_dir:
dest_file_path = os.path.join(ui_dir, relative_path, file)
os.makedirs(os.path.dirname(dest_file_path), exist_ok=True)
shutil.copy2(src_file_path, dest_file_path)
print(f"复制文件 {src_file_path}{dest_file_path}")
# 选择zip文件
def select_zip_file():
zip_file_path.set(filedialog.askopenfilename(filetypes=[("ZIP files", "*.zip")]))
# 选择输出目录
def select_output_dir():
output_dir.set(filedialog.askdirectory())
# 选择UI目录
def select_ui_dir():
ui_dir.set(filedialog.askdirectory())
# 保存配置信息到 .ini 文件
def save_config_to_ini():
config = configparser.ConfigParser()
config["DATABASE"] = {
"host": host_var.get(),
"user": user_var.get(),
"password": password_var.get(),
"database": db_var.get(),
"port": port_var.get(),
}
with open("config.ini", "w") as configfile:
config.write(configfile)
messagebox.showinfo("保存成功", "数据库配置信息已保存到 config.ini 文件中")
# 解压并处理文件
def extract_and_process_files():
if not zip_file_path.get() or not output_dir.get() or not ui_dir.get():
messagebox.showwarning("警告", "请确保选择了ZIP文件和目标目录")
return
# 设置数据库连接参数
db_config = {
"host": host_var.get() or "localhost",
"user": user_var.get() or "root",
"password": password_var.get() or "root",
"database": db_var.get() or "cwet",
"port": port_var.get() or 3306,
}
# 检查是否选择了执行 SQL
if execute_sql_var.get():
# 解压ZIP文件并执行 SQL
temp_extract_dir = os.path.join(output_dir.get(), "temp_extracted")
shutil.unpack_archive(zip_file_path.get(), temp_extract_dir)
# 处理解压后的文件
handle_extracted_files(
temp_extract_dir, output_dir.get(), ui_dir.get(), db_config, True
)
# 清理临时文件夹
shutil.rmtree(temp_extract_dir)
messagebox.showinfo("完成", "文件处理完成!")
else:
# 保存配置到 ini 文件
save_config_to_ini()
# 创建主窗口
root = tk.Tk()
root.title("代码生成工具")
# 创建变量
zip_file_path = StringVar()
output_dir = StringVar()
ui_dir = StringVar()
# 数据库连接参数
host_var = StringVar(value="localhost")
user_var = StringVar(value="root")
password_var = StringVar(value="root")
db_var = StringVar(value="cwet")
port_var = StringVar(value="3306")
# 是否执行 SQL 的选择
execute_sql_var = BooleanVar(value=True)
# GUI布局
tk.Label(root, text="选择ZIP文件:").grid(row=0, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=zip_file_path, width=50).grid(
row=0, column=1, padx=10, pady=5
)
tk.Button(root, text="选择ZIP文件", command=select_zip_file).grid(
row=0, column=2, padx=10, pady=5
)
tk.Label(root, text="选择输出目录:").grid(row=1, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=output_dir, width=50).grid(row=1, column=1, padx=10, pady=5)
tk.Button(root, text="选择输出目录", command=select_output_dir).grid(
row=1, column=2, padx=10, pady=5
)
tk.Label(root, text="选择UI目录:").grid(row=2, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=ui_dir, width=50).grid(row=2, column=1, padx=10, pady=5)
tk.Button(root, text="选择UI目录", command=select_ui_dir).grid(
row=2, column=2, padx=10, pady=5
)
# 数据库设置
tk.Label(root, text="数据库主机:").grid(row=3, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=host_var).grid(row=3, column=1, padx=10, pady=5)
tk.Label(root, text="用户名:").grid(row=4, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=user_var).grid(row=4, column=1, padx=10, pady=5)
tk.Label(root, text="密码:").grid(row=5, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=password_var).grid(row=5, column=1, padx=10, pady=5)
tk.Label(root, text="数据库名:").grid(row=6, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=db_var).grid(row=6, column=1, padx=10, pady=5)
tk.Label(root, text="端口:").grid(row=7, column=0, padx=10, pady=5)
tk.Entry(root, textvariable=port_var).grid(row=7, column=1, padx=10, pady=5)
# 执行 SQL 的复选框
tk.Checkbutton(root, text="执行SQL语句", variable=execute_sql_var).grid(
row=8, column=0, columnspan=2, padx=10, pady=5
)
# 开始处理按钮
tk.Button(root, text="开始处理", command=extract_and_process_files).grid(
row=9, column=1, padx=10, pady=20
)
# 运行应用
root.mainloop()