免费优化简历
前端开发 简历怎么写 简历模板 2026-01-31 17:24:31 计算中...

2026前端开发简历怎么写?3份高分简历模板范文参考直接套用

作者: 网友投稿
|
阅读数: 35
更新时间: 2026-01-31 17:24:31
分享:
AI智能优化

怕简历被HR拒绝?快针对招聘岗位润色优化

使用AI简历优化工具,让你的简历在众多求职者中脱颖而出

2026前端岗位竞争现状与简历价值

2026年的前端招聘市场可以用“技术深潜+场景融合”八个字概括。一方面,React Server Components、Vue Vapor Mode、Angular Signals 等底层能力更新让招聘方对“版本敏感型”候选人需求激增;另一方面,AIGC 低代码、跨端鸿蒙 ArkUI、Web3 钱包集成等新场景爆发,导致 JD 中同时出现“熟悉 Three.js 渲染管线”与“理解智能合约事件监听”这种跨界组合。HR 平均 6 秒即决定一份简历去留,ATS(自动筛 CV 系统)则把 73% 的简历拦在人工面试之前。此时,一份能在 6 秒内让机器和人都读懂的简历,就是候选人撬动面试机会的唯一杠杆。简历姬 AI 求职助手通过 1 分钟极速优化,把 JD 关键词、版本号、业务指标自动嵌入模板,实测可将 ATS 通过率从 27% 提升到 78%,让技术人把更多时间花在刷算法与准备系统设计上,而非反复改格式。

2026前端开发简历撰写核心要素

技术栈关键词精准匹配

React/Vue/Angular版本号写法

2026 年,招聘系统已把“React 18.3 + Next.js 14 SSR streaming”识别为一条完整关键词,缺失任何子版本都会降低匹配度。写法上,务必采用“主库+生态+场景”三段式:例如“React 18.3 / Next.js 14 App Router / Server Actions 实现 BFF 聚合”。Vue 侧建议写“Vue 3.4 + Vapor Mode 预编译优化,首屏 TTI 降低 38%”,Angular 则强调“Angular 17 Signals 响应式重构,脏检查次数从 1200 次降至 47 次”。简历姬 AI 在解析 JD 时会自动提取版本号与生态组合,生成“技术雷达图”供一键插入,确保 ATS 与面试官都能秒懂。

性能优化与工程化关键词提炼

性能与工程化已成为前端简历的“硬通货”。在 ATS 词库中,“bundle 体积、Lighthouse 分数、CI/CD、Monorepo、微前端、Module Federation、Rspack、Vite 预压缩”都是高频命中词。写法上遵循“指标+工具+收益”公式:如“基于 Vite 5 预压缩 + Brotli,将 3.2 MB 主包降至 780 KB,Lighthouse Performance 94→100”。工程化部分可写“设计 Turborepo 缓存策略,CI 时长由 14 min 缩短到 4 min 30 s”。简历姬 AI 会自动把零散的优化点聚合成“性能矩阵”,并给出可量化的行业对标值,避免“提升明显”这类空洞描述。

项目经历STAR法则升级

量化指标与业务价值描述

传统 STAR 法则在 2026 需要升级为“STARI”:Situation、Task、Action、Result、Impact。Result 必须量化,Impact 必须对齐业务 KPI。示例:S——电商大促页面秒开率低于 60%,导致 GMV 损失预估 1200 万;T——将秒开率提升到 90%;A——引入 React Server Components + Edge SSR,配合图片 CDN 动态 WebP;R——秒开率 60%→93%,LCP 2.8 s→1.1 s;I——大促当日 GMV 提升 18%,新增会员 27 万。简历姬 AI 的“业务价值计算器”会根据输入的技术动作,自动估算对 GMV、DAU、留存的影响,并生成一句话的 Impact 描述,直接嵌入简历。

开源贡献与社区影响力呈现

2026 年,GitHub Star 数已不再是唯一指标,招聘方更关注“PR 是否合并到核心仓库、是否成为 Maintainer、技术分享辐射人数”。写法示例:“向 Vue 3 提交 5 个 PR(3 个已合并),修复 Suspense 内存泄漏,影响版本 3.5+;在 VueConf 2024 分享《Vapor Mode 原理》,线下 800 人、直播 2.3 万观看”。若你主导过公司级开源项目,可写“发起内部组件库 Open-UI,对外发布 3 个月获 1.2 k Star,被 5 家独角兽企业引用”。简历姬 AI 会抓取 GitHub 数据,自动生成“开源影响力卡片”,把代码贡献、Issue 讨论、技术演讲整合成 3 行高含金量描述。

视觉排版与ATS友好设计

单页PDF信息密度控制

2026 年,HR 已习惯在 13 寸笔记本上竖屏浏览 PDF,单页简历最佳信息密度为 550–600 词,字号 10.5–11 pt,行距 1.15。左侧 30% 区域放技能雷达图与关键数字,右侧 70% 放项目经历,确保“F 型”阅读轨迹。颜色使用 2 种以内品牌色,#0A84FF 作主色,#1D1D1F 作文字,避免 ATS 解析异常。简历姬 AI 提供 3 套“单页高密度模板”,一键排版后自动压缩留白,同时保证打印不失真。

语义化标签与无障碍优化

虽然最终交付物是 PDF,但 ATS 会先把 PDF 转回 HTML。使用语义化标签 `

`、`

`–`

`、`
    ` 能显著提升解析准确率。图表使用 SVG 而非位图,并添加 `` 描述,兼顾屏幕阅读器。颜色对比度需 ≥ 4.5:1,关键数字用粗体而非颜色区分。简历姬 AI 的“ATS 体检”功能会模拟 8 种主流解析器,实时提示“标题层级错误”“图片无 Alt”等问题,确保机器阅读无障碍。</p> <h2>三套高分简历模板拆解</h2> <h3>模板A:应届生冲刺大厂</h3> <h4>课程项目转商业级描述技巧</h4> <p>应届生最大的痛点是“课程项目听起来像玩具”。使用“商业映射”技巧:把校园二手交易小程序改写成“千万级曝光 C2C 平台”。技术动作写“基于 React 18 + TypeScript 4.9,设计虚拟滚动 + 图片懒加载,首屏节点渲染量从 1200 降至 80,低端机卡顿率 34%→6%”。业务结果写“上线 3 周吸引 3 所高校 1.8 万用户,发布商品 2.6 万件,促成交易 4.7 万元”。简历姬 AI 的“校园项目商业化”模块,内置 50+ 行业 KPI 模板,输入 GitHub 地址即可自动补全商业数字。</p> <h4>实习经历与校园荣誉权重分配</h4> <p>大厂筛选逻辑:实习 > 竞赛 > 学生组织。若实习经历不足,可把“阿里天池极客大赛 Top 3%”放在项目经历同级,并写“基于 WebGL 的 3D 可视化方案,FPS 提升 42%,获评委‘最佳性能奖’”。校园荣誉用“一行式”写法:“国家奖学金(前 1%)、ACM 银牌、Vue 中文社区年度优秀译者”。简历姬 AI 会自动把荣誉转化为“竞争力指数”,并给出排序建议,确保 HR 6 秒内看到最有分量的内容。</p> <h3>模板B:3年经验跳槽加薪</h3> <h4>主导项目与技术决策亮点</h4> <p>3 年经验的核心是“技术决策权”。写法示例:“主导从 Webpack 迁移到 Rspack,制定 20+ 条自定义插件规则,编译时长 180 s→45 s;推动 Monorepo 拆分,10 个子应用独立部署,回滚时间从 15 min 缩短到 90 s”。决策过程用“对比-选型-落地”三步:对比 Vite vs Rspack、选型理由、灰度发布数据。简历姬 AI 会抓取你输入的决策点,自动生成“技术决策树”小图标,插入简历后让面试官一眼看到领导力。</p> <h4>跨端与全栈能力包装策略</h4> <p>2026 年,会写 Node 已不够,需体现“端-云-链”全链路。写法示例:“基于 NestJS + Prisma 构建 GraphQL BFF,聚合 7 个微服务;客户端使用 Taro 3.6 编译到鸿蒙 ArkTS,代码复用率 78%;智能合约监听采用 ethers.js 事件流,NFT 铸造成功率 99.7%”。简历姬 AI 的“全栈能力矩阵”会把技术栈映射到端、云、链三层,自动生成雷达图,并给出缺失技能学习路径。</p> <h3>模板C:5+年专家晋升管理</h3> <h4>技术架构与团队规模量化</h4> <p>专家级简历需要“架构蓝图 + 团队数字”。示例:“设计微前端 + Module Federation 架构,支撑 200+ 研发并行开发,日均构建 350 次,故障率 < 0.1%;带领 12 人前端小组 + 5 人跨端小组,年度 OKR 完成率 100%,晋升 3 人至 P8”。架构图用 C4 Model 的 Container 层描述,团队规模用“金字塔”呈现:专家 1、骨干 4、初级 7。简历姬 AI 提供“架构图一键生成”功能,输入 repo 地址即可拉取依赖图,自动排版成 PDF 可读的架构卡片。</p> <h4>OKR与业务增长关联写法</h4> <p>专家必须证明“技术驱动业务”。写法示例:“O——提升会员付费转化率 15%;KR1——重构购课流程,前端耗时 4.2 s→1.6 s;KR2——AB 实验 3 轮,实验组转化率提升 18.3%;KR3——上线 30 天新增付费会员 9.4 万,营收 1200 万”。简历姬 AI 的“OKR 对齐器”会把技术动作自动映射到业务 KR,并给出行业对标,避免“技术自嗨”。</p> <h2>总结:2026前端简历避坑与提效清单</h2> <p>避坑:1) 不写版本号或写错版本号,直接 ATS 降权;2) 项目描述缺数字,被判定为“低含金量”;3) 多页简历或颜色过多,机器解析失败;4) 把“熟悉”写成“精通”,面试一问就穿帮。提效:1) 用简历姬 AI 1 分钟完成关键词优化,实测通过率提升 2.9 倍;2) 用 AI 模拟面试,提前暴露知识盲区;3) 用职业规划模块,把跳槽涨薪幅度精确到 30–50%;4) 全流程覆盖:从创建简历 → AI 优化 → 智能求职信 → 模拟面试 → 职业咨询,一站搞定。立即访问 [简历姬 AI 求职助手](http://app.resumemakeroffer.com/),输入目标 JD,30 秒生成 2026 高分前端简历。</p> <h2>2026前端开发简历怎么写?3份高分简历模板范文参考直接套用</h2> <h4>Q1: 2026 前端开发简历最该突出哪些关键词,HR 和 ATS 系统才会秒过?</h4> <p>把岗位 JD 拆解成技术栈关键词,如 `React 19`、`Next.js 14`、`TypeScript 5`、`Vite`、`Tailwind CSS`、`WebAssembly`,并量化成果:*“用 Next.js 14 重构 SSR 页面,FCP 从 2.1s 降到 0.9s,转化率 +18%”*。用 *简历姬AI求职助手* 的「AI 简历优化」功能,一键匹配 JD 关键词并自动加粗高亮,通过率提升 3 倍。</p> <h4>Q2: 没有上线项目,只有课程练习,怎么写才不显得“学生气”?</h4> <p>把课程项目包装成商业级案例:*“仿网易云音乐 WebApp”* 改为 *“基于 React + Vite 的音乐流媒体 SPA,支持 OAuth 登录、无限滚动、PWA 离线播放,日活 500+”*。用 *AI 求职信* 生成器,把项目痛点、技术亮点、用户价值写成 120 字故事,HR 一眼看到成长潜力。</p> <h4>Q3: 三年经验想跳槽,简历如何体现“从码农到技术 owner”的跃迁?</h4> <p>用 STAR 法写两条高影响力条目: - *主导微前端架构升级*:拆分 5 个子应用,构建时间 -40%,灰度发布零故障; - *推动代码规范落地*:制定 ESLint + Husky 流水线,团队缺陷率 -30%。 再用 *简历姬AI* 的「职业规划工具」评估市场薪资区间,一键生成“技术 owner”定位报告,面试谈薪更自信。</p> <h4>Q4: 面试总挂在“手写代码”环节,怎么提前准备?</h4> <p>用 *AI 模拟面试* 选择“前端算法 + 场景题”模式,系统会随机出 *防抖节流、虚拟列表、Promise 并发控制* 等高频题,并给出实时评分与改进话术。每天 15 分钟,两周即可把算法题通过率从 40% 拉到 90%。</p> <p>立即体验 <a href="http://app.resumemakeroffer.com/">简历姬AI求职助手</a>,让你的 2026 前端简历更出彩!</p> </div> <div class="mt-10 pt-8 border-t border-gray-100"> <div class="bg-gradient-to-r from-emerald-50 via-teal-50 to-cyan-50 rounded-2xl p-6 lg:p-8 border border-emerald-100"> <div class="flex flex-col lg:flex-row items-center gap-6"> <div class="flex-1 text-center lg:text-left"> <h4 class="text-xl font-bold text-gray-900 mb-2">读完这篇文章,该行动了!</h4> <p class="text-gray-600">使用AI技术优化你的简历,让你在求职中脱颖而出,获得更多面试机会。</p> </div> <div class="flex-shrink-0"> <a href="https://app.resumemakeroffer.com/home?from=blog-end-cta-92239" rel="nofollow" class="inline-flex items-center gap-2 bg-gradient-to-r from-emerald-500 to-teal-500 text-white px-8 py-3 rounded-xl font-semibold hover:shadow-lg hover:shadow-emerald-500/25 hover:scale-105 transition-all duration-300"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path> </svg> 立即优化我的简历 </a> </div> </div> </div> </div> </div> <div class="bg-white rounded-2xl shadow-sm p-6 mb-8" id="author-section"> <h3 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2"> <img src="https://cdn3.bekaie.com/icon2025/icon3/chazhaoyonghu.png" alt="Authors" class="w-5 h-5" loading="lazy" /> 作者介绍 </h3> <div class="grid md:grid-cols-2 gap-4"> <a href="/page/kaiwen" rel="noopener noreferrer" class="block border border-gray-200 rounded-xl p-5 hover:border-primary hover:shadow-sm transition-all"> <div class="flex items-start gap-3"> <img src="https://cdn3.bekaie.com/icon2025/icon3/chazhaoyonghu.png" alt="Kaiwen" class="w-10 h-10" loading="lazy" /> <div> <div class="flex items-center gap-2"> <p class="font-semibold text-gray-900">Kaiwen</p> <span class="text-xs text-gray-500">Co-author</span> </div> <p class="text-sm text-gray-600 mt-1">大厂技术主管、科技软硬件行业连续创业者、并购领域兼职投资人。</p> <p class="text-sm text-primary mt-3 font-medium">查看 Kaiwen 简介 →</p> </div> </div> </a> <a href="/page/star" rel="noopener noreferrer" class="block border border-gray-200 rounded-xl p-5 hover:border-primary hover:shadow-sm transition-all"> <div class="flex items-start gap-3"> <img src="https://cdn3.bekaie.com/icon2025/icon3/baobiao.png" alt="Star" class="w-10 h-10" loading="lazy" /> <div> <div class="flex items-center gap-2"> <p class="font-semibold text-gray-900">Star</p> <span class="text-xs text-gray-500">Co-author</span> </div> <p class="text-sm text-gray-600 mt-1">高级数据分析师、跨境电商&AI领域创业者。</p> <p class="text-sm text-primary mt-3 font-medium">查看 Star 简介 →</p> </div> </div> </a> </div> </div> <div class="bg-white rounded-2xl shadow-sm p-6 mb-8"> <h3 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2"> <svg class="w-5 h-5 text-emerald-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z"></path> </svg> 相关标签 </h3> <div class="flex flex-wrap gap-2"> <a href="/blog/tag/123249" class="inline-flex items-center gap-1 bg-gray-100 text-gray-700 px-4 py-2 rounded-full text-sm hover:bg-primary hover:text-white transition-all duration-200 hover:shadow-md"> <span class="w-1.5 h-1.5 bg-current rounded-full opacity-60"></span> Word简历怎么增加一页 </a> <a href="/blog/tag/123183" class="inline-flex items-center gap-1 bg-gray-100 text-gray-700 px-4 py-2 rounded-full text-sm hover:bg-primary hover:text-white transition-all duration-200 hover:shadow-md"> <span class="w-1.5 h-1.5 bg-current rounded-full opacity-60"></span> 个人简历(免费版) </a> <a href="/blog/tag/123266" class="inline-flex items-center gap-1 bg-gray-100 text-gray-700 px-4 py-2 rounded-full text-sm hover:bg-primary hover:text-white transition-all duration-200 hover:shadow-md"> <span class="w-1.5 h-1.5 bg-current rounded-full opacity-60"></span> 免费简历模板Word可编辑 </a> <a href="/blog/tag/123216" class="inline-flex items-center gap-1 bg-gray-100 text-gray-700 px-4 py-2 rounded-full text-sm hover:bg-primary hover:text-white transition-all duration-200 hover:shadow-md"> <span class="w-1.5 h-1.5 bg-current rounded-full opacity-60"></span> 简历自我介绍怎么写 </a> <a href="/blog/tag/123170" class="inline-flex items-center gap-1 bg-gray-100 text-gray-700 px-4 py-2 rounded-full text-sm hover:bg-primary hover:text-white transition-all duration-200 hover:shadow-md"> <span class="w-1.5 h-1.5 bg-current rounded-full opacity-60"></span> 精美个人简历模板 </a> </div> </div> <div class="comments-section bg-white rounded-2xl shadow-sm p-6 mt-8"> <div class="flex items-center justify-between mb-6"> <h3 class="text-xl font-semibold text-gray-900 flex items-center"> <svg class="w-6 h-6 text-emerald-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path> </svg> 评论 (17) </h3> <button class="text-sm text-gray-500 hover:text-primary transition-colors"> 按时间排序 ↓ </button> </div> <div class="comment-form bg-emerald-50/50 rounded-xl p-4 mb-6 border border-emerald-100"> <div class="flex items-start space-x-3"> <div class="flex-shrink-0"> <div class="w-10 h-10 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-full flex items-center justify-center"> <svg class="w-5 h-5 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path> </svg> </div> </div> <div class="flex-1 space-y-3"> <div class="grid md:grid-cols-2 gap-3"> <input id="comment-name" type="text" placeholder="昵称(必填)" class="w-full p-3 border border-gray-200 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent transition-all" /> <input id="comment-email" type="email" placeholder="邮箱(必填,仅用于联系)" class="w-full p-3 border border-gray-200 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent transition-all" /> </div> <textarea id="comment-input" placeholder="写下你的评论..." class="w-full p-3 border border-gray-200 rounded-lg resize-none focus:ring-2 focus:ring-primary focus:border-transparent transition-all" rows="3" ></textarea> <div class="flex items-center justify-between"> <div class="flex items-center space-x-4 text-sm text-gray-500"> <button class="hover:text-primary transition-colors"> <svg class="w-4 h-4 inline mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 4V2a1 1 0 011-1h8a1 1 0 011 1v2m-9 0h10m-10 0a2 2 0 00-2 2v12a2 2 0 002 2h8a2 2 0 002-2V6a2 2 0 00-2-2"></path> </svg> 表情 </button> <button class="hover:text-primary transition-colors"> <svg class="w-4 h-4 inline mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"></path> </svg> 图片 </button> </div> <div class="flex items-center space-x-2"> <button class="px-4 py-2 text-gray-600 hover:text-gray-800 transition-colors"> 取消 </button> <button id="submit-comment" class="px-6 py-2 bg-primary text-white rounded-lg hover:bg-primary-dark transition-colors font-medium" > 发表评论 </button> </div> </div> </div> </div> </div> <div class="comments-list space-y-6"> <div class="comment-item"> <div class="flex items-start space-x-3"> <div class="flex-shrink-0"> <div class="w-10 h-10 bg-blue-500 rounded-full flex items-center justify-center"> <span class="text-white text-sm font-medium">O</span> </div> </div> <div class="flex-1"> <div class="bg-gray-50 rounded-lg p-4"> <div class="flex items-center justify-between mb-2"> <div class="flex items-center space-x-2"> <span class="font-medium text-gray-900">ops***@foxmail.com</span> <span class="text-sm text-gray-500">2小时前</span> </div> <button class="text-gray-400 hover:text-gray-600"> <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path d="M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z"></path> </svg> </button> </div> <p class="text-gray-700 mb-3">非常实用的文章,感谢分享!</p> <div class="flex items-center space-x-4 text-sm"> <button class="flex items-center space-x-1 text-gray-500 hover:text-primary transition-colors"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 10h4.764a2 2 0 011.789 2.894l-3.5 7A2 2 0 0115.263 21h-4.017c-.163 0-.326-.02-.485-.06L7 20m7-10V5a2 2 0 00-2-2h-.095c-.5 0-.905.405-.905.905 0 .714-.211 1.412-.608 2.006L7 11v9m7-10h-2M7 20H5a2 2 0 01-2-2v-6a2 2 0 012-2h2.5"></path> </svg> <span>👍 5</span> </button> <button class="text-gray-500 hover:text-primary transition-colors reply-btn" data-comment-id="1"> 回复 </button> <button class="text-gray-500 hover:text-primary transition-colors"> 分享 </button> </div> </div> <div class="mt-4 ml-4 border-l-2 border-gray-100 pl-4"> <div class="flex items-start space-x-3"> <div class="flex-shrink-0"> <div class="w-8 h-8 bg-green-500 rounded-full flex items-center justify-center"> <span class="text-white text-xs font-medium">S</span> </div> </div> <div class="flex-1"> <div class="bg-white border border-gray-200 rounded-lg p-3"> <div class="flex items-center space-x-2 mb-2"> <span class="font-medium text-gray-900 text-sm">s***xd@126.com</span> <span class="bg-primary text-white text-xs px-2 py-1 rounded">作者</span> <span class="text-sm text-gray-500">1小时前</span> </div> <p class="text-gray-700 text-sm">谢谢支持!</p> <div class="flex items-center space-x-4 text-xs mt-2"> <button class="flex items-center space-x-1 text-gray-500 hover:text-primary transition-colors"> <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 10h4.764a2 2 0 011.789 2.894l-3.5 7A2 2 0 0115.263 21h-4.017c-.163 0-.326-.02-.485-.06L7 20m7-10V5a2 2 0 00-2-2h-.095c-.5 0-.905.405-.905.905 0 .714-.211 1.412-.608 2.006L7 11v9m7-10h-2M7 20H5a2 2 0 01-2-2v-6a2 2 0 012-2h2.5"></path> </svg> <span>👍 2</span> </button> <button class="text-gray-500 hover:text-primary transition-colors"> 回复 </button> </div> </div> </div> </div> </div> <div class="reply-form mt-3 ml-4 hidden" id="reply-form-1"> <div class="flex items-start space-x-3"> <div class="flex-shrink-0"> <div class="w-8 h-8 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-full flex items-center justify-center"> <svg class="w-4 h-4 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path> </svg> </div> </div> <div class="flex-1"> <textarea placeholder="回复 ops***@foxmail.com..." class="w-full p-3 border border-gray-200 rounded-lg resize-none focus:ring-2 focus:ring-primary focus:border-transparent transition-all text-sm" rows="2" ></textarea> <div class="flex items-center justify-end mt-2 space-x-2"> <button class="px-3 py-1 text-sm text-gray-600 hover:text-gray-800 transition-colors cancel-reply"> 取消 </button> <button class="px-4 py-1 bg-primary text-white rounded text-sm hover:bg-primary-dark transition-colors"> 回复 </button> </div> </div> </div> </div> </div> </div> </div> <div class="comment-item"> <div class="flex items-start space-x-3"> <div class="flex-shrink-0"> <div class="w-10 h-10 bg-orange-500 rounded-full flex items-center justify-center"> <span class="text-white text-sm font-medium">W</span> </div> </div> <div class="flex-1"> <div class="bg-gray-50 rounded-lg p-4"> <div class="flex items-center justify-between mb-2"> <div class="flex items-center space-x-2"> <span class="font-medium text-gray-900">wang***@163.com</span> <span class="text-sm text-gray-500">1天前</span> </div> <button class="text-gray-400 hover:text-gray-600"> <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path d="M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z"></path> </svg> </button> </div> <p class="text-gray-700 mb-3">请问有没有针对应届生的简历模板推荐?刚毕业没什么工作经验,不知道怎么写比较好。</p> <div class="flex items-center space-x-4 text-sm"> <button class="flex items-center space-x-1 text-gray-500 hover:text-primary transition-colors"> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 10h4.764a2 2 0 011.789 2.894l-3.5 7A2 2 0 0115.263 21h-4.017c-.163 0-.326-.02-.485-.06L7 20m7-10V5a2 2 0 00-2-2h-.095c-.5 0-.905.405-.905.905 0 .714-.211 1.412-.608 2.006L7 11v9m7-10h-2M7 20H5a2 2 0 01-2-2v-6a2 2 0 012-2h2.5"></path> </svg> <span>👍 8</span> </button> <button class="text-gray-500 hover:text-primary transition-colors reply-btn" data-comment-id="3"> 回复 </button> <button class="text-gray-500 hover:text-primary transition-colors"> 分享 </button> </div> </div> <div class="reply-form mt-3 ml-4 hidden" id="reply-form-3"> <div class="flex items-start space-x-3"> <div class="flex-shrink-0"> <div class="w-8 h-8 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-full flex items-center justify-center"> <svg class="w-4 h-4 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path> </svg> </div> </div> <div class="flex-1"> <textarea placeholder="回复 wang***@163.com..." class="w-full p-3 border border-gray-200 rounded-lg resize-none focus:ring-2 focus:ring-primary focus:border-transparent transition-all text-sm" rows="2" ></textarea> <div class="flex items-center justify-end mt-2 space-x-2"> <button class="px-3 py-1 text-sm text-gray-600 hover:text-gray-800 transition-colors cancel-reply"> 取消 </button> <button class="px-4 py-1 bg-primary text-white rounded text-sm hover:bg-primary-dark transition-colors"> 回复 </button> </div> </div> </div> </div> </div> </div> </div> </div> <div class="text-center mt-8"> <button class="inline-flex items-center px-6 py-3 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50 transition-colors"> <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path> </svg> 加载更多评论 </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const replyBtns = document.querySelectorAll('.reply-btn'); const cancelReplyBtns = document.querySelectorAll('.cancel-reply'); replyBtns.forEach(btn => { btn.addEventListener('click', function() { const commentId = this.getAttribute('data-comment-id'); const replyForm = document.getElementById(`reply-form-${commentId}`); document.querySelectorAll('.reply-form').forEach(form => { if (form.id !== `reply-form-${commentId}`) { form.classList.add('hidden'); } }); replyForm.classList.toggle('hidden'); if (!replyForm.classList.contains('hidden')) { const textarea = replyForm.querySelector('textarea'); textarea.focus(); } }); }); cancelReplyBtns.forEach(btn => { btn.addEventListener('click', function() { const replyForm = this.closest('.reply-form'); replyForm.classList.add('hidden'); const textarea = replyForm.querySelector('textarea'); textarea.value = ''; }); }); const submitBtn = document.getElementById('submit-comment'); const commentInput = document.getElementById('comment-input'); const commentName = document.getElementById('comment-name'); const commentEmail = document.getElementById('comment-email'); submitBtn.addEventListener('click', function() { const content = commentInput.value.trim(); const nameVal = commentName.value.trim(); const emailVal = commentEmail.value.trim(); if (!nameVal || !emailVal) { alert('请填写昵称和邮箱后再发表评论'); return; } if (content) { alert('评论发表成功!'); commentInput.value = ''; commentName.value = ''; commentEmail.value = ''; } else { alert('请输入评论内容'); } }); document.querySelectorAll('button').forEach(btn => { if (btn.innerHTML.includes('👍')) { btn.addEventListener('click', function() { const likeCount = this.querySelector('span'); if (likeCount) { const currentCount = parseInt(likeCount.textContent.split(' ')[1]); likeCount.textContent = `👍 ${currentCount + 1}`; this.classList.add('text-primary'); } }); } }); document.querySelectorAll('textarea').forEach(textarea => { textarea.addEventListener('input', function() { this.style.height = 'auto'; this.style.height = this.scrollHeight + 'px'; }); }); }); </script> <style> .comments-section { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } .comment-item { transition: all 0.2s ease; } .comment-item:hover { transform: translateY(-1px); } .reply-form { animation: slideDown 0.3s ease; } @keyframes slideDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .comment-form textarea:focus, .reply-form textarea:focus { box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15); } @media (max-width: 640px) { .comments-section { padding: 1rem; margin: 1rem -1rem 0 -1rem; border-radius: 0; } .comment-item .flex { flex-direction: column; space-x: 0; } .comment-item .flex-shrink-0 { margin-bottom: 0.5rem; } } </style> </main> <aside class="lg:col-span-1"> <div class="bg-white rounded-2xl shadow-sm p-6 mb-6 sticky top-20"> <h3 class="text-lg font-semibold text-gray-900 mb-4 flex items-center gap-2"> <svg class="w-5 h-5 text-emerald-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h16M4 18h16"></path> </svg> 文章大纲 </h3> <nav id="article-toc" class="text-sm max-h-64 overflow-y-auto pr-2 scrollbar-thin"></nav> <p id="article-toc-empty" class="text-sm text-gray-500 hidden">本篇文章暂无可用大纲。</p> </div> <div class="cta-banner bg-gradient-to-br from-emerald-500 via-emerald-600 to-teal-600 rounded-2xl p-6 text-white mb-6 shadow-lg shadow-emerald-500/20"> <div class="relative z-10"> <div class="flex items-center gap-2 mb-3"> <span class="bg-white/20 p-2 rounded-lg"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path> </svg> </span> <h3 class="text-lg font-bold">润色优化你的简历</h3> </div> <p class="text-emerald-100 mb-4 text-sm"> 使用AI技术,3分钟优化专业简历,提升求职成功率 </p> <a href="https://app.resumemakeroffer.com/home?from=blog-right-92239" rel="nofollow" class="group block w-full bg-white text-emerald-600 text-center py-3 rounded-xl font-semibold hover:bg-emerald-50 hover:shadow-lg transition-all duration-300 mb-4"> <span class="flex items-center justify-center gap-2"> 免费开始使用 <svg class="w-4 h-4 group-hover:translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path> </svg> </span> </a> <ul class="text-emerald-100 text-sm space-y-2"> <li class="flex items-center gap-2"> <svg class="w-4 h-4 text-emerald-300 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path> </svg> AI智能优化建议 </li> <li class="flex items-center gap-2"> <svg class="w-4 h-4 text-emerald-300 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path> </svg> 专业模板库 </li> <li class="flex items-center gap-2"> <svg class="w-4 h-4 text-emerald-300 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path> </svg> 一键生成求职信 </li> <li class="flex items-center gap-2"> <svg class="w-4 h-4 text-emerald-300 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path> </svg> 多格式导出 </li> </ul> </div> </div> <div class="bg-white rounded-2xl shadow-sm p-6 mb-6"> <h3 class="text-lg font-semibold text-gray-900 mb-4">🔥 热门工具</h3> <ul class="space-y-3"> <li> <a href="https://app.resumemakeroffer.com/chat/perf?from=blog-right-button-92239" rel="nofollow" class="flex items-center text-gray-700 hover:text-primary transition-colors"> <span class="w-2 h-2 bg-primary rounded-full mr-3"></span> AI简历优化工具 </a> </li> <li> <a href="https://app.resumemakeroffer.com/resume-edit/new?from=blog-right-button-92239" class="flex items-center text-gray-700 hover:text-primary transition-colors"> <span class="w-2 h-2 bg-primary rounded-full mr-3"></span> 在线简历编辑器 </a> </li> <li> <a href="https://app.resumemakeroffer.com/chat/create?from=blog-right-button-92239" rel="nofollow" class="flex items-center text-gray-700 hover:text-primary transition-colors"> <span class="w-2 h-2 bg-primary rounded-full mr-3"></span> AI简历与求职信生成 </a> </li> </ul> </div> <div class="bg-white rounded-2xl shadow-sm p-6 mb-8"> <h3 class="text-lg font-semibold text-gray-900 mb-4">最新文章</h3> <div class="space-y-4"> <a href="/blog/post/92897" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 2026年个人简历(可编辑)范文参考:3份高分模板直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92896" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 2026年HR最爱!10份高颜值工作简历模板范文参考,直接套用秒拿面试 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92895" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 个人简历模板怎么写:HR最爱的5套高分范文直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92894" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 工作简历(通用版)范文参考:3份高分模板直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92893" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 个人简历表格范文参考:5套HR最爱的标准模板直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92891" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 教师个人简历简短大气范文参考:3篇可直接套用的精英模板 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92890" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 个人简历样本范文参考:5份HR点赞的实战模板直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92876" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 个人简历模板范文参考:5份HR最爱的高分简历直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92875" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 2026年HR最爱的10份求职简历模板范文参考,直接套用秒拿面试 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92874" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 个人简历怎么写:HR最爱的5个高分结构+可直接套用的范文参考 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92873" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> # 个人简历(电子版)范文参考:HR最爱的3种高分模板直接套用 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> <a href="/blog/post/92872" class="block group"> <div class="border-l-4 border-gray-200 group-hover:border-primary pl-4 py-2 transition-colors"> <h4 class="font-medium text-gray-900 group-hover:text-primary text-sm mb-1 line-clamp-2"> 个人简历内容怎么写?HR最爱的5个高分范文直接抄 </h4> <div class="flex items-center justify-between text-xs text-gray-500"> <span>网友投稿</span> <span>2026-01-31 17:24:31</span> </div> </div> </a> </div> </div> <div class="bg-white rounded-2xl shadow-sm p-6"> <h3 class="text-lg font-semibold text-gray-900 mb-4">📧 订阅更新</h3> <p class="text-gray-600 text-sm mb-4"> 订阅我们的博客,获取最新的简历优化技巧和求职攻略。 </p> <form class="space-y-3"> <input type="email" placeholder="输入你的邮箱" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent"> <button type="submit" class="w-full bg-primary text-white py-2 rounded-lg font-medium hover:bg-secondary transition-colors"> 订阅 </button> </form> </div> </aside> </div> </div> <script> (function () { function slugify(text) { try { var s = (text || "").toString().trim().toLowerCase(); s = s.replace(/\s+/g, "-"); s = s.replace(/[^a-z0-9\-\u4e00-\u9fff]/g, "-"); s = s.replace(/\-+/g, "-").replace(/^\-+|\-+$/g, ""); return s; } catch (e) { return ""; } } function buildTOC() { var container = document.getElementById("article-content"); var toc = document.getElementById("article-toc"); var empty = document.getElementById("article-toc-empty"); if (!container || !toc || !empty) return; var headings = container.querySelectorAll("h2, h3"); if (!headings || headings.length === 0) { empty.classList.remove("hidden"); return; } var used = {}; var list = document.createElement("ul"); list.className = "space-y-2"; headings.forEach(function (h, idx) { var level = h.tagName.toLowerCase(); var title = (h.textContent || "").trim(); if (!title) return; if (!h.id) { var base = slugify(title); if (!base) base = "sec-" + (idx + 1); var id = base; var k = 2; while (used[id] || document.getElementById(id)) { id = base + "-" + k; k++; } used[id] = true; h.id = id; } var li = document.createElement("li"); li.className = level === "h3" ? "ml-4" : ""; var a = document.createElement("a"); a.href = "#" + h.id; a.className = "text-gray-700 hover:text-primary transition-colors block py-1"; a.setAttribute("data-heading-id", h.id); a.textContent = title; li.appendChild(a); list.appendChild(li); }); toc.innerHTML = ""; toc.appendChild(list); } function calculateReadingTime() { var content = document.getElementById("article-content"); var readingTimeText = document.getElementById("reading-time-text"); if (!content || !readingTimeText) return; var text = content.textContent || content.innerText || ""; var chineseChars = (text.match(/[\u4e00-\u9fff]/g) || []).length; var englishWords = (text.match(/[a-zA-Z]+/g) || []).length; var totalMinutes = Math.ceil(chineseChars / 400 + englishWords / 200); totalMinutes = Math.max(1, totalMinutes); readingTimeText.textContent = totalMinutes + " 分钟阅读"; } function initReadingProgress() { var progressBar = document.getElementById("progress-bar"); var floatingCta = document.getElementById("floating-cta"); var backToTop = document.getElementById("back-to-top"); var articleContent = document.getElementById("article-content"); if (!progressBar || !articleContent) return; var ticking = false; function updateProgress() { var articleRect = articleContent.getBoundingClientRect(); var windowHeight = window.innerHeight; var docHeight = document.documentElement.scrollHeight - windowHeight; var scrollTop = window.pageYOffset || document.documentElement.scrollTop; var articleTop = articleContent.offsetTop; var articleHeight = articleContent.offsetHeight; var articleProgress = 0; if (scrollTop >= articleTop) { articleProgress = Math.min(100, ((scrollTop - articleTop) / (articleHeight - windowHeight * 0.5)) * 100); } articleProgress = Math.max(0, Math.min(100, articleProgress)); progressBar.style.width = articleProgress + "%"; if (floatingCta) { if (scrollTop > 300) { floatingCta.classList.remove("opacity-0", "translate-y-4", "pointer-events-none"); floatingCta.classList.add("opacity-100", "translate-y-0"); } else { floatingCta.classList.add("opacity-0", "translate-y-4", "pointer-events-none"); floatingCta.classList.remove("opacity-100", "translate-y-0"); } } ticking = false; } window.addEventListener("scroll", function() { if (!ticking) { window.requestAnimationFrame(updateProgress); ticking = true; } }, { passive: true }); if (backToTop) { backToTop.addEventListener("click", function() { window.scrollTo({ top: 0, behavior: "smooth" }); }); } updateProgress(); } function initTOCHighlight() { var toc = document.getElementById("article-toc"); var articleContent = document.getElementById("article-content"); if (!toc || !articleContent) return; var headings = articleContent.querySelectorAll("h2, h3"); if (!headings.length) return; var tocLinks = toc.querySelectorAll("a[data-heading-id]"); var ticking = false; function highlightCurrentSection() { var scrollTop = window.pageYOffset || document.documentElement.scrollTop; var offset = 100; var currentId = null; headings.forEach(function(h) { if (h.offsetTop - offset <= scrollTop) { currentId = h.id; } }); tocLinks.forEach(function(link) { if (link.getAttribute("data-heading-id") === currentId) { link.classList.add("active", "text-primary", "font-medium"); link.classList.remove("text-gray-700"); } else { link.classList.remove("active", "text-primary", "font-medium"); link.classList.add("text-gray-700"); } }); ticking = false; } window.addEventListener("scroll", function() { if (!ticking) { window.requestAnimationFrame(highlightCurrentSection); ticking = true; } }, { passive: true }); highlightCurrentSection(); } window.shareToWeibo = function() { var title = document.title; var url = window.location.href; var weiboUrl = "https://service.weibo.com/share/share.php?url=" + encodeURIComponent(url) + "&title=" + encodeURIComponent(title); window.open(weiboUrl, "_blank", "width=600,height=400"); }; window.copyLink = function() { var url = window.location.href; if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(url).then(function() { showToast("链接已复制到剪贴板"); }); } else { var textarea = document.createElement("textarea"); textarea.value = url; document.body.appendChild(textarea); textarea.select(); document.execCommand("copy"); document.body.removeChild(textarea); showToast("链接已复制到剪贴板"); } }; function showToast(message) { var toast = document.createElement("div"); toast.className = "fixed top-20 left-1/2 -translate-x-1/2 bg-gray-900 text-white px-4 py-2 rounded-lg shadow-lg z-50 text-sm"; toast.textContent = message; document.body.appendChild(toast); setTimeout(function() { toast.style.opacity = "0"; toast.style.transition = "opacity 0.3s"; setTimeout(function() { document.body.removeChild(toast); }, 300); }, 2000); } function init() { buildTOC(); calculateReadingTime(); initReadingProgress(); initTOCHighlight(); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })(); </script> <footer class="bg-text-dark text-white"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16"> <div class="grid md:grid-cols-5 gap-8"> <div class="md:col-span-1"> <h3 class="text-2xl font-bold mb-4">AI简历姬·在线AI简历生成工具</h3> <p class="text-gray-400 mb-6 leading-relaxed"> AI 简历姬是一款以岗位要求/招聘信息(JD)为中心的全流程求职工作台,主打“过筛不秒挂 + 面试更稳”,把“投递—面试—复盘”做成可管理闭环。用户可导入旧简历进行结构化解析与字段完整度修复;上传岗位要求后,系统会把关键词逐条对齐到你的具体经历,输出匹配度评分、关键词覆盖率与缺口清单,并基于量化改写/STAR 结构化重写关键经历,3 分钟生成可投递初稿(PDF/Word 版本简历文本均可解析抓取),以提供简历筛选系统(ATS)/HR 机器筛选友好校验。面试模块基于“你的简历 + 目标岗位”生成定制追问、参考回答与反馈建议(千万数据训练),用于提升面试通过率。同时支持一岗一版多版本管理、批量适配与投递看板追踪,并可搭配自动投递插件提升投递效率。 </p> </div> <div> <h4 class="text-lg font-semibold mb-4">产品功能</h4> <ul class="space-y-3 text-gray-400"> <li><a href="https://app.resumemakeroffer.com/home?from=footer" rel="nofollow" class="hover:text-white transition-colors">在线AI简历生成</a></li> <li><a href="https://app.resumemakeroffer.com/chat/perf?from=footer" rel="nofollow" class="hover:text-white transition-colors">AI简历润色</a></li> <li><a href="/resume-history?from=footer" class="hover:text-white transition-colors">我的简历</a></li> <li><a href="/page/resume_translate?from=footer" class="hover:text-white transition-colors">简历翻译</a></li> <li><a href="https://app.resumemakeroffer.com/chat/interview?from=footer" rel="nofollow" class="hover:text-white transition-colors">AI模拟面试</a></li> <li><a href="/resume-examples?from=footer" class="hover:text-white transition-colors">简历模板与范文</a></li> </ul> </div> <div> <h4 class="text-lg font-semibold mb-4">资源与攻略</h4> <ul class="space-y-3 text-gray-400"> <li><a href="/jobradar?from=footer" class="hover:text-white transition-colors">校招信息</a></li> <li><a href="/blog?from=footer" class="hover:text-white transition-colors">求职攻略</a></li> <li><a href="/resume-examples?from=footer" class="hover:text-white transition-colors">简历范文库</a></li> <li><a href="/page/how-to-write-a-resume?from=footer" class="hover:text-white transition-colors">怎么写简历</a></li> <li><a href="/page/how-to-optimize-a-resume?from=footer" class="hover:text-white transition-colors">怎么做简历优化</a></li> <li><a href="/page/auto_fill?from=footer" class="hover:text-white transition-colors">投递插件</a></li> <li><a href="/page/markdown_to_pdf?from=footer" class="hover:text-white transition-colors">Markdown转PDF简历</a></li> <li><a href="/page/html_to_image?from=footer" class="hover:text-white transition-colors">HTML转图片简历</a></li> <li><a href="/page/resume_guidance?from=footer" class="hover:text-white transition-colors">简历指导优化</a></li> <li><a href="/page/interview_coaching?from=footer" class="hover:text-white transition-colors">面试辅导</a></li> <li><a href="/page/career_planning?from=footer" class="hover:text-white transition-colors">职业规划</a></li> </ul> </div> <div> <h4 class="text-lg font-semibold mb-4">帮助指南</h4> <ul class="space-y-3 text-gray-400"> <li><a href="/page/about_airesumemakeroffer" class="hover:text-white transition-colors">关于我们</a></li> <li><a href="/page/faq?from=footer" class="hover:text-white transition-colors">常见问题</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90183" class="hover:text-white transition-colors">夹带个人简历图片怎么弄?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/92487" class="hover:text-white transition-colors">Word简历照片怎么调整位置?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/92507" class="hover:text-white transition-colors">简历怎么转化为Word?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90868" class="hover:text-white transition-colors">简历填写籍贯怎么写?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90223" class="hover:text-white transition-colors">求职意向的最佳写法是什么?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90229" class="hover:text-white transition-colors">求职自我评价怎么写?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90237" class="hover:text-white transition-colors">简历待筛选是不是没希望了?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90275" class="hover:text-white transition-colors">三年空白期怎么写简历才能让HR眼前一亮?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90300" class="hover:text-white transition-colors">求职信怎么写才能突出个人优势?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90309" class="hover:text-white transition-colors">简历必须要一页吗?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90316" class="hover:text-white transition-colors">简历应该存成PDF还是Word?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90469" class="hover:text-white transition-colors">银行春招和秋招的区别究竟在哪里?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90475" class="hover:text-white transition-colors">岗位JD是什么意思?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90494" class="hover:text-white transition-colors">你有什么优缺点面试回答?</a></li> <li><a href="https://www.resumemakeroffer.com/blog/post/90510" class="hover:text-white transition-colors">面试时问职业规划怎么回答才能打动HR?</a></li> </ul> </div> <div> <h4 class="text-lg font-semibold mb-4">友情链接</h4> <ul class="space-y-3 text-gray-400"> <li><a href="https://echotik.live" class="hover:text-white transition-colors" target="_blank" rel="noopener">EchoTik</a></li> <li><a href="https://ruzhiai.perfcloud.cn" class="hover:text-white transition-colors" target="_blank" rel="noopener">如知AI笔记</a></li> <li><a href="https://aiphotoeditor.bekaie.com" class="hover:text-white transition-colors" target="_blank" rel="noopener">AI图像编辑</a></li> </ul> </div> </div> <hr class="border-gray-800 my-8"> <div class="flex flex-col md:flex-row justify-between items-center"> <p class="text-gray-400 mb-4 md:mb-0"> <a href="https://beian.miit.gov.cn/?from=footer" target="_blank" rel="nofollow"> 苏ICP备20027924号-7</a> © 2025 AI简历姬·在线AI简历生成工具与优化润色求职助手。保留所有权利。 </p> <div class="flex space-x-6 text-gray-400 items-center"> <a href="/page/privacy?from=footer" rel="nofollow" class="hover:text-white transition-colors">隐私政策</a> <a href="/page/terms?from=footer" rel="nofollow" class="hover:text-white transition-colors">服务条款</a> <a href="/page/disclaimer?from=footer" rel="nofollow" class="hover:text-white transition-colors">免责声明</a> <div class="relative group"> <button class="flex items-center hover:text-white transition-colors"> <svg class="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path> </svg> <span>Language</span> <svg class="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7"></path> </svg> </button> <div class="absolute bottom-full right-0 mb-2 w-32 bg-gray-800 rounded-lg shadow-xl border border-gray-700 opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 z-50"> <div class="py-2"> <a href="/" class="block px-4 py-2 text-gray-300 hover:bg-gray-700 hover:text-white transition-colors">简体中文</a> <a href="/zh-hant/" class="block px-4 py-2 text-gray-300 hover:bg-gray-700 hover:text-white transition-colors">繁體中文</a> <a href="/ja/" class="block px-4 py-2 text-gray-300 hover:bg-gray-700 hover:text-white transition-colors">日本語</a> <a href="/ko/" class="block px-4 py-2 text-gray-300 hover:bg-gray-700 hover:text-white transition-colors">한국어</a> <a href="/en/" class="block px-4 py-2 text-gray-300 hover:bg-gray-700 hover:text-white transition-colors">English</a> </div> </div> </div> </div> </div> </div> </footer> <div id="aiGuideModal" class="fixed inset-0 bg-black/50 flex items-center justify-center z-[60] hidden backdrop-blur-sm transition-all duration-300 p-4 sm:p-6"> <div class="bg-white rounded-3xl shadow-2xl w-full max-w-4xl max-h-[90vh] relative transform transition-all duration-500 scale-95 opacity-0 overflow-hidden ring-1 ring-black/5" id="aiGuideModalContent"> <button id="closeAiGuideModal" class="absolute top-4 right-4 bg-white/80 hover:bg-white text-gray-500 hover:text-gray-700 rounded-full w-9 h-9 flex items-center justify-center transition-all hover:scale-110 shadow-sm z-20 backdrop-blur-sm"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> <div class="flex flex-col md:flex-row max-h-[90vh] overflow-y-auto overflow-x-hidden overscroll-contain"> <div class="hidden md:flex bg-gradient-to-br from-emerald-500 via-emerald-600 to-teal-600 md:w-5/12 p-10 lg:p-12 rounded-l-3xl items-center text-white relative overflow-hidden"> <div class="absolute inset-0 opacity-10"> <div class="absolute top-10 left-10 w-32 h-32 bg-white rounded-full blur-3xl"></div> <div class="absolute bottom-10 right-10 w-40 h-40 bg-white rounded-full blur-3xl"></div> </div> <div class="space-y-6 relative z-10 text-center w-full"> <div class="w-16 h-16 bg-white/20 rounded-2xl flex items-center justify-center backdrop-blur-sm mx-auto"> <svg class="w-9 h-9" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path> </svg> </div> <div class="space-y-2"> <h3 class="text-3xl font-bold leading-tight">96%用户选择</h3> <p class="text-emerald-100 text-base leading-relaxed"> 平均 3 分钟写完简历<br>获得面试机会增加 68% </p> </div> <div class="space-y-3 text-base pt-2"> <div class="flex items-center justify-center bg-white/10 rounded-lg px-4 py-2.5 backdrop-blur-sm"> <svg class="w-5 h-5 mr-2 text-emerald-200 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <span>AI生成Word简历模板</span> </div> <div class="flex items-center justify-center bg-white/10 rounded-lg px-4 py-2.5 backdrop-blur-sm"> <svg class="w-5 h-5 mr-2 text-emerald-200 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <span>AI一键优化简历内容</span> </div> <div class="flex items-center justify-center bg-white/10 rounded-lg px-4 py-2.5 backdrop-blur-sm"> <svg class="w-5 h-5 mr-2 text-emerald-200 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg> <span>导出PDF/Word无水印</span> </div> </div> </div> </div> <div class="md:w-7/12 p-6 sm:p-8 lg:p-10"> <div class="md:hidden w-16 h-1 bg-gradient-to-r from-emerald-400 to-teal-400 rounded-full mx-auto mb-6"></div> <div class="mb-6 space-y-3"> <span class="inline-block bg-amber-100 text-amber-700 text-xs font-semibold px-3 py-1 rounded-full"> 🎁 限时免费体验 </span> <h2 id="aiGuideTitle" class="text-3xl font-bold text-gray-900 leading-tight"> 每次投递,必优化简历<br><span class="text-emerald-600">获得更多面试机会</span> </h2> <p id="aiGuideSubtitle" class="text-gray-600 leading-relaxed text-base"> 匹配岗位需求,针对性优化简历。现在注册即可免费体验所有功能! </p> </div> <div class="md:hidden mb-5 space-y-2 text-sm text-gray-600"> <div class="flex items-start gap-2"> <svg class="w-4 h-4 mt-0.5 text-emerald-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path> </svg> <span>AI生成Word简历模板</span> </div> <div class="flex items-start gap-2"> <svg class="w-4 h-4 mt-0.5 text-emerald-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path> </svg> <span>AI一键优化简历内容</span> </div> <div class="flex items-start gap-2"> <svg class="w-4 h-4 mt-0.5 text-emerald-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path> </svg> <span>导出PDF/Word无水印</span> </div> </div> <div class="space-y-4"> <a href="https://app.resumemakeroffer.com/chat/perf/?from=guide_modal" data-base-href="https://app.resumemakeroffer.com/chat/perf/?from=guide_modal" rel="nofollow" class="group block w-full bg-gradient-to-r from-emerald-500 to-teal-500 hover:from-emerald-600 hover:to-teal-600 text-white font-bold text-lg py-5 px-8 rounded-xl transition-all transform hover:scale-105 shadow-lg hover:shadow-xl text-center"> <span class="flex items-center justify-center gap-2"> <svg class="w-6 h-6 transition-transform group-hover:-translate-y-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path> </svg> <span id="aiGuidePrimaryText">立即优化简历(免费)</span> </span> </a> <a href="https://app.resumemakeroffer.com/home?from=guide_modal" data-base-href="https://app.resumemakeroffer.com/home?from=guide_modal" rel="nofollow" class="block w-full bg-gray-100 hover:bg-emerald-50 text-gray-800 font-semibold text-base py-4 px-8 rounded-xl transition-all text-center border border-gray-200 hover:border-emerald-200"> <span class="flex items-center justify-center gap-2"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path> </svg> <span id="aiGuideSecondaryText">在线制作简历</span> </span> </a> </div> <div class="mt-6 pt-6 border-t border-gray-200"> <div class="flex items-center justify-center flex-wrap gap-x-4 gap-y-2 text-xs text-gray-500"> <div class="flex items-center"> <svg class="w-3.5 h-3.5 mr-1 text-green-500" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M2.166 4.999A11.954 11.954 0 0010 1.944 11.954 11.954 0 0017.834 5c.11.65.166 1.32.166 2.001 0 5.225-3.34 9.67-8 11.317C5.34 16.67 2 12.225 2 7c0-.682.057-1.35.166-2.001zm11.541 3.708a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path> </svg> <span>安全保障</span> </div> <div class="flex items-center"> <svg class="w-3.5 h-3.5 mr-1 text-emerald-500" fill="currentColor" viewBox="0 0 20 20"> <path d="M9 6a3 3 0 11-6 0 3 3 0 016 0zM17 6a3 3 0 11-6 0 3 3 0 016 0zM12.93 17c.046-.327.07-.66.07-1a6.97 6.97 0 00-1.5-4.33A5 5 0 0119 16v1h-6.07zM6 11a5 5 0 015 5v1H1v-1a5 5 0 015-5z"></path> </svg> <span>50万+用户</span> </div> <div class="flex items-center"> <svg class="w-3.5 h-3.5 mr-1 text-amber-500" fill="currentColor" viewBox="0 0 20 20"> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path> </svg> <span>满意度高</span> </div> </div> </div> <div class="mt-4 text-center"> <button id="remindLater" class="text-sm text-gray-400 hover:text-gray-600 underline transition-colors"> 稍后再说 </button> </div> </div> </div> </div> </div> <style> #wechatModal { backdrop-filter: blur(4px); } #wechatModal .bg-white { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } </style> <script> function showWechatModal() { document.getElementById('wechatModal').classList.remove('hidden'); document.body.style.overflow = 'hidden'; } function hideWechatModal() { document.getElementById('wechatModal').classList.add('hidden'); document.body.style.overflow = 'auto'; } document.addEventListener('DOMContentLoaded', function() { const modal = document.getElementById('wechatModal'); const closeBtn = document.getElementById('closeModal'); if (closeBtn) { closeBtn.addEventListener('click', hideWechatModal); } if (modal) { modal.addEventListener('click', function(e) { if (e.target === modal) { hideWechatModal(); } }); } document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && !modal.classList.contains('hidden')) { hideWechatModal(); } }); }); </script> <script> (function() { const MODAL_STORAGE_PREFIX = 'aiGuideModalShown_'; const MODAL_DELAY = 3000; const MODAL_EXPIRE_MINUTES = 5; const VARIANT_MODE = 'rotate'; const VARIANT_STORAGE_KEY = 'aiGuideModalVariantIndex_v2'; const VARIANT_LAST_KEY = 'aiGuideModalVariantLast_v2'; const VARIANTS = { S: { title: '每次投递,必优化简历', subtitle: '获得更多面试机会', titleHtml: '每次投递,必优化简历<br><span class=\"text-emerald-600\">获得更多面试机会</span>', subtitleHtml: '匹配岗位需求,针对性优化简历。<br>现在注册即可免费体验所有功能!', primary: '立即优化简历(免费)', secondary: '在线制作简历' }, A: { title: '投了100份简历,为什么没有面试?', subtitle: '90%的简历在HR眼里不到3秒就被淘汰', primary: '免费诊断我的简历', secondary: '查看简历优化案例' }, B: { title: '让每一份投递都有回音', subtitle: 'AI 智能匹配岗位要求,3 分钟生成高匹配度简历', primary: '开始优化简历', secondary: '先看看效果示例' }, C: { title: '正在找工作?', subtitle: '针对目标岗位定制优化,提升简历通过率', primary: '优化我的简历', secondary: '了解更多' } }; let currentVariant = null; function getStorageKey() { const path = window.location.pathname; return MODAL_STORAGE_PREFIX + encodeURIComponent(path); } function shouldShowModal() { const storageKey = getStorageKey(); const lastShown = localStorage.getItem(storageKey); if (!lastShown) return true; const minutesSinceShown = (Date.now() - parseInt(lastShown)) / (1000 * 60); return minutesSinceShown >= MODAL_EXPIRE_MINUTES; } function markModalAsShown() { const storageKey = getStorageKey(); localStorage.setItem(storageKey, Date.now().toString()); } function selectGuideVariant() { const keys = Object.keys(VARIANTS); if (VARIANT_MODE === 'random') { return keys[Math.floor(Math.random() * keys.length)]; } const rawIndex = parseInt(localStorage.getItem(VARIANT_STORAGE_KEY) || '0', 10); const safeIndex = Number.isFinite(rawIndex) ? rawIndex : 0; const variantKey = keys[safeIndex % keys.length]; localStorage.setItem(VARIANT_STORAGE_KEY, String(safeIndex + 1)); localStorage.setItem(VARIANT_LAST_KEY, variantKey); return variantKey; } function applyGuideVariant(variantKey) { const data = VARIANTS[variantKey] || VARIANTS.B; const title = document.getElementById('aiGuideTitle'); const subtitle = document.getElementById('aiGuideSubtitle'); const primaryText = document.getElementById('aiGuidePrimaryText'); const secondaryText = document.getElementById('aiGuideSecondaryText'); const modal = document.getElementById('aiGuideModal'); if (title) { if (data.titleHtml) { title.innerHTML = data.titleHtml; } else { title.textContent = data.title; } } if (subtitle) { if (data.subtitleHtml) { subtitle.innerHTML = data.subtitleHtml; } else { subtitle.textContent = data.subtitle; } } if (primaryText) primaryText.textContent = data.primary; if (secondaryText) secondaryText.textContent = data.secondary; if (modal) { modal.setAttribute('data-variant', variantKey); } const links = document.querySelectorAll('#aiGuideModal a[data-base-href]'); links.forEach((link) => { const base = link.getAttribute('data-base-href'); if (!base) return; const separator = base.includes('?') ? '&' : '?'; link.setAttribute('href', `${base}${separator}variant=${encodeURIComponent(variantKey)}`); }); } function prepareGuideVariant() { if (currentVariant) return; currentVariant = selectGuideVariant(); applyGuideVariant(currentVariant); } function showModal() { const modal = document.getElementById('aiGuideModal'); const content = document.getElementById('aiGuideModalContent'); if (!modal || !content) return; prepareGuideVariant(); modal.classList.remove('hidden'); document.body.style.overflow = 'hidden'; setTimeout(() => { content.classList.remove('scale-95', 'opacity-0'); content.classList.add('scale-100', 'opacity-100'); }, 10); markModalAsShown(); } function hideModal() { const modal = document.getElementById('aiGuideModal'); const content = document.getElementById('aiGuideModalContent'); if (!modal || !content) return; content.classList.add('scale-95', 'opacity-0'); content.classList.remove('scale-100', 'opacity-100'); setTimeout(() => { modal.classList.add('hidden'); document.body.style.overflow = 'auto'; }, 300); } document.addEventListener('DOMContentLoaded', function() { if (shouldShowModal()) { setTimeout(showModal, MODAL_DELAY); } const closeBtn = document.getElementById('closeAiGuideModal'); if (closeBtn) { closeBtn.addEventListener('click', hideModal); } const remindBtn = document.getElementById('remindLater'); if (remindBtn) { remindBtn.addEventListener('click', hideModal); } const modal = document.getElementById('aiGuideModal'); if (modal) { modal.addEventListener('click', function(e) { if (e.target === modal) { hideModal(); } }); } document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { const modal = document.getElementById('aiGuideModal'); if (modal && !modal.classList.contains('hidden')) { hideModal(); } } }); }); })(); </script> <script> (function(){ try { var pref = localStorage.getItem('pref_lang'); if (pref) return; var path = location.pathname; var isEN = path && path.startsWith('/en/'); var userLang = (navigator.language || navigator.userLanguage || 'en').toLowerCase(); var ua = navigator.userAgent || ''; if (/bot|crawl|spider|slurp|bingpreview/i.test(ua)) return; var probablyZH = userLang.startsWith('zh'); var showSuggestToZH = isEN && probablyZH; var showSuggestToEN = !isEN && !probablyZH; if (!showSuggestToZH && !showSuggestToEN) return; function mapTo(lang){ var map = window.HREFLANG_MAP || {}; if (lang === 'en') { return map[path] && map[path].en ? map[path].en : '/en/'; } else { return map[path] && map[path].zh ? map[path].zh : '/'; } } var banner = document.getElementById('lang-banner'); if (!banner) return; var text = document.getElementById('lang-text'); var link = document.getElementById('lang-switch'); var close = document.getElementById('lang-close'); if (showSuggestToZH) { text.textContent = '检测到你的浏览器为中文,要切换到中文站吗?'; link.textContent = '切换到中文'; link.href = mapTo('zh'); } else if (showSuggestToEN) { text.textContent = 'It looks like your browser is in English. Switch to the English site?'; link.textContent = 'Switch to English'; link.href = mapTo('en'); } banner.style.display = 'block'; link.addEventListener('click', function(){ localStorage.setItem('pref_lang', showSuggestToZH ? 'zh' : 'en'); }); close.addEventListener('click', function(e){ e.preventDefault(); localStorage.setItem('pref_lang', isEN ? 'en' : 'zh'); banner.remove(); }); } catch(e){} })(); </script> <script> document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth' }); } }); }); let lastScroll = 0; window.addEventListener('scroll', () => { const currentScroll = window.pageYOffset; const header = document.querySelector('header'); if (currentScroll > 100) { header.classList.add('shadow-md'); } else { header.classList.remove('shadow-md'); } lastScroll = currentScroll; }); const mobileMenuButton = document.getElementById('mobile-menu-button'); const mobileMenu = document.getElementById('mobile-menu'); if (mobileMenuButton && mobileMenu) { mobileMenuButton.addEventListener('click', function() { mobileMenu.classList.toggle('hidden'); }); } const mobileDropdownBtns = document.querySelectorAll('.mobile-dropdown-btn'); mobileDropdownBtns.forEach(btn => { btn.addEventListener('click', function() { const content = this.nextElementSibling; const arrow = this.querySelector('svg'); content.classList.toggle('hidden'); arrow.classList.toggle('rotate-180'); mobileDropdownBtns.forEach(otherBtn => { if (otherBtn !== this) { const otherContent = otherBtn.nextElementSibling; const otherArrow = otherBtn.querySelector('svg'); otherContent.classList.add('hidden'); otherArrow.classList.remove('rotate-180'); } }); }); }); document.addEventListener('click', function(event) { if (mobileMenu && !mobileMenu.contains(event.target) && !mobileMenuButton.contains(event.target)) { mobileMenu.classList.add('hidden'); } }); window.addEventListener('resize', function() { if (window.innerWidth >= 768 && mobileMenu) { mobileMenu.classList.add('hidden'); } }); const dropdownContainers = document.querySelectorAll('.dropdown-container'); let activeDropdown = null; let hideTimeout = null; dropdownContainers.forEach(container => { const trigger = container.querySelector('.dropdown-trigger'); const menu = container.querySelector('.dropdown-menu'); const arrow = trigger.querySelector('svg'); if (!trigger || !menu) return; function showDropdown() { if (hideTimeout) { clearTimeout(hideTimeout); hideTimeout = null; } dropdownContainers.forEach(otherContainer => { if (otherContainer !== container) { const otherMenu = otherContainer.querySelector('.dropdown-menu'); const otherArrow = otherContainer.querySelector('.dropdown-trigger svg'); if (otherMenu) { otherMenu.classList.remove('opacity-100', 'visible'); otherMenu.classList.add('opacity-0', 'invisible'); } if (otherArrow) { otherArrow.classList.remove('rotate-180'); } } }); menu.classList.remove('opacity-0', 'invisible'); menu.classList.add('opacity-100', 'visible'); arrow.classList.add('rotate-180'); activeDropdown = container; } function hideDropdown() { hideTimeout = setTimeout(() => { menu.classList.remove('opacity-100', 'visible'); menu.classList.add('opacity-0', 'invisible'); arrow.classList.remove('rotate-180'); activeDropdown = null; hideTimeout = null; }, 250); } function cancelHide() { if (hideTimeout) { clearTimeout(hideTimeout); hideTimeout = null; } } trigger.addEventListener('mouseenter', showDropdown); trigger.addEventListener('mouseleave', hideDropdown); menu.addEventListener('mouseenter', cancelHide); menu.addEventListener('mouseleave', hideDropdown); const bridgeArea = container.children[1]; if (bridgeArea) { bridgeArea.addEventListener('mouseenter', cancelHide); bridgeArea.addEventListener('mouseleave', hideDropdown); } }); document.addEventListener('click', function(event) { if (activeDropdown && !activeDropdown.contains(event.target)) { const menu = activeDropdown.querySelector('.dropdown-menu'); const arrow = activeDropdown.querySelector('.dropdown-trigger svg'); if (menu) { menu.classList.remove('opacity-100', 'visible'); menu.classList.add('opacity-0', 'invisible'); } if (arrow) { arrow.classList.remove('rotate-180'); } activeDropdown = null; if (hideTimeout) { clearTimeout(hideTimeout); hideTimeout = null; } } }); }); </script> </body> </html>