# 读取文件内容 with open('G:\PyCode\domainScanDemo\app\ui\domain_filter.py', 'r', encoding='utf-8') as f: lines = f.readlines() # 找到UpdateThread类的开始和结束行 start_line = -1 end_line = -1 for i, line in enumerate(lines): if 'class UpdateThread(QThread):' in line: start_line = i elif start_line != -1 and 'class QueryThread(QThread):' in line: end_line = i break if start_line != -1 and end_line != -1: # 构建新的UpdateThread类 new_update_thread = [ 'class UpdateThread(QThread):\n', ' """\n', ' 批量更新线程\n', ' """\n', ' update_finished = Signal(int, dict)\n', ' \n', ' def __init__(self, selected_domains, update_values):\n', ' super().__init__()\n', ' self.selected_domains = selected_domains\n', ' self.update_values = update_values\n', ' \n', ' def run(self):\n', ' """\n', ' 执行批量更新\n', ' """\n', ' # 转换状态值的映射\n', ' status_mappings = {\n', ' \'复核状态\': {\n', ' \'无需复核\': 0,\n', ' \'待人工复核\': 1,\n', ' \'人工通过\': 2,\n', ' \'人工拒绝\': 3\n', ' },\n', ' \'备案历史\': {\n', ' \'待检测\': 1,\n', ' \'有备案记录\': 2,\n', ' \'没有备案记录\': 3\n', ' },\n', ' \'备案年份\': {\n', ' \'2026\': 2026,\n', ' \'2025\': 2025,\n', ' \'2024\': 2024,\n', ' \'2023\': 2023,\n', ' \'2022\': 2022,\n', ' \'2021\': 2021,\n', ' \'2020\': 2020\n', ' },\n', ' \'域名快照年份\': {\n', ' \'2026,2025,2024\': \'2026,2025,2024\',\n', ' \'2026\': \'2026\',\n', ' \'2025\': \'2025\',\n', ' \'2024\': \'2024\',\n', ' \'2023\': \'2023\',\n', ' \'2022\': \'2022\',\n', ' \'2021\': \'2021\',\n', ' \'2020\': \'2020\'\n', ' },\n', ' \'单位性质\': {\n', ' \'企业\': \'企业\',\n', ' \'个人\': \'个人\'\n', ' },\n', ' \'百度历史收录状态\': {\n', ' \'是\': True,\n', ' \'否\': False\n', ' },\n', ' \'百度site收录状态\': {\n', ' \'是\': True,\n', ' \'否\': False\n', ' },\n', ' \'title是否简体中文\': {\n', ' \'是\': True,\n', ' \'否\': False\n', ' },\n', ' \'360 site收录状态\': {\n', ' \'是\': True,\n', ' \'否\': False\n', ' },\n', ' \'Google site收录状态\': {\n', ' \'是\': True,\n', ' \'否\': False\n', ' },\n', ' \'快照历史友链数量是否大于10\': {\n', ' \'是\': True,\n', ' \'否\': False\n', ' }\n', ' }\n', ' \n', ' updated_count = 0\n', ' update_data = {}\n', ' \n', ' try:\n', ' db = Database()\n', ' # 获取一个数据库连接,在整个批量更新过程中使用\n', ' conn, cur = db.connect()\n', ' if not conn or not cur:\n', ' logger.error("获取数据库连接失败")\n', ' self.update_finished.emit(0, {})\n', ' return\n', ' \n', ' try:\n', ' for domain in self.selected_domains:\n', ' # 获取域名ID\n', ' domain_info = db.get_domain_by_name(domain)\n', ' if domain_info:\n', ' try:\n', ' domain_update_data = {}\n', ' \n', ' # 1. 复核状态\n', ' review_status_value = self.update_values[\'review_status\']\n', ' if review_status_value != \'不更新\':\n', ' status_value = status_mappings[\'复核状态\'][review_status_value]\n', ' cur.execute("UPDATE domains SET review_status = %s WHERE id = %s", (status_value, domain_info[\'id\']))\n', ' domain_update_data[\'review_status\'] = review_status_value\n', ' \n', ' # 2. 域名过期时间\n', ' expire_date_value = self.update_values[\'expire_date\']\n', ' if expire_date_value and expire_date_value != \'不更新\':\n', ' if expire_date_value == \'当前时间\':\n', ' cur.execute("UPDATE domains SET expire_date = CURRENT_TIMESTAMP WHERE id = %s", (domain_info[\'id\'],))\n', ' import datetime\n', ' domain_update_data[\'expire_date\'] = datetime.datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\')\n', ' else:\n', ' cur.execute("UPDATE domains SET expire_date = %s WHERE id = %s", (expire_date_value, domain_info[\'id\']))\n', ' domain_update_data[\'expire_date\'] = expire_date_value\n', ' \n', ' # 3. 备案历史\n', ' has_beian_value = self.update_values[\'has_beian\']\n', ' if has_beian_value != \'不更新\':\n', ' status_value = status_mappings[\'备案历史\'][has_beian_value]\n', ' cur.execute("UPDATE domains SET has_beian = %s WHERE id = %s", (status_value, domain_info[\'id\']))\n', ' domain_update_data[\'has_beian\'] = has_beian_value\n', ' \n', ' # 4. 备案年份\n', ' beian_year_value = self.update_values[\'beian_year\']\n', ' if beian_year_value and beian_year_value != \'不更新\':\n', ' cur.execute("UPDATE domains SET beian_year = %s WHERE id = %s", (beian_year_value, domain_info[\'id\']))\n', ' domain_update_data[\'beian_year\'] = beian_year_value\n', ' \n', ' # 5. 域名快照年份\n', ' snapshot_years_value = self.update_values[\'snapshot_years\']\n', ' if snapshot_years_value and snapshot_years_value != \'不更新\':\n', ' cur.execute("UPDATE domains SET snapshot_years = %s WHERE id = %s", (snapshot_years_value, domain_info[\'id\']))\n', ' domain_update_data[\'snapshot_years\'] = snapshot_years_value\n', ' \n', ' # 6. 单位性质\n', ' company_type_value = self.update_values[\'company_type\']\n', ' if company_type_value != \'不更新\':\n', ' status_value = status_mappings[\'单位性质\'][company_type_value]\n', ' cur.execute("UPDATE domains SET company_type = %s WHERE id = %s", (status_value, domain_info[\'id\']))\n', ' domain_update_data[\'company_type\'] = company_type_value\n', ' \n', ' # 7. 检测时间\n', ' detect_time_value = self.update_values[\'detect_time\']\n', ' if detect_time_value and detect_time_value != \'不更新\':\n', ' if detect_time_value == \'当前时间\':\n', ' cur.execute("UPDATE domains SET detect_time = CURRENT_TIMESTAMP WHERE id = %s", (domain_info[\'id\'],))\n', ' import datetime\n', ' domain_update_data[\'detect_time\'] = datetime.datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\')\n', ' else:\n', ' cur.execute("UPDATE domains SET detect_time = %s WHERE id = %s", (detect_time_value, domain_info[\'id\']))\n', ' domain_update_data[\'detect_time\'] = detect_time_value\n', ' \n', ' # 8. 检查domain_detections表中是否存在记录\n', ' cur.execute("SELECT id FROM domain_detections WHERE domain_id = %s", (domain_info[\'id\'],))\n', ' detection_id = cur.fetchone()\n', ' \n', ' # 9. 首页网址\n', ' website_url_value = self.update_values[\'website_url\']\n', ' if website_url_value != \'不更新\':\n', ' # 更新域名表中的website_url字段\n', ' cur.execute("UPDATE domains SET website_url = %s WHERE id = %s", (website_url_value, domain_info[\'id\']))\n', ' domain_update_data[\'website_url\'] = website_url_value\n', ' \n', ' # 10. 百度历史收录状态\n', ' baidu_history_value = self.update_values[\'baidu_history\']\n', ' if baidu_history_value != \'不更新\':\n', ' status_value = status_mappings[\'百度历史收录状态\'][baidu_history_value]\n', ' # 转换为JSON格式\n', ' import json\n', ' json_value = json.dumps({"status": status_value})\n', ' if detection_id:\n', ' cur.execute("UPDATE domain_detections SET baidu_history = %s WHERE domain_id = %s", (json_value, domain_info[\'id\']))\n', ' else:\n', ' cur.execute("INSERT INTO domain_detections (domain_id, baidu_history) VALUES (%s, %s)", (domain_info[\'id\'], json_value))\n', ' domain_update_data[\'baidu_history\'] = baidu_history_value\n', ' \n', ' # 11. 百度site收录状态\n', ' baidu_site_value = self.update_values[\'baidu_site\']\n', ' if baidu_site_value != \'不更新\':\n', ' status_value = status_mappings[\'百度site收录状态\'][baidu_site_value]\n', ' # 转换为JSON格式\n', ' import json\n', ' json_value = json.dumps({"status": status_value})\n', ' if detection_id:\n', ' cur.execute("UPDATE domain_detections SET baidu_site = %s WHERE domain_id = %s", (json_value, domain_info[\'id\']))\n', ' else:\n', ' cur.execute("INSERT INTO domain_detections (domain_id, baidu_site) VALUES (%s, %s)", (domain_info[\'id\'], json_value))\n', ' domain_update_data[\'baidu_site\'] = baidu_site_value\n', ' \n', ' # 12. title是否简体中文\n', ' is_chinese_title_value = self.update_values[\'is_chinese_title\']\n', ' if is_chinese_title_value != \'不更新\':\n', ' status_value = status_mappings[\'title是否简体中文\'][is_chinese_title_value]\n', ' if detection_id:\n', ' cur.execute("UPDATE domain_detections SET is_chinese_title = %s WHERE domain_id = %s", (status_value, domain_info[\'id\']))\n', ' else:\n', ' cur.execute("INSERT INTO domain_detections (domain_id, is_chinese_title) VALUES (%s, %s)", (domain_info[\'id\'], status_value))\n', ' domain_update_data[\'is_chinese_title\'] = is_chinese_title_value\n', ' \n', ' # 13. 360 site收录状态\n', ' qihu360_site_value = self.update_values[\'qihu360_site\']\n', ' if qihu360_site_value != \'不更新\':\n', ' status_value = status_mappings[\'360 site收录状态\'][qihu360_site_value]\n', ' # 转换为JSON格式\n', ' import json\n', ' json_value = json.dumps({"status": status_value})\n', ' if detection_id:\n', ' cur.execute("UPDATE domain_detections SET qihu360_site = %s WHERE domain_id = %s", (json_value, domain_info[\'id\']))\n', ' else:\n', ' cur.execute("INSERT INTO domain_detections (domain_id, qihu360_site) VALUES (%s, %s)", (domain_info[\'id\'], json_value))\n', ' domain_update_data[\'qihu360_site\'] = qihu360_site_value\n', ' \n', ' # 14. Google site收录状态\n', ' google_site_value = self.update_values[\'google_site\']\n', ' if google_site_value != \'不更新\':\n', ' status_value = status_mappings[\'Google site收录状态\'][google_site_value]\n', ' # 转换为JSON格式\n', ' import json\n', ' json_value = json.dumps({"status": status_value})\n', ' if detection_id:\n', ' cur.execute("UPDATE domain_detections SET google_site = %s WHERE domain_id = %s", (json_value, domain_info[\'id\']))\n', ' else:\n', ' cur.execute("INSERT INTO domain_detections (domain_id, google_site) VALUES (%s, %s)", (domain_info[\'id\'], json_value))\n', ' domain_update_data[\'google_site\'] = google_site_value\n', ' \n', ' # 15. 友链数量\n', ' backlink_count_value = self.update_values[\'backlink_count\']\n', ' if backlink_count_value and backlink_count_value != \'不更新\':\n', ' # 更新domains表中的backlink_count字段\n', ' cur.execute("UPDATE domains SET backlink_count = %s WHERE id = %s", (backlink_count_value, domain_info[\'id\']))\n', ' # 同时更新domain_detections表中的backlink_count_gt_10字段(是否大于10)\n', ' backlink_count_gt_10 = int(backlink_count_value) > 10\n', ' if detection_id:\n', ' cur.execute("UPDATE domain_detections SET backlink_count_gt_10 = %s WHERE domain_id = %s", (backlink_count_gt_10, domain_info[\'id\']))\n', ' else:\n', ' cur.execute("INSERT INTO domain_detections (domain_id, backlink_count_gt_10) VALUES (%s, %s)", (domain_info[\'id\'], backlink_count_gt_10))\n', ' domain_update_data[\'backlink_count\'] = backlink_count_value\n', ' \n', ' # 提交事务\n', ' conn.commit()\n', ' updated_count += 1\n', ' update_data[domain] = domain_update_data\n', ' except Exception as e:\n', ' logger.error(f"更新域名状态失败: {e}")\n', ' if conn:\n', ' try:\n', ' conn.rollback()\n', ' except:\n', ' pass\n', ' except Exception as e:\n', ' logger.error(f"批量更新失败: {e}")\n', ' finally:\n', ' # 关闭连接\n', ' db.close(conn, cur)\n', ' except Exception as e:\n', ' logger.error(f"更新状态失败: {e}")\n', ' \n', ' # 发送更新完成信号\n', ' self.update_finished.emit(updated_count, update_data)\n', '\n', '\n' ] # 替换UpdateThread类 new_lines = lines[:start_line] + new_update_thread + lines[end_line:] # 写回文件 with open('G:\PyCode\domainScanDemo\app\ui\domain_filter.py', 'w', encoding='utf-8') as f: f.writelines(new_lines) print('UpdateThread class updated successfully') else: print('UpdateThread class not found')