[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-settings":3,"tag-projects-web-kai-fa":48,"tag-posts-web-kai-fa":60,"footer-friends":106,"sidebar-tags":119,"sidebar-donations":263,"ad-sidebar_top":270,"ad-sidebar_mid":272,"ad-sidebar_bottom":274},{"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":50,"tag":54},[],{"page":51,"pageSize":52,"total":53,"totalPages":51},1,12,0,{"id":55,"name":56,"slug":57,"color":58,"postCount":53,"createdAt":59},133,"Web开发","web-kai-fa","#e2e8f0","2026-09-29T06:55:38.503802445+08:00",{"items":61,"pagination":105},[62],{"id":63,"title":64,"slug":65,"summary":66,"content":67,"coverImage":68,"categoryId":69,"authorId":51,"viewCount":53,"likeCount":53,"commentCount":53,"isTop":53,"isRecommend":53,"status":51,"rejectReason":5,"publishedAt":70,"createdAt":71,"updatedAt":72,"category":73,"author":77,"tags":85},15,"FastAPI 快速上手：30 分钟写一个可部署的 REST API","fastapi","Python 写接口最快的框架。从第一个路由到参数校验、自动文档、数据库连接，再到生产部署，一篇讲完整条链路。","## 为什么选 FastAPI\n\nPython Web 框架里，Flask 简单但太原始，Django 功能全但太重。FastAPI 是新一代的选择：\n\n- **快**：性能接近 Node.js 和 Go（基于 Starlette + Pydantic）\n- **自动文档**：写完代码自动生成交互式 API 文档，前端看了直呼内行\n- **类型安全**：用 Python 类型注解做参数校验，类型错了直接返回 422\n- **异步原生**：天生支持 async\u002Fawait，IO 密集场景性能碾压\n\n```bash\npip install fastapi uvicorn\n```\n\n## 第一个接口：5 行代码\n\n```python\n# main.py\nfrom fastapi import FastAPI\n\napp = FastAPI(title=\"我的第一个API\")\n\n@app.get(\"\u002F\")\ndef hello():\n    return {\"message\": \"Hello FastAPI\"}\n\n@app.get(\"\u002Fitems\u002F{item_id}\")\ndef get_item(item_id: int):   # 声明 int 类型，自动转换和校验\n    return {\"item_id\": item_id, \"name\": f\"商品{item_id}\"}\n```\n\n启动：\n\n```bash\nuvicorn main:app --reload --port 8000\n```\n\n- `--reload`：改代码自动重启，开发必备\n- `main:app`：指 main.py 文件里的 app 对象\n\n现在访问：\n\n- `http:\u002F\u002F127.0.0.1:8000\u002Fitems\u002F42` → 返回 JSON\n- `http:\u002F\u002F127.0.0.1:8000\u002Fitems\u002Fabc` → 自动返回 422 错误（因为 abc 不是 int）\n- `http:\u002F\u002F127.0.0.1:8000\u002Fdocs` → **自动生成的 Swagger 文档页面**，可以直接在页面上测试接口\n\n## 参数校验：Pydantic 的威力\n\nPOST 请求的数据校验，用 Pydantic 模型声明：\n\n```python\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel, Field\n\napp = FastAPI()\n\nclass ItemCreate(BaseModel):\n    name: str = Field(min_length=1, max_length=50, description=\"商品名\")\n    price: float = Field(gt=0, description=\"价格必须大于0\")\n    stock: int = Field(default=0, ge=0)\n    tags: list[str] = []\n\n@app.post(\"\u002Fitems\")\ndef create_item(item: ItemCreate):\n    return {\"message\": \"创建成功\", \"data\": item}\n```\n\n发请求时：\n\n- 字段缺失\u002F类型错误\u002F不满足约束 → 自动返回详细的 422 错误信息\n- 一切正常 → `item` 是一个类型安全的对象，IDE 有完整提示\n\n**再也不用手写 `if not name: return error` 这类校验代码**。\n\n## 查询参数与路径参数\n\n```python\nfrom typing import Optional\n\n@app.get(\"\u002Fitems\")\ndef list_items(\n    keyword: Optional[str] = None,   # 可选查询参数 ?keyword=xxx\n    page: int = 1,                    # 带默认值\n    size: int = Field(default=20, le=100),  # 限制最大100\n):\n    return {\"keyword\": keyword, \"page\": page, \"size\": size}\n```\n\n## 一个完整的小项目：待办事项 API\n\n把前面的知识串起来，写一个带增删改查的完整 API：\n\n```python\n# todo.py\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel, Field\n\napp = FastAPI(title=\"待办事项API\")\n\n# 用列表模拟数据库（下节换成真实数据库）\ntodos = []\nnext_id = 1\n\nclass TodoCreate(BaseModel):\n    title: str = Field(min_length=1, max_length=100)\n    done: bool = False\n\nclass Todo(TodoCreate):\n    id: int\n\n@app.get(\"\u002Ftodos\", response_model=list[Todo])\ndef list_todos():\n    \"\"\"获取所有待办\"\"\"\n    return todos\n\n@app.post(\"\u002Ftodos\", response_model=Todo, status_code=201)\ndef create_todo(item: TodoCreate):\n    \"\"\"创建待办\"\"\"\n    global next_id\n    todo = Todo(id=next_id, **item.model_dump())\n    next_id += 1\n    todos.append(todo)\n    return todo\n\n@app.get(\"\u002Ftodos\u002F{todo_id}\", response_model=Todo)\ndef get_todo(todo_id: int):\n    \"\"\"获取单个待办\"\"\"\n    for t in todos:\n        if t.id == todo_id:\n            return t\n    raise HTTPException(status_code=404, detail=\"待办不存在\")\n\n@app.put(\"\u002Ftodos\u002F{todo_id}\", response_model=Todo)\ndef update_todo(todo_id: int, item: TodoCreate):\n    \"\"\"更新待办\"\"\"\n    for i, t in enumerate(todos):\n        if t.id == todo_id:\n            todos[i] = Todo(id=todo_id, **item.model_dump())\n            return todos[i]\n    raise HTTPException(status_code=404, detail=\"待办不存在\")\n\n@app.delete(\"\u002Ftodos\u002F{todo_id}\", status_code=204)\ndef delete_todo(todo_id: int):\n    \"\"\"删除待办\"\"\"\n    for i, t in enumerate(todos):\n        if t.id == todo_id:\n            todos.pop(i)\n            return\n    raise HTTPException(status_code=404, detail=\"待办不存在\")\n```\n\n`response_model` 的好处：自动过滤返回值（比如不暴露内部字段）、生成准确的文档、做响应校验。\n\n## 连接真实数据库（以 SQLite + SQLAlchemy 为例）\n\n```bash\npip install sqlalchemy\n```\n\n```python\n# database.py\nfrom sqlalchemy import Column, Integer, String, Boolean, create_engine\nfrom sqlalchemy.orm import declarative_base, sessionmaker\n\nengine = create_engine(\"sqlite:\u002F\u002F\u002F.\u002Ftodos.db\", connect_args={\"check_same_thread\": False})\nSessionLocal = sessionmaker(bind=engine)\nBase = declarative_base()\n\nclass TodoModel(Base):\n    __tablename__ = \"todos\"\n    id = Column(Integer, primary_key=True, index=True)\n    title = Column(String(100), nullable=False)\n    done = Column(Boolean, default=False)\n\nBase.metadata.create_all(engine)  # 自动建表\n```\n\n在 FastAPI 中用依赖注入管理数据库会话：\n\n```python\nfrom fastapi import Depends\nfrom sqlalchemy.orm import Session\n\ndef get_db():\n    \"\"\"每个请求一个会话，结束自动关闭\"\"\"\n    db = SessionLocal()\n    try:\n        yield db\n    finally:\n        db.close()\n\n@app.get(\"\u002Ftodos\")\ndef list_todos(db: Session = Depends(get_db)):\n    return db.query(TodoModel).all()\n\n@app.post(\"\u002Ftodos\", status_code=201)\ndef create_todo(item: TodoCreate, db: Session = Depends(get_db)):\n    todo = TodoModel(**item.model_dump())\n    db.add(todo)\n    db.commit()\n    db.refresh(todo)\n    return todo\n```\n\n## 生产部署\n\n开发用 `--reload`，生产环境这样跑：\n\n```bash\n# 4 个 worker 进程，绑定所有网卡\nuvicorn main:app --host 0.0.0.0 --port 8000 --workers 4\n```\n\n更稳的方案是 `gunicorn` 管理 uvicorn worker（Linux）：\n\n```bash\npip install gunicorn\ngunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000\n```\n\n前面再挂 Nginx 反向代理，搞定域名和 HTTPS，就是标准的生产架构。\n\n## 进阶方向\n\n到这里你已经能写可用的 API 了。下一步按需学习：\n\n- **用户认证**：`fastapi-users` 或手写 JWT（`python-jose`）\n- **跨域 CORS**：前端联调必配 `CORSMiddleware`\n- **后台任务**：`BackgroundTasks` 处理发邮件这类慢操作\n- **限流**：`slowapi` 防止接口被刷\n- **测试**：`fastapi.testclient` 基于 httpx，写接口测试很顺手\n\n## 写在最后\n\nFastAPI 的设计哲学是「别让我重复写样板代码」。类型注解即校验、代码即文档——把这两个特性用足，你的接口开发效率会提升一个量级。建议把待办事项的例子亲手跑通，再把它改造成一个你自己真正需要的小工具。\n","\u002Fstatic\u002Fuploads\u002Fimages\u002F2026\u002F09\u002F29\u002F1790636138525796879.png",8,"2026-09-29T06:56:37.777573439+08:00","2026-09-29T06:55:38.52593956+08:00","2026-09-29T06:56:37.777643867+08:00",{"id":69,"name":74,"slug":75,"description":74,"icon":5,"sortOrder":53,"postCount":53,"parentId":53,"createdAt":76,"updatedAt":76},"Python专题","Python","2026-09-29T06:55:05.938571812+08:00",{"id":51,"username":78,"email":32,"phone":5,"nickname":79,"avatarUrl":80,"bio":5,"role":51,"status":51,"points":53,"lastLoginAt":81,"loginCount":82,"createdAt":83,"updatedAt":84},"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",[86,90,94,95,100],{"id":87,"name":75,"slug":88,"color":58,"postCount":53,"createdAt":89},6,"python","2026-09-29T04:25:30.347030306+08:00",{"id":91,"name":92,"slug":65,"color":58,"postCount":53,"createdAt":93},132,"FastAPI","2026-09-29T06:55:38.496902061+08:00",{"id":55,"name":56,"slug":57,"color":58,"postCount":53,"createdAt":59},{"id":96,"name":97,"slug":98,"color":58,"postCount":53,"createdAt":99},134,"REST API","rest-api","2026-09-29T06:55:38.511505671+08:00",{"id":101,"name":102,"slug":103,"color":58,"postCount":53,"createdAt":104},135,"后端","hou-duan","2026-09-29T06:55:38.519097242+08:00",{"page":51,"pageSize":52,"total":51,"totalPages":51},[107,114],{"id":108,"name":109,"url":110,"logo":111,"description":109,"sortOrder":53,"status":51,"createdAt":112,"updatedAt":113},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":51,"name":115,"url":116,"logo":117,"description":115,"sortOrder":53,"status":51,"createdAt":118,"updatedAt":118},"GitHub","https:\u002F\u002Fgithub.com","\\images\\social\\github.png","2026-09-29T04:32:39.65740234+08:00",[120,125,130,135,140,145,150,155,160,165,170,175,179,184,189,194,198,203,208,213,218,223,228,229,234,239,243,248,253,258],{"id":121,"name":122,"slug":123,"color":58,"postCount":53,"createdAt":124},150,"AI","ai","2026-09-29T06:55:38.743861502+08:00",{"id":126,"name":127,"slug":128,"color":58,"postCount":53,"createdAt":129},53,"AI 绘画","ai-hui-hua","2026-09-29T04:25:30.70107663+08:00",{"id":131,"name":132,"slug":133,"color":58,"postCount":53,"createdAt":134},94,"AIGC","aigc","2026-09-29T06:46:13.817043541+08:00",{"id":136,"name":137,"slug":138,"color":58,"postCount":53,"createdAt":139},81,"AI入门","ai-ru-men","2026-09-29T06:46:13.646321088+08:00",{"id":141,"name":142,"slug":143,"color":58,"postCount":53,"createdAt":144},113,"AI写作","ai-xie-zuo","2026-09-29T06:46:14.098797917+08:00",{"id":146,"name":147,"slug":148,"color":58,"postCount":53,"createdAt":149},95,"AI工具","ai-gong-ju","2026-09-29T06:46:13.849105815+08:00",{"id":151,"name":152,"slug":153,"color":58,"postCount":53,"createdAt":154},87,"AI技巧","ai-ji-qiao","2026-09-29T06:46:13.717351439+08:00",{"id":156,"name":157,"slug":158,"color":58,"postCount":53,"createdAt":159},92,"AI绘画","ai-hui-hua-2","2026-09-29T06:46:13.800506851+08:00",{"id":161,"name":162,"slug":163,"color":58,"postCount":53,"createdAt":164},88,"AI编程","ai-bian-cheng","2026-09-29T06:46:13.748934007+08:00",{"id":166,"name":167,"slug":168,"color":58,"postCount":53,"createdAt":169},104,"API","api","2026-09-29T06:46:13.964167454+08:00",{"id":171,"name":172,"slug":173,"color":58,"postCount":53,"createdAt":174},24,"Agent","agent","2026-09-29T04:25:30.481917452+08:00",{"id":63,"name":176,"slug":177,"color":58,"postCount":53,"createdAt":178},"Apache-2.0","apache-2-0","2026-09-29T04:25:30.413130076+08:00",{"id":180,"name":181,"slug":182,"color":58,"postCount":53,"createdAt":183},124,"BeautifulSoup","beautifulsoup","2026-09-29T06:55:38.372320794+08:00",{"id":185,"name":186,"slug":187,"color":58,"postCount":53,"createdAt":188},71,"C++","c","2026-09-29T04:25:30.832723566+08:00",{"id":190,"name":191,"slug":192,"color":58,"postCount":53,"createdAt":193},9,"C\u002FC++","c-c","2026-09-29T04:25:30.367438818+08:00",{"id":69,"name":195,"slug":196,"color":58,"postCount":53,"createdAt":197},"CPU 推理","cpu-tui-li","2026-09-29T04:25:30.360161464+08:00",{"id":199,"name":200,"slug":201,"color":58,"postCount":53,"createdAt":202},82,"ChatGPT","chatgpt","2026-09-29T06:46:13.65246271+08:00",{"id":204,"name":205,"slug":206,"color":58,"postCount":53,"createdAt":207},43,"ChatGPT 界面","chatgpt-jie-mian","2026-09-29T04:25:30.631791206+08:00",{"id":209,"name":210,"slug":211,"color":58,"postCount":53,"createdAt":212},109,"Coze","coze","2026-09-29T06:46:14.04772698+08:00",{"id":214,"name":215,"slug":216,"color":58,"postCount":53,"createdAt":217},89,"DeepSeek","deepseek","2026-09-29T06:46:13.756746391+08:00",{"id":219,"name":220,"slug":221,"color":58,"postCount":53,"createdAt":222},103,"Embedding","embedding","2026-09-29T06:46:13.931530378+08:00",{"id":224,"name":225,"slug":226,"color":58,"postCount":53,"createdAt":227},139,"Excel","excel","2026-09-29T06:55:38.596869557+08:00",{"id":91,"name":92,"slug":65,"color":58,"postCount":53,"createdAt":93},{"id":230,"name":231,"slug":232,"color":58,"postCount":53,"createdAt":233},107,"Fine-tuning","fine-tuning","2026-09-29T06:46:14.010861283+08:00",{"id":235,"name":236,"slug":237,"color":58,"postCount":53,"createdAt":238},97,"Gamma","gamma","2026-09-29T06:46:13.863615311+08:00",{"id":82,"name":240,"slug":241,"color":58,"postCount":53,"createdAt":242},"Go","go","2026-09-29T04:25:30.324360969+08:00",{"id":244,"name":245,"slug":246,"color":58,"postCount":53,"createdAt":247},98,"Kimi","kimi","2026-09-29T06:46:13.871065157+08:00",{"id":249,"name":250,"slug":251,"color":58,"postCount":53,"createdAt":252},7,"LLM","llm","2026-09-29T04:25:30.353458642+08:00",{"id":254,"name":255,"slug":256,"color":58,"postCount":53,"createdAt":257},31,"LLMOps","llmops","2026-09-29T04:25:30.534990482+08:00",{"id":259,"name":260,"slug":261,"color":58,"postCount":53,"createdAt":262},101,"LangChain","langchain","2026-09-29T06:46:13.916898801+08:00",[264],{"id":51,"userId":265,"donorName":35,"amount":266,"message":267,"paymentMethod":268,"isAnonymous":53,"status":51,"createdAt":269},null,128,"加油","wechat","2026-09-29T04:45:44+08:00",{"materials":271},[],{"materials":273},[],{"materials":275},[]]