countExample.setLimit(Integer.MAX_VALUE)?

本文探讨了在CouchDB中使用类似SQL的URL拼接查询进行分页时,将limit参数设置为Integer.MAX_VALUE的原因。解释了如果不给limit设置值,分页功能将失效的问题,并通过二进制表示解析了Integer.MAX_VALUE与Integer.MIN_VALUE的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要 countExample.setLimit(Integer.MAX_VALUE);-----------------?

在使用使用couchdb 的url拼接查询语句(类似于sql)进行分页时,为什么要给limit设置 .setLimit(Integer.MAX_VALUE),
原因:limit默认值为0,如果不给limit设置值,分页不起作用。

这是别人的解释:
当a的值为Integer.MIN_VALUE
突然想到Integer.MAX_VALUE+1=Integer.MIN_VALUE
Integer.MAX_VALUE的二进制是0111 1111 1111 1111 1111 1111 1111 1111
Integer.MIN_VALUE的二进制是 1000 0000 0000 0000 0000 0000 0000 0000
我没看太懂,先放这吧!!!
在这里插入图片描述

import os import time import logging # 使用绝对导入 from core.config import system_config from core.environment import DefaultEnvironment, AIHome, ActionExecutor # 修改导入为具体实现类 class AutonomousAgent: def __init__(self): self.logger = self._setup_logger() self.logger.info("🔁 初始化自主智能体核心模块...") try: # 初始化环境感知系统 - 修复部分 self._initialize_environment_systems() # 初始化各子系统 self._initialize_subsystems() self.logger.info("✅ 自主智能体初始化完成") except Exception as e: self.logger.error(f"❌ 智能体初始化失败: {str(e)}") raise def _setup_logger(self): """配置日志记录器""" logger = logging.getLogger('AutonomousAgent') logger.setLevel(system_config.LOG_LEVEL) # 创建控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(system_config.LOG_LEVEL) # 创建格式化器 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) # 添加处理器 logger.addHandler(console_handler) logger.propagate = False return logger def _initialize_environment_systems(self): """初始化环境感知系统 - 修复后""" # 获取项目根目录 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 修复:使用具体实现类 DefaultEnvironment self.environment = DefaultEnvironment(base_dir) # 传递 base_dir self.logger.info("✅ 环境接口初始化完成") # 初始化智能家居环境 self.home = AIHome(base_dir) self.logger.info("✅ 智能家居环境初始化完成") # 修复:ActionExecutor 不需要参数 self.executor = ActionExecutor() # 移除环境参数 self.logger.info("✅ 动作执行器初始化完成") # 记录环境状态 env_status = self.environment.get_system_info() self.logger.info(f"📊 系统状态: OS={env_status['os']}, CPU={env_status['cpu']}, " f"内存={env_status['memory']}GB, 磁盘={env_status['disk_usage']}%") def _initialize_subsystems(self): """初始化所有子系统""" # 1. 初始化模型管理器 from .model_manager import ModelManager self.model_manager = ModelManager( model_dir=system_config.MODEL_DIR, device=system_config.DEVICE, default_model=system_config.DEFAULT_MODEL ) self.logger.info("✅ 模型管理器初始化完成") # 2. 初始化健康系统 from .health_system import HealthSystem self.health_system = HealthSystem(self) self.logger.info("✅ 健康系统初始化完成") # 3. 初始化记忆系统 from .memory_system import MemorySystem self.memory_system = MemorySystem(self) self.logger.info("✅ 记忆系统初始化完成") # 4. 初始化情感系统 from .affective_system import AffectiveSystem self.affective_system = AffectiveSystem(agent=self) self.logger.info("✅ 情感系统初始化完成") # 5. 初始化认知架构 from .cognitive_architecture import CognitiveArchitecture self.cognitive_architecture = CognitiveArchitecture(agent=self) self.logger.info("✅ 认知架构初始化完成") # 6. 初始化通信系统 from .communication_system import CommunicationSystem self.communication_system = CommunicationSystem( cognitive_system=self.cognitive_architecture, agent=self # 传递智能体实例 ) self.logger.info("✅ 通信系统初始化完成") def process_input(self, user_input, user_id="default"): """处理用户输入(通过通信系统)""" return self.communication_system.process_input(user_input, user_id) def run_periodic_tasks(self): """运行周期性任务""" # 更新健康状态 self.health_system.update() # 情感系统更新 self.affective_system.grow() # 记忆系统维护 self.memory_system.consolidate_memories() # 修复:环境状态监控 - 使用时间戳 current_time = time.time() if not hasattr(self, "_last_env_check"): self._last_env_check = current_time # 每5分钟检查一次 if current_time - self._last_env_check > 300: self._last_env_check = current_time self._monitor_environment() def _monitor_environment(self): """监控环境状态 - 修复后""" try: # 获取当前系统状态 env_status = self.environment.get_system_info() # 安全解析磁盘使用率 disk_str = env_status.get('disk_usage', '0%').strip() if disk_str.endswith('%'): try: disk_usage = float(disk_str[:-1]) except ValueError: disk_usage = 0.0 else: disk_usage = 0.0 if disk_usage > 90: self.logger.warning(f"⚠️ 磁盘空间不足!当前使用率: {disk_usage}%") # 安全解析内存使用 memory_str = env_status.get('memory', '0GB/0GB') try: # 支持多种格式: "3.2GB/16GB" 或 "3.2/16.0 GB" parts = memory_str.replace('GB', '').replace(' ', '').split('/') if len(parts) >= 2: memory_used = float(parts[0]) memory_total = float(parts[1]) memory_ratio = memory_used / memory_total if memory_ratio > 0.85: self.logger.warning( f"⚠️ 内存使用过高!已用: {memory_used:.1f}GB, " f"总共: {memory_total:.1f}GB, " f"使用率: {memory_ratio * 100:.1f}%" ) except (ValueError, TypeError, ZeroDivisionError) as e: self.logger.error(f"内存数据解析失败: {memory_str} - {str(e)}") # 记录到健康系统 self.health_system.record_environment_status(env_status) except Exception as e: self.logger.error(f"环境监控失败: {str(e)}", exc_info=True) def get_status(self): """获取智能体状态报告""" # 获取基础状态 status = { "health": self.health_system.get_status(), "affective": self.affective_system.get_state(), "memory_stats": self.memory_system.get_stats(), "model": self.model_manager.get_current_model_info() } # 添加环境信息 try: env_status = self.environment.get_system_info() status["environment"] = { "os": env_status.get("os", "未知"), "cpu": env_status.get("cpu", "0%"), "memory": env_status.get("memory", "0GB/0GB"), "disk": env_status.get("disk_usage", "0%") } except Exception as e: status["environment"] = {"error": str(e)} return status # 环境交互方法 def explore_environment(self, path=None): """探索环境目录""" try: return self.environment.explore_directory(path) except Exception as e: self.logger.error(f"环境探索失败: {str(e)}") return {"error": str(e)} def execute_action(self, action, parameters): """通过执行器执行动作""" try: result = self.executor.execute(action, parameters) self.logger.info(f"执行动作: {action} {parameters} → {result.get('status', '未知')}") return result except Exception as e: self.logger.error(f"动作执行失败: {action} {parameters} - {str(e)}") return {"status": "error", "message": str(e)} import os import psutil import platform import json import sqlite3 import sys import subprocess import requests import logging from datetime import datetime # 修复快捷方式解析问题 def resolve_shortcut(path): """解析快捷方式路径(简化实现)""" if sys.platform == 'win32': if path.endswith('.lnk'): # Windows 系统下解析 .lnk 文件 try: import win32com.client shell = win32com.client.Dispatch("WScript.Shell") shortcut = shell.CreateShortCut(path) return shortcut.Targetpath except ImportError: # 如果没有 win32com 模块,直接返回路径 return path # 非 Windows 系统或非快捷文件直接返回 return path class EnvironmentInterface: def __init__(self): # 配置日志 self.logger = logging.getLogger('EnvironmentInterface') self.logger.setLevel(logging.INFO) console_handler = logging.StreamHandler() console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) self.logger.addHandler(console_handler) # 工作区路径设置 self.workspace_root = "E:\\AI_Workspace" # 解析路径并确保目录存在 self.models_dir = self._resolve_and_create_dir(os.path.join(self.workspace_root, "01_模型存储", "主模型.lnk")) self.cache_dir = self._resolve_and_create_dir(os.path.join(self.workspace_root, "01_模型存储", "下载缓存.lnk")) self.system_dir = self._resolve_and_create_dir( os.path.join(self.workspace_root, "02_核心代码", "Agent系统.lnk")) self.temp_dir = self._resolve_and_create_dir(os.path.join(self.workspace_root, "04_环境工具", "临时补丁.lnk")) self.python_dir = self._resolve_and_create_dir( os.path.join(self.workspace_root, "04_环境工具", "Python环境.lnk")) # 环境配置 os.environ['PATH'] = f"{self.python_dir};{self.python_dir}\\Scripts;{os.environ['PATH']}" os.environ['HF_HOME'] = self.cache_dir # 安全策略 self.authorized_actions = { "file_access": True, "web_search": True, "command_exec": True, "software_install": False, "hardware_control": False } self.action_log = [] # 初始化数据库 self.environment_db = os.path.join(self.system_dir, 'environment.db') self._init_db() self.logger.info("环境接口初始化完成") def _resolve_and_create_dir(self, path): """解析路径并确保目录存在""" resolved = resolve_shortcut(path) # 如果是文件路径,获取其目录 if os.path.isfile(resolved): dir_path = os.path.dirname(resolved) else: dir_path = resolved # 创建目录(如果不存在) if not os.path.exists(dir_path): os.makedirs(dir_path, exist_ok=True) self.logger.info(f"创建目录: {dir_path}") return resolved def _init_db(self): """初始化环境数据库""" conn = sqlite3.connect(self.environment_db) c = conn.cursor() # 系统信息表 c.execute('''CREATE TABLE IF NOT EXISTS system_info ( id INTEGER PRIMARY KEY, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, os TEXT, cpu TEXT, memory REAL, disk_usage REAL )''') # 文件探索历史表 c.execute('''CREATE TABLE IF NOT EXISTS file_exploration ( id INTEGER PRIMARY KEY, path TEXT UNIQUE, last_visited DATETIME, visit_count INTEGER DEFAULT 0 )''') # 资源管理表 c.execute('''CREATE TABLE IF NOT EXISTS resources ( id INTEGER PRIMARY KEY, name TEXT, type TEXT, -- skin, furniture, tool path TEXT, is_active BOOLEAN DEFAULT 0 )''') conn.commit() conn.close() self.logger.info(f"数据库初始化完成: {self.environment_db}") # 系统监控功能 def get_system_info(self): """获取并记录系统信息""" try: # 获取内存使用情况 mem = psutil.virtual_memory() mem_used = round(mem.used / (1024 ** 3), 1) mem_total = round(mem.total / (1024 ** 3), 1) # 获取磁盘使用情况 disk_usage = psutil.disk_usage('/').percent info = { "os": f"{platform.system()} {platform.release()}", "cpu": f"{platform.processor()} ({psutil.cpu_count(logical=False)} cores)", "memory": f"{mem_used}GB/{mem_total}GB", "disk_usage": f"{disk_usage}%" } # 保存到数据库 conn = sqlite3.connect(self.environment_db) c = conn.cursor() c.execute('''INSERT INTO system_info (os, cpu, memory, disk_usage) VALUES (?, ?, ?, ?)''', (info['os'], info['cpu'], mem_used, disk_usage)) conn.commit() conn.close() self.log_action("system_monitor", "采集系统信息") return info except Exception as e: self.logger.error(f"获取系统信息失败: {str(e)}") return { "os": f"Error: {str(e)}", "cpu": "0%", "memory": "0GB/0GB", "disk_usage": "0%" } # 文件探索功能 def explore_directory(self, path=None): """探索目录内容""" try: target_path = path or self.workspace_root target_path = os.path.abspath(target_path) # 安全路径检查 if not target_path.startswith(os.path.abspath(self.workspace_root)): return {"error": "访问路径超出工作区范围"} if not os.path.exists(target_path): return {"error": "路径不存在"} # 记录探索历史 self._record_exploration(target_path) contents = [] for item in os.listdir(target_path): full_path = os.path.join(target_path, item) try: is_dir = os.path.isdir(full_path) size = os.path.getsize(full_path) if not is_dir else 0 modified_time = os.path.getmtime(full_path) contents.append({ "name": item, "type": "directory" if is_dir else "file", "path": full_path, "size": f"{size / 1024:.1f}KB" if size < 1024 ** 2 else f"{size / (1024 ** 2):.1f}MB", "modified": datetime.fromtimestamp(modified_time).strftime("%Y-%m-%d %H:%M") }) except PermissionError: contents.append({ "name": item, "type": "unknown", "error": "权限不足" }) except Exception as e: contents.append({ "name": item, "type": "unknown", "error": str(e) }) self.log_action("file_explore", f"探索路径: {target_path}") return { "current_path": target_path, "contents": sorted(contents, key=lambda x: (x['type'] == 'directory', x['name']), reverse=True) } except Exception as e: self.logger.error(f"探索目录失败: {str(e)}") return {"error": str(e)} def _record_exploration(self, path): """记录探索历史到数据库""" try: conn = sqlite3.connect(self.environment_db) c = conn.cursor() c.execute("SELECT id FROM file_exploration WHERE path = ?", (path,)) if c.fetchone(): c.execute('''UPDATE file_exploration SET last_visited = CURRENT_TIMESTAMP, visit_count = visit_count + 1 WHERE path = ?''', (path,)) else: c.execute('''INSERT INTO file_exploration (path, last_visited, visit_count) VALUES (?, CURRENT_TIMESTAMP, 1)''', (path,)) conn.commit() except Exception as e: self.logger.error(f"记录探索历史失败: {str(e)}") finally: conn.close() def get_exploration_history(self): """获取探索历史记录""" try: conn = sqlite3.connect(self.environment_db) c = conn.cursor() c.execute('''SELECT path, last_visited, visit_count FROM file_exploration ORDER BY last_visited DESC LIMIT 10''') history = [ {"path": item[0], "last_visited": item[1], "visit_count": item[2]} for item in c.fetchall() ] return history except Exception as e: self.logger.error(f"获取探索历史失败: {str(e)}") return [] finally: conn.close() # 资源管理功能 def get_resource(self, resource_type): """获取特定类型资源""" try: conn = sqlite3.connect(self.environment_db) c = conn.cursor() c.execute('''SELECT name, path, is_active FROM resources WHERE type = ?''', (resource_type,)) resources = [ {"name": item[0], "path": item[1], "is_active": bool(item[2])} for item in c.fetchall() ] return resources except Exception as e: self.logger.error(f"获取资源失败: {str(e)}") return [] finally: conn.close() def activate_resource(self, resource_name): """激活特定资源""" try: conn = sqlite3.connect(self.environment_db) c = conn.cursor() c.execute('''UPDATE resources SET is_active = 0 WHERE type = (SELECT type FROM resources WHERE name = ?)''', (resource_name,)) c.execute('''UPDATE resources SET is_active = 1 WHERE name = ?''', (resource_name,)) conn.commit() self.log_action("resource_activate", f"激活资源: {resource_name}") return True except Exception as e: self.logger.error(f"激活资源失败: {str(e)}") return False finally: conn.close() # 工作区管理功能 def get_workspace_info(self): """获取工作区信息""" return { "workspace": self.workspace_root, "models": self.models_dir, "system": self.system_dir, "cache": self.cache_dir, "temp": self.temp_dir, "python": self.python_dir } # 命令执行功能 def execute_command(self, command): """执行经过授权的系统命令""" if not self._is_authorized("command_exec"): return {"error": "命令执行未授权"} try: result = subprocess.run( command, shell=True, capture_output=True, text=True, cwd=self.system_dir, timeout=30 # 防止长时间运行 ) output = { "success": result.returncode == 0, "returncode": result.returncode, "stdout": result.stdout, "stderr": result.stderr } self.log_action("command_exec", f"命令: {command[:50]}... 结果: {output['success']}") return output except subprocess.TimeoutExpired: return {"error": "命令执行超时"} except Exception as e: return {"error": str(e)} # 网络搜索功能 def web_search(self, query): """安全网络搜索""" if not self._is_authorized("web_search"): return {"error": "网络搜索未授权"} try: # 使用安全的搜索引擎 response = requests.get( f"https://search.brave.com/search?q={requests.utils.quote(query)}", headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" }, timeout=10 ) # 简化结果解析 results = [] # 注意:实际实现需要根据搜索引擎的HTML结构解析 # 这里只是一个示例 results.append({ "title": "示例结果 1", "url": "https://example.com/result1", "content": "这是关于查询的第一个结果..." }) results.append({ "title": "示例结果 2", "url": "https://example.com/result2", "content": "这是关于查询的第二个结果..." }) self.log_action("web_search", f"查询: {query[:30]}... 结果数: {len(results)}") return {"success": True, "results": results} except Exception as e: return {"error": str(e)} # 文件操作功能 def read_file(self, file_path): """读取工作区文件""" full_path = os.path.join(self.workspace_root, file_path) if not self._is_authorized("file_access"): return {"error": "文件访问未授权"} if not os.path.abspath(full_path).startswith(os.path.abspath(self.workspace_root)): return {"error": "访问路径超出工作区范围"} try: with open(full_path, 'r', encoding='utf-8') as f: content = f.read() self.log_action("file_read", f"读取文件: {file_path}") return content except Exception as e: return {"error": str(e)} def write_file(self, file_path, content): """写入工作区文件""" full_path = os.path.join(self.workspace_root, file_path) if not self._is_authorized("file_access"): return {"error": "文件访问未授权"} if not os.path.abspath(full_path).startswith(os.path.abspath(self.workspace_root)): return {"error": "访问路径超出工作区范围"} try: os.makedirs(os.path.dirname(full_path), exist_ok=True) with open(full_path, 'w', encoding='utf-8') as f: f.write(content) self.log_action("file_write", f"写入文件: {file_path} ({len(content)} 字节)") return "文件写入成功" except Exception as e: return {"error": str(e)} # 辅助功能 def _is_authorized(self, action): """检查操作授权状态""" return self.authorized_actions.get(action, False) def log_action(self, action, details): """记录环境操作日志""" log_entry = { "timestamp": datetime.now().isoformat(), "action": action, "details": details } self.action_log.append(log_entry) # 保存到文件 log_file = os.path.join(self.workspace_root, "environment_actions.log") try: with open(log_file, 'a', encoding='utf-8') as f: f.write(json.dumps(log_entry, ensure_ascii=False) + "\n") except Exception as e: self.logger.error(f"记录日志失败: {str(e)}") # 同时记录到logger self.logger.info(f"{action}: {details}") return True # 使用示例 if __name__ == "__main__": # 配置日志 logging.basicConfig(level=logging.INFO) env = EnvironmentInterface() # 获取工作区信息 print("工作区信息:", json.dumps(env.get_workspace_info(), indent=2, ensure_ascii=False)) # 获取系统信息 print("系统信息:", json.dumps(env.get_system_info(), indent=2, ensure_ascii=False)) # 探索目录 print("工作区内容:", json.dumps(env.explore_directory(), indent=2, ensure_ascii=False)) # 执行命令 print("命令结果:", json.dumps(env.execute_command("echo Hello World"), indent=2, ensure_ascii=False)) # 文件操作 test_file = "test_env_interface.txt" result = env.write_file(test_file, "环境接口测试内容") print("文件写入结果:", result) content = env.read_file(test_file) print("文件内容:", content) 两个文件都给你 你看看怎么改
最新发布
08-10
package com.example.a7_1.DAO; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.example.a7_1.model.flag; import java.util.ArrayList; import java.util.List; public class FlagDao { private DBOpenHelper helper; private SQLiteDatabase db; public FlagDao (Context context){ helper = new DBOpenHelper(context) } public void add(flag flag){ db = helper.getWritableDatabase(); db.execSQL("insert into tb_flag (_id,flag) values (?,?)",new Object[]{ flag.getid(),flag.getFlag() }); } public void update(flag tb_flag){ db = helper.getWritableDatabase(); db.execSQL("update tb_flag set flag = ? where _id=?",new Object[]{ tb_flag.getFlag(), tb_flag.getid() } ); } public flag find(int id){ db = helper.getWritableDatabase(); Cursor cursor = db.rawQuery("select _id,flag from tb_flag where _id = ?",new String[]{String.valueOf(id)}); if(cursor.moveToNext()){ return new flag(cursor.getInt(cursor.getColumnIndex(("_id")),cursor.getString(cursor.getColumnIndex("flag"))); } return null; } public void delete(Integer... ids){ if(ids.length>0){ StringBuffer sb = new StringBuffer(); for (int i= 0; i<ids.length;i++){ sb.append('?').append(','); } sb.deleteCharAt(sb.length() -1); db = helper.getWritableDatabase(); db.execSQL("delete from tb_flag where _id in ("+ sb +")",(Object[]) ids); } } public List<flag> getScrollDate(int start,int count){ List<flag> lisTb_flags = new ArrayList<flag>(); db = helper.getWritableDatabase(); Cursor cursor = db.rawQuery("select * from tb_flag limit ?,?",new String[]{String.valueOf(start),String.valueOf(count)}); while (cursor.moveToNext()){ lisTb_flags.add(new flag(cursor.getInt(cursor.getColumnIndex("_id")),cursor.getString(cursor.getColumnIndex("flag")))); } return lisTb_flags; } public long getCount(){ db = helper.getWritableDatabase(); Cursor cursor = db.rawQuery("select count(_id) from tb_falg",null); if(cursor.moveToNext()){ return cursor.getLong(0); } return 0; } public int getMaxId(){ db = helper.getWritableDatabase(); Cursor cursor = db.rawQuery("select max(_id) from tb_falg",null); while (cursor.moveToNext()){ return cursor.getInt(0); } return 0; } }检查代码问题
05-25
跟据以下代码,进行修改并给出完整python:1、筛选功能移除,不需要了,2、添加档案时,页数为空,保存后显示不要为NONE,展示为空就可以了 3、统计页面优化一下美观程度 4、表格数据按灰白背景色交替展示import tkinter as tk from tkinter import ttk, messagebox, scrolledtext, simpledialog import sqlite3 import os import sys import traceback import re from datetime import datetime from tkinter import filedialog class FileManagementSystem: def init(self, root): # 主窗口设置 self.root = root self.root.title(“档案管理系统”) self.root.geometry(“1200x750”) self.root.minsize(1000, 650) self.root.configure(bg=“#f0f2f5”) # 设置应用程序图标 self.set_app_icon() # 样式配置 self.setup_styles() # 初始化数据库 self.init_database() # 当前类别 self.current_category = "文书类" self.current_infra_view = "总表" # 基建类当前视图:总表/明细 # 分页设置 self.current_page = 1 self.page_size = 20 # 每页显示20条记录 self.total_records = 0 self.total_pages = 1 # 筛选条件 self.filter_conditions = [] # 创建界面组件 self.create_widgets() # 加载数据 self.load_data() def set_app_icon(self): """设置应用程序图标(如果有图标文件)""" try: if getattr(sys, 'frozen', False): base_dir = os.path.dirname(sys.executable) else: base_dir = os.path.dirname(os.path.abspath(__file__)) icon_path = os.path.join(base_dir, "archive_icon.ico") if os.path.exists(icon_path): self.root.iconbitmap(icon_path) except: pass def setup_styles(self): """设置界面样式""" self.style = ttk.Style() # 基础字体设置 self.style.configure(".", font=("Microsoft YaHei", 10)) # 主题配置 self.style.theme_use("clam") # 统一按钮样式 (添加 focuswidth=0 去除焦点虚线框) self.style.configure("Primary.TButton", font=("Microsoft YaHei", 10), padding=8, background="#4285f4", foreground="white", borderwidth=1, relief="flat", width=4, focuswidth=0,focuscolor='') self.style.map("Primary.TButton", background=[("active", "#3367d6"), ("pressed", "#2850b3")]) # 删除按钮使用不同颜色 (添加 focuswidth=0) self.style.configure("Danger.TButton", font=("Microsoft YaHei", 10), padding=8, background="#ea4335", foreground="white", borderwidth=1, relief="flat", width=4, focuswidth=0,focuscolor='') self.style.map("Danger.TButton", background=[("active", "#d93025"), ("pressed", "#b31412")]) # 表格样式 self.style.configure("Treeview", background="white", foreground="#202124", rowheight=30, fieldbackground="white", borderwidth=1, relief="solid") self.style.configure("Treeview.Heading", background="#f8f9fa", foreground="#5f6368", font=("Microsoft YaHei", 10, "bold"), padding=8, relief="flat") self.style.map("Treeview.Heading", background=[("active", "#e8eaed")]) self.style.map("Treeview", background=[("selected", "#e8f0fe")], foreground=[("selected", "#202124")]) # 单选按钮样式 self.style.configure("TRadiobutton", background="#f0f2f5", font=("Microsoft YaHei", 10), foreground="#5f6368",focuswidth=0,focuscolor='') self.style.map("TRadiobutton", foreground=[("selected", "#4285f4")]) # 输入框样式 self.style.configure("TEntry", fieldbackground="white", borderwidth=1, relief="solid", padding=5) # 必填输入框样式 self.style.configure("Required.TEntry", fieldbackground="#fff8f8", borderwidth=1, relief="solid", padding=5) # 标签样式 self.style.configure("Header.TLabel", font=("Microsoft YaHei", 16, "bold"), background="#4285f4", foreground="white") self.style.configure("Section.TLabel", font=("Microsoft YaHei", 10, "bold"), background="#f0f2f5", foreground="#5f6368") # 分页按钮样式 (添加 focuswidth=0) self.style.configure("Page.TButton", font=("Microsoft YaHei", 9), padding=4, background="#e8eaed", foreground="#5f6368", borderwidth=1, relief="flat",focuswidth=0,focuscolor='') self.style.map("Page.TButton", background=[("active", "#d7d9dd"), ("pressed", "#c5c7cb")]) # 分页标签样式 self.style.configure("Page.TLabel", background="#f0f2f5", foreground="#5f6368", font=("Microsoft YaHei", 9)) def init_database(self): """初始化数据库,处理打包路径问题""" try: # 获取可执行文件所在目录(打包后) if getattr(sys, 'frozen', False): base_dir = os.path.dirname(sys.executable) else: base_dir = os.path.dirname(os.path.abspath(__file__)) # 确保目录存在 os.makedirs(base_dir, exist_ok=True) db_path = os.path.join(base_dir, "file_management.db") self.conn = sqlite3.connect(db_path) self.cursor = self.conn.cursor() # 创建文书类表(增加保存库房字段) self.cursor.execute(''' CREATE TABLE IF NOT EXISTS documents ( id INTEGER PRIMARY KEY AUTOINCREMENT, file_number TEXT NOT NULL, document_number TEXT, responsible TEXT, title TEXT NOT NULL, date TEXT, security_level TEXT, page_count INTEGER, retention_period TEXT, carrier_form TEXT, storage_location TEXT, -- 新增保存库房字段 remarks TEXT ) ''') # 创建基建类总表 self.cursor.execute(''' CREATE TABLE IF NOT EXISTS infrastructure_summary ( id INTEGER PRIMARY KEY AUTOINCREMENT, file_number TEXT NOT NULL, title TEXT NOT NULL, date TEXT, security_level TEXT, total_pages INTEGER, retention_period TEXT, carrier_form TEXT, storage_location TEXT, -- 保存库房 remarks TEXT ) ''') # 创建基建类明细表 self.cursor.execute(''' CREATE TABLE IF NOT EXISTS infrastructure_detail ( id INTEGER PRIMARY KEY AUTOINCREMENT, summary_id INTEGER, -- 关联总表ID file_number TEXT NOT NULL, document_number TEXT, responsible TEXT, title TEXT NOT NULL, date TEXT, security_level TEXT, page_number TEXT, -- 页次(可以是范围) retention_period TEXT, carrier_form TEXT, storage_location TEXT, -- 保存库房 remarks TEXT, FOREIGN KEY (summary_id) REFERENCES infrastructure_summary(id) ) ''') self.conn.commit() except Exception as e: messagebox.showerror("数据库错误", f"初始化数据库失败: {str(e)}") traceback.print_exc() sys.exit(1) def create_widgets(self): """创建现代化界面组件""" # 主布局容器 main_frame = tk.Frame(self.root, bg="#f0f2f5") main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=15) # 顶部标题栏 header_frame = tk.Frame(main_frame, bg="#4285f4", height=60) header_frame.pack(fill=tk.X) header_frame.pack_propagate(False) title_label = tk.Label(header_frame, text="档案管理系统", font=("Microsoft YaHei", 18, "bold"), bg="#4285f4", fg="white") title_label.pack(pady=15) # 功能区 function_frame = tk.Frame(main_frame, bg="#f0f2f5", pady=15) function_frame.pack(fill=tk.X) # 左侧分类选择 category_frame = tk.Frame(function_frame, bg="#f0f2f5") category_frame.pack(side=tk.LEFT, padx=(0, 20)) ttk.Label(category_frame, text="档案类别:", style="Section.TLabel").pack(side=tk.LEFT, padx=5) self.category_var = tk.StringVar(value="文书类") category_container = tk.Frame(category_frame, bg="#f0f2f5") category_container.pack(side=tk.LEFT) doc_radio = ttk.Radiobutton( category_container, text="文书类", variable=self.category_var, value="文书类", command=self.on_category_change, style="TRadiobutton" ) inf_radio = ttk.Radiobutton( category_container, text="基建类", variable=self.category_var, value="基建类", command=self.on_category_change, style="TRadiobutton" ) doc_radio.pack(side=tk.LEFT, padx=10) inf_radio.pack(side=tk.LEFT, padx=10) # 基建类视图切换 self.view_frame = tk.Frame(function_frame, bg="#f0f2f5") # 基建类视图切换标签 self.view_label = ttk.Label(self.view_frame, text="视图:", style="Section.TLabel") self.view_label.pack(side=tk.LEFT, padx=5) # 基建类视图切换按钮 self.view_var = tk.StringVar(value="总表") self.summary_btn = ttk.Radiobutton( self.view_frame, text="总表", variable=self.view_var, value="总表", command=self.on_view_change, style="TRadiobutton" ) self.detail_btn = ttk.Radiobutton( self.view_frame, text="明细", variable=self.view_var, value="明细", command=self.on_view_change, style="TRadiobutton" ) # 初始隐藏视图切换 self.view_frame.pack_forget() # 搜索区 search_frame = tk.Frame(function_frame, bg="#f0f2f5") search_frame.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 20)) ttk.Label(search_frame, text="搜索:", style="Section.TLabel").pack(side=tk.LEFT, padx=5) self.search_var = tk.StringVar() self.search_entry = ttk.Entry(search_frame, textvariable=self.search_var, style="TEntry", font=("Microsoft YaHei", 10)) self.search_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True, ipady=2) self.search_entry.bind("<Return>", lambda event: self.search_data()) # 搜索按钮 search_btn = ttk.Button(search_frame, text="搜索", command=self.search_data, style="Primary.TButton") search_btn.pack(side=tk.LEFT, padx=5) # 重置按钮 reset_btn = ttk.Button(search_frame, text="重置", command=self.reset_search, style="Primary.TButton") reset_btn.pack(side=tk.LEFT) # 高级筛选按钮 adv_filter_btn = ttk.Button(search_frame, text="筛选", command=self.open_advanced_filter, style="Primary.TButton") adv_filter_btn.pack(side=tk.LEFT, padx=5) # 统计按钮 stats_btn = ttk.Button(search_frame, text="统计", command=self.show_statistics, style="Primary.TButton") stats_btn.pack(side=tk.LEFT) # 右侧操作按钮 button_frame = tk.Frame(function_frame, bg="#f0f2f5") button_frame.pack(side=tk.RIGHT) self.add_btn = ttk.Button(button_frame, text="添加", command=self.add_record, style="Primary.TButton") self.add_btn.pack(side=tk.LEFT, padx=5) self.edit_btn = ttk.Button(button_frame, text="修改", command=self.edit_record, style="Primary.TButton") self.edit_btn.pack(side=tk.LEFT, padx=5) self.delete_btn = ttk.Button(button_frame, text="删除", command=self.delete_record, style="Danger.TButton") self.delete_btn.pack(side=tk.LEFT, padx=5) # 表格区域 table_frame = tk.Frame(main_frame, bg="#e0e0e0", padx=1, pady=1) table_frame.pack(fill=tk.BOTH, expand=True) # 表格标题栏 table_header = tk.Frame(table_frame, bg="#f8f9fa", height=40) table_header.pack(fill=tk.X) table_header.pack_propagate(False) self.table_title = tk.Label(table_header, text=f"{self.current_category}档案列表", font=("Microsoft YaHei", 11, "bold"), bg="#f8f9fa", fg="#5f6368") self.table_title.pack(side=tk.LEFT, padx=15) # 表格容器 table_container = tk.Frame(table_frame, bg="white", bd=1, relief=tk.SOLID) table_container.pack(fill=tk.BOTH, expand=True) # 滚动条 scrollbar_x = ttk.Scrollbar(table_container, orient=tk.HORIZONTAL) scrollbar_y = ttk.Scrollbar(table_container, orient=tk.VERTICAL) # 表格 self.tree = ttk.Treeview( table_container, columns=self.get_columns(), show="headings", yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set, style="Treeview" ) # 配置列 columns = self.get_columns() for col in columns: self.tree.heading(col, text=col) width = 110 if col not in ["题名", "备注"] else 200 if col == "题名" else 150 self.tree.column(col, width=width, anchor=tk.CENTER, stretch=False) # 布局 scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y) scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X) self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar_y.config(command=self.tree.yview) scrollbar_x.config(command=self.tree.xview) # 绑定事件 self.tree.bind("<Double-1>", lambda e: self.edit_record()) # 分页控件 pagination_frame = tk.Frame(main_frame, bg="#f0f2f5", height=40, pady=10) pagination_frame.pack(fill=tk.X) # 上一页按钮 self.prev_btn = ttk.Button(pagination_frame, text="上一页", command=self.prev_page, style="Page.TButton", width=8) self.prev_btn.pack(side=tk.LEFT, padx=5) # 页码标签 self.page_label = ttk.Label(pagination_frame, text="1/1", style="Page.TLabel") self.page_label.pack(side=tk.LEFT, padx=10) # 下一页按钮 self.next_btn = ttk.Button(pagination_frame, text="下一页", command=self.next_page, style="Page.TButton", width=8) self.next_btn.pack(side=tk.LEFT, padx=5) # 跳转输入框 ttk.Label(pagination_frame, text="跳转至:", style="Page.TLabel").pack(side=tk.LEFT, padx=(20, 5)) self.page_var = tk.StringVar() self.page_entry = ttk.Entry(pagination_frame, textvariable=self.page_var, width=5, font=("Microsoft YaHei", 9)) self.page_entry.pack(side=tk.LEFT) # 跳转按钮 goto_btn = ttk.Button(pagination_frame, text="跳转", command=self.goto_page, style="Page.TButton", width=6) goto_btn.pack(side=tk.LEFT, padx=5) # 每页显示数量 ttk.Label(pagination_frame, text="每页显示:", style="Page.TLabel").pack(side=tk.LEFT, padx=(20, 5)) self.page_size_var = tk.StringVar(value=str(self.page_size)) page_size_combo = ttk.Combobox(pagination_frame, textvariable=self.page_size_var, width=5, font=("Microsoft YaHei", 9), state="readonly") page_size_combo['values'] = ('10', '20', '50', '100') page_size_combo.pack(side=tk.LEFT) page_size_combo.bind("<<ComboboxSelected>>", self.change_page_size) # 页脚 footer_frame = tk.Frame(main_frame, bg="#f0f2f5", height=30) footer_frame.pack(fill=tk.X, pady=(10, 0)) # 左侧状态信息 self.status_var = tk.StringVar(value="记录数量:0") status_label = ttk.Label( footer_frame, textvariable=self.status_var, style="Page.TLabel", anchor=tk.W ) status_label.pack(side=tk.LEFT, padx=20, pady=5) # 右侧版权信息 footer_label = ttk.Label( footer_frame, text="矿调所大数据中心 © 2025 开发人员:袁沙", style="Page.TLabel" ) footer_label.pack(side=tk.RIGHT, padx=20, pady=5) def center_window(self, window, width, height): """使窗口居中显示""" screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() x = (screen_width - width) // 2 y = (screen_height - height) // 2 - 20 # 稍微上移一点 window.geometry(f"{width}x{height}+{x}+{y}") window.focus_set() def get_columns(self): """获取当前类别的列""" if self.current_category == "文书类": return ["序号", "档号", "文号", "责任者", "题名", "日期", "密级", "页数", "保存期限", "载体形式", "保存库房", "备注"] else: if self.current_infra_view == "总表": return ["序号", "档号", "题名", "日期", "密级", "总页数", "保存期限", "载体形式", "保存库房", "备注"] else: return ["序号", "档号", "文号", "责任者", "题名", "日期", "密级", "页次", "保存期限", "载体形式", "保存库房", "备注"] def on_category_change(self): """类别改变时更新界面""" self.current_category = self.category_var.get() self.current_page = 1 # 重置到第一页 # 更新表格标题 self.table_title.config(text=f"{self.current_category}档案列表") # 清空表格数据 for item in self.tree.get_children(): self.tree.delete(item) # 根据类别显示/隐藏视图切换 if self.current_category == "基建类": self.view_frame.pack(side=tk.LEFT, padx=(0, 20)) self.summary_btn.pack(side=tk.LEFT, padx=10) self.detail_btn.pack(side=tk.LEFT, padx=10) else: self.view_frame.pack_forget() self.current_infra_view = "总表" # 重置视图 # 重新设置表格列 new_columns = self.get_columns() self.tree["columns"] = new_columns # 配置新列 for col in new_columns: self.tree.heading(col, text=col) width = 110 if col not in ["题名", "备注"] else 200 if col == "题名" else 150 self.tree.column(col, width=width, anchor=tk.CENTER, stretch=False) # 重新加载对应类别的数据 self.load_data() def on_view_change(self): """基建类视图切换""" if self.current_category == "基建类": self.current_infra_view = self.view_var.get() self.current_page = 1 # 重置到第一页 # 更新表格标题 self.table_title.config(text=f"基建类档案{self.current_infra_view}列表") # 清空表格数据 for item in self.tree.get_children(): self.tree.delete(item) # 重新设置表格列 new_columns = self.get_columns() self.tree["columns"] = new_columns # 配置新列 for col in new_columns: self.tree.heading(col, text=col) width = 110 if col not in ["题名", "备注"] else 200 if col == "题名" else 150 self.tree.column(col, width=width, anchor=tk.CENTER, stretch=False) # 重新加载数据 self.load_data() def load_data(self, search_term=None): """加载数据,使用参数化查询防止SQL注入""" try: # 清空表格 for item in self.tree.get_children(): self.tree.delete(item) # 根据当前类别和视图查询数据 if self.current_category == "文书类": query = """ SELECT id, file_number, document_number, responsible, title, date, security_level, page_count, retention_period, carrier_form, storage_location, remarks FROM documents """ count_query = "SELECT COUNT(*) FROM documents" else: if self.current_infra_view == "总表": query = """ SELECT id, file_number, title, date, security_level, total_pages, retention_period, carrier_form, storage_location, remarks FROM infrastructure_summary """ count_query = "SELECT COUNT(*) FROM infrastructure_summary" else: query = """ SELECT d.id, d.file_number, d.document_number, d.responsible, d.title, d.date, d.security_level, d.page_number, d.retention_period, d.carrier_form, d.storage_location, d.remarks FROM infrastructure_detail d """ count_query = "SELECT COUNT(*) FROM infrastructure_detail" # 添加筛选条件 where_clause = "" params = () # 应用高级筛选条件 if self.filter_conditions: conditions = [] for condition in self.filter_conditions: field, operator, value = condition # 处理日期范围 if operator == "between": start, end = value conditions.append(f"{field} BETWEEN ? AND ?") params += (start, end) else: conditions.append(f"{field} {operator} ?") params += (value,) where_clause = " AND ".join(conditions) # 添加搜索条件 if search_term: search_condition = " OR ".join([ "file_number LIKE ?", "title LIKE ?", "responsible LIKE ?", "document_number LIKE ?" ]) if where_clause: where_clause += " AND (" + search_condition + ")" else: where_clause = "WHERE " + search_condition search_pattern = f"%{search_term}%" params += (search_pattern, search_pattern, search_pattern, search_pattern) elif where_clause: where_clause = "WHERE " + where_clause # 计算总记录数 if where_clause: count_query += " " + where_clause self.cursor.execute(count_query, params) self.total_records = self.cursor.fetchone()[0] # 计算总页数 self.total_pages = max(1, (self.total_records + self.page_size - 1) // self.page_size) # 确保当前页在有效范围内 if self.current_page > self.total_pages: self.current_page = max(1, self.total_pages) # 添加分页限制 offset = (self.current_page - 1) * self.page_size query += " " + where_clause if where_clause else "" query += " ORDER BY id LIMIT ? OFFSET ?" params = params + (self.page_size, offset) self.cursor.execute(query, params) records = self.cursor.fetchall() # 更新状态栏 if search_term or self.filter_conditions: self.status_var.set(f"搜索到 {self.total_records} 条记录") else: self.status_var.set(f"总记录:{self.total_records} 条,当前显示第 {(self.current_page-1)*self.page_size+1} 到 {min(self.current_page*self.page_size, self.total_records)} 条") # 更新分页控件状态 self.prev_btn.state(["!disabled" if self.current_page > 1 else "disabled"]) self.next_btn.state(["!disabled" if self.current_page < self.total_pages else "disabled"]) self.page_label.config(text=f"{self.current_page}/{self.total_pages}") # 插入数据 start_index = (self.current_page - 1) * self.page_size + 1 for i, record in enumerate(records, start_index): values = (i,) + record[1:] tag = "even" if i % 2 == 0 else "odd" self.tree.insert("", tk.END, values=values, tags=(record[0], tag)) # 配置行样式 self.tree.tag_configure("odd", background="white") self.tree.tag_configure("even", background="#f8f9fa") except Exception as e: messagebox.showerror("数据库错误", f"加载数据失败: {str(e)}") traceback.print_exc() def search_data(self): """搜索当前类别的数据""" search_term = self.search_var.get().strip() self.current_page = 1 # 搜索后重置到第一页 self.load_data(search_term) def reset_search(self): """重置搜索""" self.search_var.set("") self.filter_conditions = [] # 清除筛选条件 self.current_page = 1 self.load_data() def change_page_size(self, event=None): """更改每页显示数量""" try: new_size = int(self.page_size_var.get()) if new_size > 0: self.page_size = new_size self.current_page = 1 # 重置到第一页 self.load_data() except ValueError: pass def prev_page(self): """上一页""" if self.current_page > 1: self.current_page -= 1 self.load_data(self.search_var.get().strip()) def next_page(self): """下一页""" if self.current_page < self.total_pages: self.current_page += 1 self.load_data(self.search_var.get().strip()) def goto_page(self): """跳转到指定页码""" try: page_num = int(self.page_var.get()) if 1 <= page_num <= self.total_pages: self.current_page = page_num self.load_data(self.search_var.get().strip()) else: messagebox.showwarning("提示", f"请输入1到{self.total_pages}之间的页码") except ValueError: messagebox.showwarning("提示", "请输入有效的页码数字") def open_advanced_filter(self): """打开高级筛选对话框""" dialog = tk.Toplevel(self.root) dialog.title("筛选") self.center_window(dialog, 600, 400) dialog.resizable(False, False) dialog.transient(self.root) dialog.grab_set() dialog.configure(bg="#f0f2f5") # 标题栏 header = tk.Frame(dialog, bg="#4285f4", height=50) header.pack(fill=tk.X) header.pack_propagate(False) tk.Label(header, text="筛选条件", font=("Microsoft YaHei", 14, "bold"), bg="#4285f4", fg="white").pack(pady=12) # 内容区域 content_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) content_frame.pack(fill=tk.BOTH, expand=True) # 条件列表 conditions_frame = tk.Frame(content_frame, bg="#f0f2f5") conditions_frame.pack(fill=tk.BOTH, expand=True) # 字段列表(根据当前类别) if self.current_category == "文书类": fields = ["档号", "文号", "责任者", "题名", "日期", "密级", "页数", "保存期限", "载体形式", "保存库房", "备注"] else: if self.current_infra_view == "总表": fields = ["档号", "题名", "日期", "密级", "总页数", "保存期限", "载体形式", "保存库房", "备注"] else: fields = ["档号", "文号", "责任者", "题名", "日期", "密级", "页次", "保存期限", "载体形式", "保存库房", "备注"] # 运算符 operators = ["=", "!=", ">", "<", ">=", "<=", "LIKE", "BETWEEN"] # 当前条件 self.conditions = [] # 添加初始条件行 self.add_condition_row(conditions_frame, fields, operators) # 添加条件按钮 add_btn_frame = tk.Frame(conditions_frame, bg="#f0f2f5") add_btn_frame.pack(fill=tk.X, pady=10) ttk.Button(add_btn_frame, text="添加条件", command=lambda: self.add_condition_row(conditions_frame, fields, operators), style="Primary.TButton").pack(side=tk.LEFT) # 按钮区域 btn_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) btn_frame.pack(fill=tk.X) ttk.Button(btn_frame, text="筛选", command=lambda: self.apply_filter(dialog), style="Primary.TButton").pack(side=tk.RIGHT, padx=10) ttk.Button(btn_frame, text="取消", command=dialog.destroy, style="Primary.TButton").pack(side=tk.RIGHT) def add_condition_row(self, parent, fields, operators): """添加一个条件行""" row_frame = tk.Frame(parent, bg="#f0f2f5", pady=5) row_frame.pack(fill=tk.X) # 字段选择 field_var = tk.StringVar(value=fields[0]) field_combo = ttk.Combobox(row_frame, textvariable=field_var, values=fields, width=12, state="readonly") field_combo.pack(side=tk.LEFT, padx=5) # 运算符选择 operator_var = tk.StringVar(value=operators[0]) operator_combo = ttk.Combobox(row_frame, textvariable=operator_var, values=operators, width=8, state="readonly") operator_combo.pack(side=tk.LEFT, padx=5) # 值输入 value_var = tk.StringVar() value_entry = ttk.Entry(row_frame, textvariable=value_var, width=20) value_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True) # 日期范围输入(当运算符为BETWEEN时显示) start_var = tk.StringVar() end_var = tk.StringVar() date_frame = tk.Frame(row_frame, bg="#f0f2f5") ttk.Entry(date_frame, textvariable=start_var, width=10).pack(side=tk.LEFT) ttk.Label(date_frame, text="至", bg="#f0f2f5").pack(side=tk.LEFT, padx=5) ttk.Entry(date_frame, textvariable=end_var, width=10).pack(side=tk.LEFT) date_frame.pack_forget() # 初始隐藏 # 删除按钮 delete_btn = ttk.Button(row_frame, text="×", width=2, command=lambda r=row_frame: r.destroy()) delete_btn.pack(side=tk.RIGHT, padx=5) # 绑定运算符变化事件 def on_operator_change(*args): if operator_var.get() == "BETWEEN": value_entry.pack_forget() date_frame.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True) else: date_frame.pack_forget() value_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True) operator_var.trace("w", on_operator_change) # 保存行引用 self.conditions.append({ "row": row_frame, "field": field_var, "operator": operator_var, "value": value_var, "start": start_var, "end": end_var }) def apply_filter(self, dialog): """应用筛选条件""" self.filter_conditions = [] for condition in self.conditions: if condition["row"].winfo_exists(): # 确保行未被删除 field = condition["field"].get() operator = condition["operator"].get() if operator == "BETWEEN": start = condition["start"].get().strip() end = condition["end"].get().strip() if not start or not end: continue # 验证日期格式 try: datetime.strptime(start, "%Y-%m-%d") datetime.strptime(end, "%Y-%m-%d") self.filter_conditions.append((field, operator, (start, end))) except ValueError: messagebox.showwarning("格式错误", "请输入有效的日期格式(YYYY-MM-DD)") return else: value = condition["value"].get().strip() if value: if operator == "LIKE": value = f"%{value}%" self.filter_conditions.append((field, operator, value)) self.current_page = 1 self.load_data() dialog.destroy() def show_statistics(self): """显示统计结果""" dialog = tk.Toplevel(self.root) dialog.title("档案统计") self.center_window(dialog, 600, 400) dialog.resizable(False, False) dialog.transient(self.root) dialog.grab_set() dialog.configure(bg="#f0f2f5") # 标题栏 header = tk.Frame(dialog, bg="#4285f4", height=50) header.pack(fill=tk.X) header.pack_propagate(False) tk.Label(header, text="档案统计结果", font=("Microsoft YaHei", 14, "bold"), bg="#4285f4", fg="white").pack(pady=12) # 内容区域 content_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) content_frame.pack(fill=tk.BOTH, expand=True) # 统计结果文本区域 stats_text = scrolledtext.ScrolledText(content_frame, wrap=tk.WORD, font=("Microsoft YaHei", 10)) stats_text.pack(fill=tk.BOTH, expand=True) # 获取统计结果 stats_result = self.get_statistics() stats_text.insert(tk.END, stats_result) stats_text.config(state=tk.DISABLED) # 导出按钮 btn_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=10) btn_frame.pack(fill=tk.X) ttk.Button(btn_frame, text="导出统计结果", command=lambda: self.export_statistics(stats_result), style="Primary.TButton").pack(side=tk.RIGHT) def get_statistics(self): """获取统计结果""" result = "" if self.current_category == "文书类": # 文书类按年份统计 self.cursor.execute(""" SELECT SUBSTR(file_number, INSTR(file_number, '·') + 1, 4) AS year, COUNT(DISTINCT file_number) AS file_count FROM documents WHERE year GLOB '[0-9][0-9][0-9][0-9]' GROUP BY year ORDER BY year """) year_stats = self.cursor.fetchall() result += "文书类档案按年份统计:\n" result += "年份\t档号数量\n" result += "----------------\n" for row in year_stats: result += f"{row[0]}\t{row[1]}\n" result += "\n" else: # 基建类 if self.current_infra_view == "总表": # 总表按保存库房统计 self.cursor.execute(""" SELECT storage_location, COUNT(*) AS count FROM infrastructure_summary GROUP BY storage_location ORDER BY storage_location """) location_stats = self.cursor.fetchall() result += "基建类总表按保存库房统计:\n" result += "保存库房\t数量\n" result += "----------------\n" for row in location_stats: result += f"{row[0]}\t{row[1]}\n" else: # 明细按档号统计 self.cursor.execute(""" SELECT file_number, COUNT(*) AS count FROM infrastructure_detail GROUP BY file_number ORDER BY file_number """) file_stats = self.cursor.fetchall() result += "基建类明细按档号统计:\n" result += "档号\t数量\n" result += "----------------\n" for row in file_stats: result += f"{row[0]}\t{row[1]}\n" return result # def export_statistics(self, stats_result): # """导出统计结果到文件""" # file_path = filedialog.asksaveasfilename( # defaultextension=".txt", # filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")], # title="保存统计结果" # ) # # if file_path: # try: # with open(file_path, "w", encoding="utf-8") as f: # f.write(stats_result) # messagebox.showinfo("成功", "统计结果已成功导出!") # except Exception as e: # messagebox.showerror("错误", f"导出失败: {str(e)}") def add_record(self): """添加记录对话框 - 两列布局""" dialog = tk.Toplevel(self.root) dialog.title(f"添加{self.current_category}档案") self.center_window(dialog, 800, 550) dialog.resizable(False, False) dialog.transient(self.root) dialog.grab_set() dialog.configure(bg="#f0f2f5") # 标题栏 header = tk.Frame(dialog, bg="#4285f4", height=50) header.pack(fill=tk.X) header.pack_propagate(False) tk.Label(header, text=f"添加{self.current_category}档案", font=("Microsoft YaHei", 14, "bold"), bg="#4285f4", fg="white").pack(pady=12) # 内容区域 content_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) content_frame.pack(fill=tk.BOTH, expand=True) # 创建双列容器 columns_frame = tk.Frame(content_frame, bg="#f0f2f5") columns_frame.pack(fill=tk.BOTH, expand=True) # 左列框架 left_frame = tk.Frame(columns_frame, bg="#f0f2f5", padx=10) left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 右列框架 right_frame = tk.Frame(columns_frame, bg="#f0f2f5", padx=10) right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) # 输入字段 entries = {} columns = self.get_columns()[1:] # 排除序号 # 左列字段 left_columns = columns[:len(columns)//2] for col in left_columns: frame = tk.Frame(left_frame, bg="#f0f2f5", pady=8) frame.pack(fill=tk.X) label_text = f"{col}*" if col in ["档号", "题名"] else col label_color = "#ea4335" if col in ["档号", "题名"] else "#5f6368" tk.Label(frame, text=label_text, width=8, font=("Microsoft YaHei", 10), bg="#f0f2f5", fg=label_color, anchor="w").pack(side=tk.LEFT) entry_style = "Required.TEntry" if col in ["档号", "题名"] else "TEntry" entry = ttk.Entry(frame, font=("Microsoft YaHei", 10), style=entry_style) entry.pack(side=tk.RIGHT, fill=tk.X, expand=True, ipady=3, padx=(10, 0)) entries[col] = entry # 右列字段 right_columns = columns[len(columns)//2:] for col in right_columns: frame = tk.Frame(right_frame, bg="#f0f2f5", pady=8) frame.pack(fill=tk.X) label_text = f"{col}*" if col in ["档号", "题名"] else col label_color = "#ea4335" if col in ["档号", "题名"] else "#5f6368" tk.Label(frame, text=label_text, width=8, font=("Microsoft YaHei", 10), bg="#f0f2f5", fg=label_color, anchor="w").pack(side=tk.LEFT) entry_style = "Required.TEntry" if col in ["档号", "题名"] else "TEntry" entry = ttk.Entry(frame, font=("Microsoft YaHei", 10), style=entry_style) entry.pack(side=tk.RIGHT, fill=tk.X, expand=True, ipady=3, padx=(10, 0)) entries[col] = entry # 按钮区域 btn_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) btn_frame.pack(fill=tk.X) # 交换按钮顺序:先保存后取消 ttk.Button(btn_frame, text="保存", command=lambda: self.save_record(entries, dialog, is_new=True), style="Primary.TButton").pack(side=tk.RIGHT, padx=10) ttk.Button(btn_frame, text="取消", command=dialog.destroy, style="Primary.TButton").pack(side=tk.RIGHT) def edit_record(self): """编辑记录对话框 - 两列布局""" selected_items = self.tree.selection() if not selected_items: messagebox.showwarning("提示", "请先选择一条记录!") return selected_item = selected_items[0] record_id = self.tree.item(selected_item, "tags")[0] current_values = self.tree.item(selected_item, "values") # 创建对话框 dialog = tk.Toplevel(self.root) dialog.title(f"修改{self.current_category}档案") self.center_window(dialog, 800, 550) dialog.resizable(False, False) dialog.transient(self.root) dialog.grab_set() dialog.configure(bg="#f0f2f5") # 标题栏 header = tk.Frame(dialog, bg="#4285f4", height=50) header.pack(fill=tk.X) header.pack_propagate(False) tk.Label(header, text=f"修改{self.current_category}档案", font=("Microsoft YaHei", 14, "bold"), bg="#4285f4", fg="white").pack(pady=12) # 内容区域 content_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) content_frame.pack(fill=tk.BOTH, expand=True) # 创建双列容器 columns_frame = tk.Frame(content_frame, bg="#f0f2f5") columns_frame.pack(fill=tk.BOTH, expand=True) # 左列框架 left_frame = tk.Frame(columns_frame, bg="#f0f2f5", padx=10) left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 右列框架 right_frame = tk.Frame(columns_frame, bg="#f0f2f5", padx=10) right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) # 输入字段 entries = {} columns = self.get_columns()[1:] # 排除序号 values = current_values[1:] # 排除序号 # 左列字段 left_columns = columns[:len(columns)//2] for i, col in enumerate(left_columns): frame = tk.Frame(left_frame, bg="#f0f2f5", pady=8) frame.pack(fill=tk.X) label_text = f"{col}*" if col in ["档号", "题名"] else col label_color = "#ea4335" if col in ["档号", "题名"] else "#5f6368" tk.Label(frame, text=label_text, width=8, font=("Microsoft YaHei", 10), bg="#f0f2f5", fg=label_color, anchor="w").pack(side=tk.LEFT) entry_style = "Required.TEntry" if col in ["档号", "题名"] else "TEntry" entry = ttk.Entry(frame, font=("Microsoft YaHei", 10), style=entry_style) entry.pack(side=tk.RIGHT, fill=tk.X, expand=True, ipady=3, padx=(10, 0)) # 填充现有值 if i < len(values): entry.insert(0, values[i]) entries[col] = entry # 右列字段 right_columns = columns[len(columns)//2:] for i, col in enumerate(right_columns): frame = tk.Frame(right_frame, bg="#f0f2f5", pady=8) frame.pack(fill=tk.X) label_text = f"{col}*" if col in ["档号", "题名"] else col label_color = "#ea4335" if col in ["档号", "题名"] else "#5f6368" tk.Label(frame, text=label_text, width=8, font=("Microsoft YaHei", 10), bg="#f0f2f5", fg=label_color, anchor="w").pack(side=tk.LEFT) entry_style = "Required.TEntry" if col in ["档号", "题名"] else "TEntry" entry = ttk.Entry(frame, font=("Microsoft YaHei", 10), style=entry_style) entry.pack(side=tk.RIGHT, fill=tk.X, expand=True, ipady=3, padx=(10, 0)) # 填充现有值 idx = len(left_columns) + i if idx < len(values): entry.insert(0, values[idx]) entries[col] = entry # 按钮区域 btn_frame = tk.Frame(dialog, bg="#f0f2f5", padx=20, pady=15) btn_frame.pack(fill=tk.X) # 交换按钮顺序:先保存后取消 ttk.Button(btn_frame, text="保存", command=lambda: self.save_record(entries, dialog, is_new=False, record_id=record_id), style="Primary.TButton").pack(side=tk.RIGHT, padx=10) ttk.Button(btn_frame, text="取消", command=dialog.destroy, style="Primary.TButton").pack(side=tk.RIGHT) def save_record(self, entries, dialog, is_new=True, record_id=None): """保存记录(新增或修改)""" try: # 收集数据 data = {} for col, entry in entries.items(): data[col] = entry.get().strip() # 验证 if not data["档号"]: messagebox.showerror("错误", "档号不能为空!") return if not data["题名"]: messagebox.showerror("错误", "题名不能为空!") return if is_new: # 新增记录 if self.current_category == "文书类": self.cursor.execute(''' INSERT INTO documents ( file_number, document_number, responsible, title, date, security_level, page_count, retention_period, carrier_form, storage_location, remarks ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"], data["密级"], data["页数"] if data["页数"] else None, data["保存期限"], data["载体形式"], data["保存库房"], data["备注"] )) else: if self.current_infra_view == "总表": self.cursor.execute(''' INSERT INTO infrastructure_summary ( file_number, title, date, security_level, total_pages, retention_period, carrier_form, storage_location, remarks ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( data["档号"], data["题名"], data["日期"], data["密级"], data["总页数"] if data["总页数"] else None, data["保存期限"], data["载体形式"], data["保存库房"], data["备注"] )) else: # 明细需要关联总表 # 查找总表ID self.cursor.execute("SELECT id FROM infrastructure_summary WHERE file_number = ?", (data["档号"],)) summary = self.cursor.fetchone() summary_id = summary[0] if summary else None self.cursor.execute(''' INSERT INTO infrastructure_detail ( summary_id, file_number, document_number, responsible, title, date, security_level, page_number, retention_period, carrier_form, storage_location, remarks ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( summary_id, data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"], data["密级"], data["页次"], data["保存期限"], data["载体形式"], data["保存库房"], data["备注"] )) else: # 修改记录 if self.current_category == "文书类": self.cursor.execute(''' UPDATE documents SET file_number = ?, document_number = ?, responsible = ?, title = ?, date = ?, security_level = ?, page_count = ?, retention_period = ?, carrier_form = ?, storage_location = ?, remarks = ? WHERE id = ? ''', ( data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"], data["密级"], data["页数"] if data["页数"] else None, data["保存期限"], data["载体形式"], data["保存库房"], data["备注"], record_id )) else: if self.current_infra_view == "总表": self.cursor.execute(''' UPDATE infrastructure_summary SET file_number = ?, title = ?, date = ?, security_level = ?, total_pages = ?, retention_period = ?, carrier_form = ?, storage_location = ?, remarks = ? WHERE id = ? ''', ( data["档号"], data["题名"], data["日期"], data["密级"], data["总页数"] if data["总页数"] else None, data["保存期限"], data["载体形式"], data["保存库房"], data["备注"], record_id )) else: # 更新明细时同时更新关联的总表ID self.cursor.execute("SELECT id FROM infrastructure_summary WHERE file_number = ?", (data["档号"],)) summary = self.cursor.fetchone() summary_id = summary[0] if summary else None self.cursor.execute(''' UPDATE infrastructure_detail SET summary_id = ?, file_number = ?, document_number = ?, responsible = ?, title = ?, date = ?, security_level = ?, page_number = ?, retention_period = ?, carrier_form = ?, storage_location = ?, remarks = ? WHERE id = ? ''', ( summary_id, data["档号"], data["文号"], data["责任者"], data["题名"], data["日期"], data["密级"], data["页次"], data["保存期限"], data["载体形式"], data["保存库房"], data["备注"], record_id )) self.conn.commit() dialog.destroy() self.load_data() messagebox.showinfo("成功", "记录保存成功!") except Exception as e: messagebox.showerror("错误", f"保存失败:{str(e)}") traceback.print_exc() def delete_record(self): """删除记录""" selected_items = self.tree.selection() if not selected_items: messagebox.showwarning("提示", "请先选择一条记录!") return if messagebox.askyesno("确认删除", "确定要删除选中的记录吗?\n此操作不可恢复。"): selected_item = selected_items[0] record_id = self.tree.item(selected_item, "tags")[0] try: if self.current_category == "文书类": self.cursor.execute("DELETE FROM documents WHERE id = ?", (record_id,)) else: if self.current_infra_view == "总表": # 删除总表时同时删除关联的明细 self.cursor.execute("DELETE FROM infrastructure_summary WHERE id = ?", (record_id,)) self.cursor.execute("DELETE FROM infrastructure_detail WHERE summary_id = ?", (record_id,)) else: self.cursor.execute("DELETE FROM infrastructure_detail WHERE id = ?", (record_id,)) self.conn.commit() self.load_data() messagebox.showinfo("成功", "记录已删除") except Exception as e: messagebox.showerror("错误", f"删除失败:{str(e)}") traceback.print_exc() if name == “main”: try: root = tk.Tk() app = FileManagementSystem(root) root.mainloop() except Exception as e: messagebox.showerror(“系统错误”, f"程序发生致命错误: {str(e)}") traceback.print_exc()
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值