[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"tag-posts-ri-zhi":48,"footer-friends":98,"tag-projects-ri-zhi":111,"sidebar-tags":115,"sidebar-donations":264,"ad-sidebar_top":271,"ad-sidebar_mid":273,"ad-sidebar_bottom":275},{"alipayQr":4,"beianNumber":5,"commentsRequireApproval":6,"contactEmail":7,"copyrightNotice":5,"donationEnabled":6,"emailCodeExpireMinutes":8,"enableRegistration":6,"followBilibiliUrl":9,"followGithubUrl":10,"followQqGroup":11,"followQqQr":12,"followWechatQr":13,"footerHtml":5,"gaTrackingId":5,"heroEnabled":6,"heroSearchPlaceholder":5,"heroSubtitle":14,"heroTitle":15,"homeCategoryTabsCount":16,"homePageSize":17,"homeProjectsCount":18,"homeSpecialsCount":19,"homeToolsCount":18,"icpNumber":20,"inviteDefaultQuota":21,"inviteRequired":22,"logoUrl":23,"mailPasswordChangedBody":24,"mailPasswordChangedSubject":25,"mailRegisterCodeBody":26,"mailRegisterCodeSubject":27,"mailResetCodeBody":28,"mailResetCodeSubject":29,"mailWelcomeBody":30,"mailWelcomeSubject":31,"miniappAppid":32,"miniappEnabled":6,"profileAvatar":33,"profileBio":34,"profileName":35,"profileWechatQr":36,"promoteEnabled":6,"promoteNotice":5,"promoteWechat":5,"requireEmailVerify":6,"sectionArticleEnabled":6,"sectionArticleTitle":37,"sectionProjectsEnabled":6,"sectionProjectsTitle":38,"sectionSpecialEnabled":6,"sectionSpecialTitle":39,"sectionToolsEnabled":6,"sectionToolsTitle":40,"seoAuthor":41,"seoBaiduTongjiId":5,"seoBaiduVerify":5,"seoCanonicalEnabled":6,"seoDescription":42,"seoGoogleVerify":5,"seoKeywords":5,"seoOgImage":23,"seoRobots":5,"seoSitemapEnabled":6,"seoTitle":43,"seoTitleTemplate":44,"showHeroStats":6,"showSidebarDonations":6,"showSidebarFeedback":6,"showSidebarFollowUs":6,"showSidebarProfile":6,"showSidebarTagCloud":6,"siteDescription":42,"siteFavicon":45,"siteName":41,"siteUrl":46,"wechatQr":47},"\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790628031878385634.png","","true","enghin110@qq.com","10","https:\u002F\u002Fspace.bilibili.com\u002F470616503","https:\u002F\u002Fgithub.com\u002Fitwuge","606262780","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790627647190853446.png","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790627638856258082.jpg","精选 AI 教程、开源项目与实用工具，助你从入门到精通","探索人工智能的无限可能","6","7","4","3","赣ICP备2023014108号-2","5","false","\u002Fimages\u002Flogo\u002Flogo.png","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 16px;font-size:20px;color:#1e293b;\">🔒 账户密码修改成功\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">\n    你好，\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>，你的账户密码已于刚刚修改成功。\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f8fafc;border-radius:10px;margin:8px 0 4px;\">\n    \u003Ctr>\u003Ctd style=\"padding:14px 18px;font-size:13px;line-height:2;color:#475569;\">\n      账户用户名：\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>\u003Cbr>\n      账户邮箱：\u003Cstrong style=\"color:#1e293b;\">{email}\u003C\u002Fstrong>\u003Cbr>\n      修改时间：\u003Cstrong style=\"color:#1e293b;\">{change_time}\u003C\u002Fstrong>\n    \u003C\u002Ftd>\u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:16px 0 0;font-size:13px;line-height:1.8;color:#64748b;\">\n    如果这是你本人的操作，请忽略本邮件；\u003Cstrong style=\"color:#dc2626;\">如果不是你本人操作，说明账户密码可能已泄露\u003C\u002Fstrong>，\n    请立即使用「忘记密码」功能重置密码，并通过页脚联系邮箱告知站长。\n  \u003C\u002Fp>\n  \n  \u003Cp style=\"text-align:center;margin:28px 0 8px;\">\n    \u003Ca href=\"{site_url}\" style=\"display:inline-block;padding:12px 36px;background:#3b82f6;color:#ffffff;font-size:15px;font-weight:bold;text-decoration:none;border-radius:8px;\">进入{site_name}\u003C\u002Fa>\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】你的账户密码已修改","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 16px;font-size:20px;color:#1e293b;\">注册邮箱验证码\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">欢迎注册 \u003Cstrong>{site_name}\u003C\u002Fstrong>！感谢你的加入，请使用下方验证码完成邮箱验证：\u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"background:#f8fafc;border:1px dashed #cbd5e1;border-radius:10px;padding:22px 0;\">\n        \u003Cspan style=\"font-size:32px;font-weight:bold;letter-spacing:10px;color:#3b82f6;font-family:Consolas,Menlo,monospace;\">{code}\u003C\u002Fspan>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:12px 0 0;font-size:13px;color:#64748b;\">\n    验证码 \u003Cstrong style=\"color:#dc2626;\">{expire} 分钟\u003C\u002Fstrong> 内有效，为保障账户安全，请勿向他人泄露。\n  \u003C\u002Fp>\n  \u003Chr style=\"border:none;border-top:1px solid #e2e8f0;margin:24px 0;\">\n  \n  \u003Cp style=\"margin:0 0 12px;font-size:14px;line-height:1.8;color:#475569;\">\n    这里是 \u003Cstrong style=\"color:#1e293b;\">{site_name}\u003C\u002Fstrong>，{site_description}\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#eff6ff;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">📚\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#1e40af;margin-top:4px;\">精选教程\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">从入门到实战\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#ecfdf5;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🚀\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#065f46;margin-top:4px;\">开源项目\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">精选可部署方案\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"34%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#fff7ed;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🧰\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#9a3412;margin-top:4px;\">在线工具\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">即开即用提效\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:20px 0 0;font-size:12px;line-height:1.8;color:#94a3b8;\">\n    如果这不是你本人的操作，请忽略本邮件，你的账户安全不会受到影响。\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】注册验证码","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 16px;font-size:20px;color:#1e293b;\">找回密码验证码\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">你正在找回账户密码，请使用下方验证码完成重置操作：\u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"background:#f8fafc;border:1px dashed #cbd5e1;border-radius:10px;padding:22px 0;\">\n        \u003Cspan style=\"font-size:32px;font-weight:bold;letter-spacing:10px;color:#3b82f6;font-family:Consolas,Menlo,monospace;\">{code}\u003C\u002Fspan>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:12px 0 0;font-size:13px;color:#64748b;\">\n    验证码 \u003Cstrong style=\"color:#dc2626;\">{expire} 分钟\u003C\u002Fstrong> 内有效，为保障账户安全，请勿向他人泄露。\n  \u003C\u002Fp>\n  \u003Chr style=\"border:none;border-top:1px solid #e2e8f0;margin:24px 0;\">\n  \n  \u003Cp style=\"margin:0 0 12px;font-size:14px;line-height:1.8;color:#475569;\">\n    这里是 \u003Cstrong style=\"color:#1e293b;\">{site_name}\u003C\u002Fstrong>，{site_description}\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#eff6ff;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">📚\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#1e40af;margin-top:4px;\">精选教程\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">从入门到实战\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#ecfdf5;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🚀\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#065f46;margin-top:4px;\">开源项目\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">精选可部署方案\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"34%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#fff7ed;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🧰\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#9a3412;margin-top:4px;\">在线工具\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">即开即用提效\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:20px 0 0;font-size:12px;line-height:1.8;color:#94a3b8;\">\n    如果这不是你本人的操作，请忽略本邮件，你的账户安全不会受到影响。\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】找回密码验证码","\u003C!DOCTYPE html>\n\u003Chtml lang=\"zh-CN\">\n\u003Chead>\u003Cmeta charset=\"UTF-8\">\u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\u003C\u002Fhead>\n\u003Cbody style=\"margin:0;padding:24px 0;background:#f1f5f9;font-family:'Microsoft YaHei','PingFang SC',Helvetica,Arial,sans-serif;\">\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f1f5f9;\">\n    \u003Ctr>\n      \u003Ctd align=\"center\" style=\"padding:0 16px;\">\n        \u003Ctable role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;width:100%;\">\n          \u003C!-- 品牌头部 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#3b82f6;border-radius:12px 12px 0 0;padding:20px 28px;\">\n              \u003Cspan style=\"font-size:18px;font-weight:bold;color:#ffffff;\">\u003Ca href=\"{site_url}\" style=\"color:#ffffff;text-decoration:none;\">{site_name}\u003C\u002Fa>\u003C\u002Fspan>\n              \u003Cspan style=\"float:right;font-size:12px;color:#dbeafe;line-height:26px;\">{site_description}\u003C\u002Fspan>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 正文卡片 -->\n          \u003Ctr>\n            \u003Ctd style=\"background:#ffffff;padding:32px 28px;border-radius:0 0 12px 12px;box-shadow:0 2px 8px rgba(15,23,42,0.06);\">\n              \n  \u003Ch2 style=\"margin:0 0 4px;font-size:20px;color:#1e293b;\">🎉 欢迎加入 {site_name}！\u003Cspan style=\"display:inline-block;margin-left:8px;padding:2px 8px;background:#dcfce7;color:#15803d;font-size:12px;border-radius:10px;vertical-align:middle;\">邮箱已验证\u003C\u002Fspan>\u003C\u002Fh2>\n  \u003Cp style=\"margin:0 0 16px;font-size:14px;line-height:1.8;color:#475569;\">\n    你好，\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>，你的账户已注册成功。\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f8fafc;border-radius:10px;margin:8px 0 4px;\">\n    \u003Ctr>\u003Ctd style=\"padding:14px 18px;font-size:13px;line-height:2;color:#475569;\">\n      账户用户名：\u003Cstrong style=\"color:#1e293b;\">{username}\u003C\u002Fstrong>\u003Cbr>\n      注册邮箱：\u003Cstrong style=\"color:#1e293b;\">{email}\u003C\u002Fstrong>\u003Cbr>\n      注册奖励：\u003Cstrong style=\"color:#dc2626;\">+{register_points} 积分\u003C\u002Fstrong>已发放\n    \u003C\u002Ftd>\u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Chr style=\"border:none;border-top:1px solid #e2e8f0;margin:24px 0;\">\n  \n  \u003Cp style=\"margin:0 0 12px;font-size:14px;line-height:1.8;color:#475569;\">\n    这里是 \u003Cstrong style=\"color:#1e293b;\">{site_name}\u003C\u002Fstrong>，{site_description}\n  \u003C\u002Fp>\n  \u003Ctable role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:8px 0 4px;\">\n    \u003Ctr>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#eff6ff;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">📚\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#1e40af;margin-top:4px;\">精选教程\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">从入门到实战\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"33%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#ecfdf5;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🚀\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#065f46;margin-top:4px;\">开源项目\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">精选可部署方案\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n      \u003Ctd width=\"34%\" valign=\"top\" style=\"padding:6px;\">\n        \u003Cdiv style=\"background:#fff7ed;border-radius:8px;padding:14px 10px;text-align:center;\">\n          \u003Cdiv style=\"font-size:15px;\">🧰\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:13px;font-weight:bold;color:#9a3412;margin-top:4px;\">在线工具\u003C\u002Fdiv>\n          \u003Cdiv style=\"font-size:12px;color:#64748b;margin-top:2px;\">即开即用提效\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n  \u003Cp style=\"margin:16px 0 0;font-size:14px;line-height:1.8;color:#475569;\">登录后你可以：\u003C\u002Fp>\n  \u003Cul style=\"margin:8px 0 0;padding-left:22px;font-size:14px;line-height:2;color:#475569;\">\n    \u003Cli>浏览、收藏优质内容与实用工具\u003C\u002Fli>\n    \u003Cli>投稿教程与项目，审核通过后获得积分奖励\u003C\u002Fli>\n    \u003Cli>参与评论、打分，与其他用户交流\u003C\u002Fli>\n    \u003Cli>通过签到、投稿、互动持续累积积分与等级\u003C\u002Fli>\n  \u003C\u002Ful>\n  \n  \u003Cp style=\"text-align:center;margin:28px 0 8px;\">\n    \u003Ca href=\"{site_url}\" style=\"display:inline-block;padding:12px 36px;background:#3b82f6;color:#ffffff;font-size:15px;font-weight:bold;text-decoration:none;border-radius:8px;\">进入{site_name}\u003C\u002Fa>\n  \u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003C!-- 页脚 -->\n          \u003Ctr>\n            \u003Ctd align=\"center\" style=\"padding:20px 16px 0;\">\n              \n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">联系邮箱：\u003Ca href=\"mailto:{contact_email}\" style=\"color:#64748b;text-decoration:none;\">{contact_email}\u003C\u002Fa>\u003C\u002Fp>\n              \u003Cp style=\"margin:6px 0 0;font-size:12px;color:#94a3b8;\">此邮件由系统自动发送，请勿直接回复 · © {year} {site_name}\u003C\u002Fp>\n            \u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftable>\n      \u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftable>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>","【{site_name}】欢迎加入{site_name}，账户注册成功","7111479@qq.com","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790627623420492239.jpg","全栈开发者，专注 AI 应用与效率工具","武哥","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790629453503799753.png","热门爆款","精选项目","精选专题","精选工具","AI导航工具站","精选优质 AI 教程、AI 工具与开源项目，助力开发者快速上手人工智能","AI导航工具站 - AI 教程 · AI 项目 · AI 工具","%s - AI导航工具站","\u002Fimages\u002Flogo\u002Ffavicon.ico","https:\u002F\u002Fwuge.fun","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790628026196296604.png",{"items":49,"pagination":96},[50],{"id":51,"title":52,"slug":53,"summary":54,"content":55,"coverImage":56,"categoryId":57,"authorId":58,"viewCount":59,"likeCount":59,"commentCount":59,"isTop":59,"isRecommend":59,"status":58,"rejectReason":5,"publishedAt":60,"createdAt":61,"updatedAt":62,"category":63,"author":67,"tags":75},16,"Python 异常处理最佳实践：别再只会 try-except 了","exception","except Exception 一把梭是最常见的错误姿势。本文讲清异常体系、精准捕获、自定义异常、日志记录和重试机制，让你的程序崩溃得体面。","## 为什么「裸 except」是灾难\n\n先看新手最常写的代码：\n\n```python\ntry:\n    data = json.loads(resp.text)\n    save_to_db(data)\nexcept Exception:\n    pass  # 出错了？吞掉，假装没事\n```\n\n这段代码的问题是：**任何错误都被静默吞掉**——JSON 解析失败、数据库连接断开、磁盘写满、甚至代码里的拼写错误，全都悄无声息。出问题时你没有任何线索，只能对着「数据怎么没存进去」发呆两小时。\n\n异常处理的核心原则只有一条：\n\n> **只捕获你能处理的异常，并且处理时必须留下痕迹。**\n\n## Python 异常体系速览\n\n异常是有继承层次的，常用的几个：\n\n```text\nBaseException\n├── KeyboardInterrupt      # Ctrl+C\n├── SystemExit             # sys.exit()\n└── Exception              # 日常说的「异常」都继承它\n    ├── ValueError         # 值不对：int(\"abc\")\n    ├── TypeError          # 类型不对：\"1\" + 1\n    ├── KeyError           # 字典键不存在\n    ├── IndexError         # 列表下标越界\n    ├── FileNotFoundError  # 文件不存在\n    ├── ConnectionError    # 网络连接失败\n    └── TimeoutError       # 超时\n```\n\n了解层次的意义在于：**捕获父类会连带捕获所有子类**。`except OSError` 会同时接住 `FileNotFoundError`、`PermissionError` 等一堆子类。\n\n## 正确姿势一：精准捕获\n\n```python\ntry:\n    with open(\"config.json\", encoding=\"utf-8\") as f:\n        config = json.load(f)\n    port = int(config[\"port\"])\nexcept FileNotFoundError:\n    print(\"配置文件不存在，使用默认配置\")\n    config = {\"port\": 8000}\n    port = 8000\nexcept json.JSONDecodeError as e:\n    print(f\"配置文件格式错误：{e}\")\n    raise  # 处理不了就继续抛，别硬撑\nexcept KeyError:\n    print(\"配置文件缺少 port 字段\")\n    raise\n```\n\n每个 `except` 只处理自己能搞定的场景，搞不定的用 `raise` 原样抛出，让上层或顶层去处理。\n\n## 正确姿势二：try 块越小越好\n\n```python\n# 差：整个流程都包进去，出错时根本不知道是哪一步\ntry:\n    data = download()\n    cleaned = clean(data)\n    save(cleaned)\n    notify()\nexcept Exception as e:\n    print(e)\n\n# 好：每个步骤单独处理，错误定位精确到环节\ndata = download()  # 下载失败应该直接崩溃报错，不用包\ntry:\n    cleaned = clean(data)\nexcept ValueError as e:\n    print(f\"数据清洗失败：{e}\")\n    return\nsave(cleaned)\n```\n\n`try` 块里只放**真正可能抛出你所捕获异常的那几行**。\n\n## 正确姿势三：善用 else 和 finally\n\n完整的异常处理有四个块：\n\n```python\ntry:\n    f = open(\"data.txt\", encoding=\"utf-8\")\nexcept FileNotFoundError:\n    print(\"文件不存在\")\nelse:\n    # 没有异常时执行——把成功后的逻辑放这里，职责更清晰\n    content = f.read()\n    f.close()\nfinally:\n    # 无论是否异常都执行——释放资源的专用位置\n    print(\"清理工作\")\n```\n\n`finally` 的典型用途：关文件、关数据库连接、释放锁。（不过现代 Python 更推荐 `with` 上下文管理器，它内部就是用 finally 实现的。）\n\n## 正确姿势四：自定义异常\n\n业务逻辑的错误，不要只会 `raise Exception(\"xxx\")`，定义自己的异常类型：\n\n```python\nclass BusinessError(Exception):\n    \"\"\"业务异常基类\"\"\"\n    pass\n\nclass InsufficientBalanceError(BusinessError):\n    \"\"\"余额不足\"\"\"\n    def __init__(self, balance: float, amount: float):\n        super().__init__(f\"余额不足：当前 {balance} 元，需支付 {amount} 元\")\n        self.balance = balance\n        self.amount = amount\n\ndef withdraw(balance: float, amount: float) -> float:\n    if amount > balance:\n        raise InsufficientBalanceError(balance, amount)\n    return balance - amount\n\n# 调用方可以精准处理\ntry:\n    withdraw(100, 200)\nexcept InsufficientBalanceError as e:\n    print(f\"支付失败：{e}\")\n    # e.balance 和 e.amount 还能拿出来做后续处理\n```\n\n好处：调用方能区分「业务错误」（余额不足，提示用户）和「系统错误」（数据库挂了，报警给运维）。\n\n## 正确姿势五：记录日志而不是 print\n\n程序上服务器后，`print` 基本等于没写。标准做法：\n\n```python\nimport logging\n\nlogging.basicConfig(\n    level=logging.INFO,\n    format=\"%(asctime)s [%(levelname)s] %(name)s: %(message)s\",\n    handlers=[\n        logging.FileHandler(\"app.log\", encoding=\"utf-8\"),  # 写文件\n        logging.StreamHandler(),                            # 同时输出到控制台\n    ],\n)\nlogger = logging.getLogger(__name__)\n\ntry:\n    result = process(data)\nexcept ValueError as e:\n    logger.warning(f\"数据格式问题：{e}\")\nexcept Exception:\n    # 意料外的异常，用 exception 方法记录完整堆栈\n    logger.exception(\"处理数据时发生未知错误\")\n    raise\n```\n\n**`logger.exception()` 是关键**——它会把完整的错误堆栈（哪一行、调用链）都记进日志，比 `logger.error(str(e))` 信息量多十倍。\n\n## 正确姿势六：失败重试\n\n网络请求、数据库连接这类「可能暂时性失败」的操作，加重试：\n\n```python\nimport time\nimport requests\n\ndef fetch_with_retry(url: str, times: int = 3, delay: float = 1.0):\n    \"\"\"带重试的请求：指数退避\"\"\"\n    for attempt in range(1, times + 1):\n        try:\n            resp = requests.get(url, timeout=10)\n            resp.raise_for_status()\n            return resp\n        except requests.RequestException as e:\n            logger.warning(f\"第 {attempt}\u002F{times} 次请求失败：{e}\")\n            if attempt == times:\n                raise  # 重试耗尽，抛出最后一次异常\n            time.sleep(delay * attempt)  # 每次等更久：1s、2s、3s\n```\n\n**哪些错误不该重试**：参数错误（400）、权限不足（403）、资源不存在（404）——这些是确定性错误，重试一万次也没用，直接抛。\n\n## 一张决策表\n\n遇到异常时问自己三个问题：\n\n| 问题 | 答案 | 做法 |\n|------|------|------|\n| 这个错误我能处理吗？ | 能（如文件不存在→用默认值） | except 住，处理，继续 |\n| | 不能 | 不捕获或 raise 抛给上层 |\n| 是暂时性故障吗？ | 是（网络抖动） | 重试 + 间隔 |\n| | 否（参数错误） | 立即失败 |\n| 用户需要知道吗？ | 需要 | 转成友好的中文提示 |\n| | 不需要 | 记日志即可 |\n\n## 写在最后\n\n异常处理的本质不是「防止程序崩溃」，而是**让程序崩溃时留下足够的信息，并且在能恢复的地方优雅恢复**。记住三条铁律：精准捕获、绝不静默、日志留痕。做到这三点，半夜被报警叫醒的次数会少很多。\n","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790636138571123376.png",8,1,0,"2026-09-29T06:56:36.117024762+08:00","2026-09-29T06:55:38.571251765+08:00","2026-09-29T06:56:36.117090124+08:00",{"id":57,"name":64,"slug":65,"description":64,"icon":5,"sortOrder":59,"postCount":59,"parentId":59,"createdAt":66,"updatedAt":66},"Python专题","Python","2026-09-29T06:55:05.938571812+08:00",{"id":58,"username":68,"email":32,"phone":5,"nickname":69,"avatarUrl":70,"bio":5,"role":58,"status":58,"points":59,"lastLoginAt":71,"loginCount":72,"createdAt":73,"updatedAt":74},"wuge","站长","\u002Fstatic\u002Fuploads\u002Favatars\u002F2026\u002F09\u002F29\u002F1790630804049538805.jpg","2026-09-29T05:22:12.192245111+08:00",3,"2026-09-29T04:25:29.170055083+08:00","2026-09-29T05:26:46.960829427+08:00",[76,81,86,91],{"id":77,"name":65,"slug":78,"color":79,"postCount":59,"createdAt":80},6,"python","#e2e8f0","2026-09-29T04:25:30.347030306+08:00",{"id":82,"name":83,"slug":84,"color":79,"postCount":59,"createdAt":85},136,"异常处理","yi-chang-chu-li","2026-09-29T06:55:38.549655932+08:00",{"id":87,"name":88,"slug":89,"color":79,"postCount":59,"createdAt":90},137,"日志","ri-zhi","2026-09-29T06:55:38.556461509+08:00",{"id":92,"name":93,"slug":94,"color":79,"postCount":59,"createdAt":95},138,"最佳实践","zui-jia-shi-jian","2026-09-29T06:55:38.563680858+08:00",{"page":58,"pageSize":97,"total":58,"totalPages":58},12,[99,106],{"id":100,"name":101,"url":102,"logo":103,"description":101,"sortOrder":59,"status":58,"createdAt":104,"updatedAt":105},2,"哔哩哔哩","https:\u002F\u002Fwww.bilibili.com\u002F","\\images\\social\\bilibili.png","0001-01-01T00:00:00Z","2026-09-29T04:44:41.867019475+08:00",{"id":58,"name":107,"url":108,"logo":109,"description":107,"sortOrder":59,"status":58,"createdAt":110,"updatedAt":110},"GitHub","https:\u002F\u002Fgithub.com","\\images\\social\\github.png","2026-09-29T04:32:39.65740234+08:00",{"items":112,"pagination":113,"tag":114},[],{"page":58,"pageSize":97,"total":59,"totalPages":58},{"id":87,"name":88,"slug":89,"color":79,"postCount":59,"createdAt":90},[116,121,126,131,136,141,146,151,156,161,166,171,176,181,186,191,195,200,205,210,215,220,225,230,235,240,244,249,254,259],{"id":117,"name":118,"slug":119,"color":79,"postCount":59,"createdAt":120},150,"AI","ai","2026-09-29T06:55:38.743861502+08:00",{"id":122,"name":123,"slug":124,"color":79,"postCount":59,"createdAt":125},53,"AI 绘画","ai-hui-hua","2026-09-29T04:25:30.70107663+08:00",{"id":127,"name":128,"slug":129,"color":79,"postCount":59,"createdAt":130},94,"AIGC","aigc","2026-09-29T06:46:13.817043541+08:00",{"id":132,"name":133,"slug":134,"color":79,"postCount":59,"createdAt":135},81,"AI入门","ai-ru-men","2026-09-29T06:46:13.646321088+08:00",{"id":137,"name":138,"slug":139,"color":79,"postCount":59,"createdAt":140},113,"AI写作","ai-xie-zuo","2026-09-29T06:46:14.098797917+08:00",{"id":142,"name":143,"slug":144,"color":79,"postCount":59,"createdAt":145},95,"AI工具","ai-gong-ju","2026-09-29T06:46:13.849105815+08:00",{"id":147,"name":148,"slug":149,"color":79,"postCount":59,"createdAt":150},87,"AI技巧","ai-ji-qiao","2026-09-29T06:46:13.717351439+08:00",{"id":152,"name":153,"slug":154,"color":79,"postCount":59,"createdAt":155},92,"AI绘画","ai-hui-hua-2","2026-09-29T06:46:13.800506851+08:00",{"id":157,"name":158,"slug":159,"color":79,"postCount":59,"createdAt":160},88,"AI编程","ai-bian-cheng","2026-09-29T06:46:13.748934007+08:00",{"id":162,"name":163,"slug":164,"color":79,"postCount":59,"createdAt":165},104,"API","api","2026-09-29T06:46:13.964167454+08:00",{"id":167,"name":168,"slug":169,"color":79,"postCount":59,"createdAt":170},24,"Agent","agent","2026-09-29T04:25:30.481917452+08:00",{"id":172,"name":173,"slug":174,"color":79,"postCount":59,"createdAt":175},15,"Apache-2.0","apache-2-0","2026-09-29T04:25:30.413130076+08:00",{"id":177,"name":178,"slug":179,"color":79,"postCount":59,"createdAt":180},124,"BeautifulSoup","beautifulsoup","2026-09-29T06:55:38.372320794+08:00",{"id":182,"name":183,"slug":184,"color":79,"postCount":59,"createdAt":185},71,"C++","c","2026-09-29T04:25:30.832723566+08:00",{"id":187,"name":188,"slug":189,"color":79,"postCount":59,"createdAt":190},9,"C\u002FC++","c-c","2026-09-29T04:25:30.367438818+08:00",{"id":57,"name":192,"slug":193,"color":79,"postCount":59,"createdAt":194},"CPU 推理","cpu-tui-li","2026-09-29T04:25:30.360161464+08:00",{"id":196,"name":197,"slug":198,"color":79,"postCount":59,"createdAt":199},82,"ChatGPT","chatgpt","2026-09-29T06:46:13.65246271+08:00",{"id":201,"name":202,"slug":203,"color":79,"postCount":59,"createdAt":204},43,"ChatGPT 界面","chatgpt-jie-mian","2026-09-29T04:25:30.631791206+08:00",{"id":206,"name":207,"slug":208,"color":79,"postCount":59,"createdAt":209},109,"Coze","coze","2026-09-29T06:46:14.04772698+08:00",{"id":211,"name":212,"slug":213,"color":79,"postCount":59,"createdAt":214},89,"DeepSeek","deepseek","2026-09-29T06:46:13.756746391+08:00",{"id":216,"name":217,"slug":218,"color":79,"postCount":59,"createdAt":219},103,"Embedding","embedding","2026-09-29T06:46:13.931530378+08:00",{"id":221,"name":222,"slug":223,"color":79,"postCount":59,"createdAt":224},139,"Excel","excel","2026-09-29T06:55:38.596869557+08:00",{"id":226,"name":227,"slug":228,"color":79,"postCount":59,"createdAt":229},132,"FastAPI","fastapi","2026-09-29T06:55:38.496902061+08:00",{"id":231,"name":232,"slug":233,"color":79,"postCount":59,"createdAt":234},107,"Fine-tuning","fine-tuning","2026-09-29T06:46:14.010861283+08:00",{"id":236,"name":237,"slug":238,"color":79,"postCount":59,"createdAt":239},97,"Gamma","gamma","2026-09-29T06:46:13.863615311+08:00",{"id":72,"name":241,"slug":242,"color":79,"postCount":59,"createdAt":243},"Go","go","2026-09-29T04:25:30.324360969+08:00",{"id":245,"name":246,"slug":247,"color":79,"postCount":59,"createdAt":248},98,"Kimi","kimi","2026-09-29T06:46:13.871065157+08:00",{"id":250,"name":251,"slug":252,"color":79,"postCount":59,"createdAt":253},7,"LLM","llm","2026-09-29T04:25:30.353458642+08:00",{"id":255,"name":256,"slug":257,"color":79,"postCount":59,"createdAt":258},31,"LLMOps","llmops","2026-09-29T04:25:30.534990482+08:00",{"id":260,"name":261,"slug":262,"color":79,"postCount":59,"createdAt":263},101,"LangChain","langchain","2026-09-29T06:46:13.916898801+08:00",[265],{"id":58,"userId":266,"donorName":35,"amount":267,"message":268,"paymentMethod":269,"isAnonymous":59,"status":58,"createdAt":270},null,128,"加油","wechat","2026-09-29T04:45:44+08:00",{"materials":272},[],{"materials":274},[],{"materials":276},[]]