[{"data":1,"prerenderedAt":556},["ShallowReactive",2],{"post-pitfalls-10":3,"posts-all-pitfalls-10":178},{"id":4,"title":5,"body":6,"category":163,"cover":164,"date":165,"description":166,"extension":167,"meta":168,"navigation":169,"path":170,"seo":171,"stem":172,"tags":173,"__hash__":177},"posts\u002Fblog\u002Fpitfalls-10.md","中小软件项目的 10 个技术踩坑记录",{"type":7,"value":8,"toc":148},"minimark",[9,14,31,35,46,50,58,62,70,74,82,86,94,98,106,110,118,122,130,134,142,145],[10,11,13],"h2",{"id":12},"_1-并发扣库存先锁后查","1. 并发扣库存：先锁后查",[15,16,17,21,22,25,26,30],"p",{},[18,19,20],"strong",{},"坑","：先查询库存再判断，超卖事故。\n",[18,23,24],{},"解法","：",[27,28,29],"code",{},"UPDATE ... SET stock = stock - 1 WHERE stock > 0","，用原子操作 + 影响行数判断。",[10,32,34],{"id":33},"_2-慢查询索引失效的常见原因","2. 慢查询：索引失效的常见原因",[15,36,37,25,39,42,43,45],{},[18,38,20],{},[27,40,41],{},"LIKE '%keyword%'"," 前缀模糊导致全表扫描。\n",[18,44,24],{},"：业务上改为前缀匹配，或引入 ES；必要时用覆盖索引。",[10,47,49],{"id":48},"_3-时区问题永远存-utc","3. 时区问题：永远存 UTC",[15,51,52,54,55,57],{},[18,53,20],{},"：直接存东八区字符串，跨平台解析乱套。\n",[18,56,24],{},"：数据库统一 UTC，展示层再转本地时区。",[10,59,61],{"id":60},"_4-上传文件务必做类型校验","4. 上传文件：务必做类型校验",[15,63,64,66,67,69],{},[18,65,20],{},"：只看扩展名放行，被上传了 web shell。\n",[18,68,24],{},"：校验 MIME + 魔数 + 重命名存储 + 独立静态域。",[10,71,73],{"id":72},"_5-配置管理敏感信息不进代码仓库","5. 配置管理：敏感信息不进代码仓库",[15,75,76,78,79,81],{},[18,77,20],{},"：数据库密码写死在代码里，仓库泄露全完。\n",[18,80,24],{},"：环境变量 + 密钥管理服务，.env 不进 git。",[10,83,85],{"id":84},"_6-定时任务防重复执行","6. 定时任务：防重复执行",[15,87,88,90,91,93],{},[18,89,20],{},"：多实例部署后定时任务重复跑，产生重复数据。\n",[18,92,24],{},"：分布式锁（Redis SETNX + 过期时间）。",[10,95,97],{"id":96},"_7-第三方接口必须做超时与重试","7. 第三方接口：必须做超时与重试",[15,99,100,102,103,105],{},[18,101,20],{},"：调用支付接口不设超时，接口挂了页面一直转圈。\n",[18,104,24],{},"：统一 HTTP 客户端，设置连接\u002F读取超时 + 幂等重试。",[10,107,109],{"id":108},"_8-日志关键节点必须留痕","8. 日志：关键节点必须留痕",[15,111,112,114,115,117],{},[18,113,20],{},"：线上出问题查不到上下文，只能靠猜。\n",[18,116,24],{},"：请求 ID 贯穿全链路，关键操作打印结构化日志。",[10,119,121],{"id":120},"_9-数据库连接池用完必还","9. 数据库连接池：用完必还",[15,123,124,126,127,129],{},[18,125,20],{},"：连接未释放，连接池耗尽服务假死。\n",[18,128,24],{},"：使用 ORM\u002F连接池管理，禁止手写裸连接不关闭。",[10,131,133],{"id":132},"_10-备份先演练恢复","10. 备份：先演练恢复",[15,135,136,138,139,141],{},[18,137,20],{},"：有备份但从没演练过，真出事时恢复失败。\n",[18,140,24],{},"：定期做恢复演练，备份文件异地存储。",[10,143,144],{"id":144},"写在最后",[15,146,147],{},"这 10 条几乎都是\"看起来很简单，出事很严重\"的典型。小项目更要注重基本功，把这些变成肌肉记忆。",{"title":149,"searchDepth":150,"depth":150,"links":151},"",2,[152,153,154,155,156,157,158,159,160,161,162],{"id":12,"depth":150,"text":13},{"id":33,"depth":150,"text":34},{"id":48,"depth":150,"text":49},{"id":60,"depth":150,"text":61},{"id":72,"depth":150,"text":73},{"id":84,"depth":150,"text":85},{"id":96,"depth":150,"text":97},{"id":108,"depth":150,"text":109},{"id":120,"depth":150,"text":121},{"id":132,"depth":150,"text":133},{"id":144,"depth":150,"text":144},"踩坑记录","https:\u002F\u002Fcoresg-normal.trae.ai\u002Fapi\u002Fide\u002Fv1\u002Ftext_to_image?prompt=developer%20debugging%20bug%20fix%20concept%2C%20magnifying%20glass%20over%20code%2C%20warning%20signs%20and%20checkmarks%2C%20flat%20illustration%20navy%20blue&image_size=landscape_16_9","2025-07","汇总近三年中小项目中反复踩到的技术坑：从并发扣库存到慢查询优化，每一条都对应真实生产事故。","md",{},true,"\u002Fblog\u002Fpitfalls-10",{"title":5,"description":166},"blog\u002Fpitfalls-10",[174,175,176],"后端","数据库","运维","jlZmmrp4tG6U2To7vrceflGkT-5CBv79K44aBtd2EM4",[179,320,449],{"id":180,"title":181,"body":182,"category":307,"cover":308,"date":309,"description":310,"extension":167,"meta":311,"navigation":169,"path":312,"seo":313,"stem":314,"tags":315,"__hash__":319},"posts\u002Fblog\u002Fenterprise-website-guide.md","从 0 到 1 搭建企业官网：技术选型与避坑指南",{"type":7,"value":183,"toc":301},[184,188,191,204,210,214,270,275,279,294,298],[10,185,187],{"id":186},"一先想清楚这个官网要解决什么问题","一、先想清楚：这个官网要解决什么问题",[15,189,190],{},"很多企业主做官网时只会说\"做个好看的页面\"，但作为开发者，第一步永远是问清楚目的：",[192,193,194,198,201],"ul",{},[195,196,197],"li",{},"是品牌展示，还是获客转化？",[195,199,200],{},"需要后台管理内容吗？",[195,202,203],{},"目标用户是搜索引擎流量，还是直接访问？",[15,205,206,209],{},[18,207,208],{},"避坑","：不要一上来就选重型框架。一个纯展示站用静态生成就够了，没必要引入数据库和后台。",[10,211,213],{"id":212},"二技术选型建议","二、技术选型建议",[215,216,217,233],"table",{},[218,219,220],"thead",{},[221,222,223,227,230],"tr",{},[224,225,226],"th",{},"场景",[224,228,229],{},"推荐",[224,231,232],{},"理由",[234,235,236,248,259],"tbody",{},[221,237,238,242,245],{},[239,240,241],"td",{},"纯展示站",[239,243,244],{},"Nuxt\u002FVuePress 静态生成",[239,246,247],{},"快、SEO 好、无运维成本",[221,249,250,253,256],{},[239,251,252],{},"需要内容更新",[239,254,255],{},"Nuxt + 内容管理",[239,257,258],{},"Markdown 驱动，改文不改码",[221,260,261,264,267],{},[239,262,263],{},"需要后台",[239,265,266],{},"Next\u002FNuxt + Headless CMS",[239,268,269],{},"内容与代码解耦",[15,271,272,274],{},[18,273,208],{},"：国内访问务必注意字体与 CDN 的可用性，Google Fonts 经常加载失败，建议自托管。",[10,276,278],{"id":277},"三部署与-seo-的关键点","三、部署与 SEO 的关键点",[280,281,282,285,288,291],"ol",{},[195,283,284],{},"国内服务器必须 ICP 备案，提前 1-3 周准备",[195,286,287],{},"强制 HTTPS，配置 301 跳转",[195,289,290],{},"生成 sitemap 并提交百度站长平台",[195,292,293],{},"每个页面单独写 title 与 description，不要全站共用",[10,295,297],{"id":296},"四总结","四、总结",[15,299,300],{},"企业官网的核心是\"清晰 + 快\"。技术选型围绕内容更新频率来决定，能静态就不要动态。这篇文章里的方案已经过 10+ 个项目验证，希望对你有帮助。",{"title":149,"searchDepth":150,"depth":150,"links":302},[303,304,305,306],{"id":186,"depth":150,"text":187},{"id":212,"depth":150,"text":213},{"id":277,"depth":150,"text":278},{"id":296,"depth":150,"text":297},"前端","https:\u002F\u002Fcoresg-normal.trae.ai\u002Fapi\u002Fide\u002Fv1\u002Ftext_to_image?prompt=web%20development%20technology%20stack%20illustration%2C%20code%20snippets%20and%20gear%20wheels%2C%20navy%20blue%20color%20palette%2C%20flat%20design&image_size=landscape_16_9","2025-11","企业官网看似简单，但技术选型、SEO、部署环节处处是坑。分享一套经过 10+ 个项目验证的选型方案。",{},"\u002Fblog\u002Fenterprise-website-guide",{"title":181,"description":310},"blog\u002Fenterprise-website-guide",[316,317,318],"Vue","Nuxt","SEO","N_yyD626PKk5RUWpGOaWNrYl2PtOrITTiGaypHDuW5Y",{"id":321,"title":322,"body":323,"category":437,"cover":438,"date":439,"description":440,"extension":167,"meta":441,"navigation":169,"path":442,"seo":443,"stem":444,"tags":445,"__hash__":448},"posts\u002Fblog\u002Fminiapp-cost-guide.md","小程序开发成本到底多少？一份真实的报价拆解",{"type":7,"value":324,"toc":431},[325,328,331,351,354,404,407,421,424],[10,326,327],{"id":327},"为什么小程序报价差距这么大",[15,329,330],{},"同样一句\"做个商城小程序\"，有人报 5 千，有人报 5 万。差距来自三个变量：",[280,332,333,339,345],{},[195,334,335,338],{},[18,336,337],{},"功能复杂度","：展示型 vs 交易型，差了不止一个量级",[195,340,341,344],{},[18,342,343],{},"后台管理","：要不要管理端，决定工作量翻倍",[195,346,347,350],{},[18,348,349],{},"对接成本","：支付、物流、第三方系统，每个接口都要钱和时间",[10,352,353],{"id":353},"一份真实的报价区间参考",[215,355,356,369],{},[218,357,358],{},[221,359,360,363,366],{},[224,361,362],{},"类型",[224,364,365],{},"周期",[224,367,368],{},"参考报价",[234,370,371,382,393],{},[221,372,373,376,379],{},[239,374,375],{},"展示型小程序",[239,377,378],{},"2-4 周",[239,380,381],{},"0.5 - 1.5 万",[221,383,384,387,390],{},[239,385,386],{},"商城 + 支付",[239,388,389],{},"4-8 周",[239,391,392],{},"2 - 5 万",[221,394,395,398,401],{},[239,396,397],{},"交易 + 复杂业务",[239,399,400],{},"8-16 周",[239,402,403],{},"5 万起",[10,405,406],{"id":406},"给需求方的建议",[192,408,409,415,418],{},[195,410,411,412],{},"不要只比价格，要对比",[18,413,414],{},"案例 + 服务流程 + 售后",[195,416,417],{},"需求文档写得越细，报价越准确，双方越省心",[195,419,420],{},"确认是否包含：UI 设计、苹果安卓两端、服务器、上线审核、售后维护",[10,422,423],{"id":423},"给接单同行的建议",[15,425,426,427,430],{},"报价前一定要把",[18,428,429],{},"需求边界","写清楚，哪些包含、哪些不包含，避免后期扯皮。合理的报价 = 功能 + 人力 + 风险 + 合理利润。",{"title":149,"searchDepth":150,"depth":150,"links":432},[433,434,435,436],{"id":327,"depth":150,"text":327},{"id":353,"depth":150,"text":353},{"id":406,"depth":150,"text":406},{"id":423,"depth":150,"text":423},"接单经验","https:\u002F\u002Fcoresg-normal.trae.ai\u002Fapi\u002Fide\u002Fv1\u002Ftext_to_image?prompt=mini%20program%20development%20cost%20analysis%2C%20price%20tags%20and%20timeline%20chart%2C%20modern%20flat%20illustration%2C%20blue%20and%20navy&image_size=landscape_16_9","2025-09","很多人问\"做个小程序多少钱\"，答案从几千到几十万都有。这篇文章用真实案例拆解影响报价的核心因素。",{},"\u002Fblog\u002Fminiapp-cost-guide",{"title":322,"description":440},"blog\u002Fminiapp-cost-guide",[446,447],"小程序","报价","NWs4paQ5PsebZBJJDwmRSvLRTS1r41bf46sPgS2ljY0",{"id":4,"title":5,"body":450,"category":163,"cover":164,"date":165,"description":166,"extension":167,"meta":553,"navigation":169,"path":170,"seo":554,"stem":172,"tags":555,"__hash__":177},{"type":7,"value":451,"toc":540},[452,454,462,464,472,474,480,482,488,490,496,498,504,506,512,514,520,522,528,530,536,538],[10,453,13],{"id":12},[15,455,456,21,458,25,460,30],{},[18,457,20],{},[18,459,24],{},[27,461,29],{},[10,463,34],{"id":33},[15,465,466,25,468,42,470,45],{},[18,467,20],{},[27,469,41],{},[18,471,24],{},[10,473,49],{"id":48},[15,475,476,54,478,57],{},[18,477,20],{},[18,479,24],{},[10,481,61],{"id":60},[15,483,484,66,486,69],{},[18,485,20],{},[18,487,24],{},[10,489,73],{"id":72},[15,491,492,78,494,81],{},[18,493,20],{},[18,495,24],{},[10,497,85],{"id":84},[15,499,500,90,502,93],{},[18,501,20],{},[18,503,24],{},[10,505,97],{"id":96},[15,507,508,102,510,105],{},[18,509,20],{},[18,511,24],{},[10,513,109],{"id":108},[15,515,516,114,518,117],{},[18,517,20],{},[18,519,24],{},[10,521,121],{"id":120},[15,523,524,126,526,129],{},[18,525,20],{},[18,527,24],{},[10,529,133],{"id":132},[15,531,532,138,534,141],{},[18,533,20],{},[18,535,24],{},[10,537,144],{"id":144},[15,539,147],{},{"title":149,"searchDepth":150,"depth":150,"links":541},[542,543,544,545,546,547,548,549,550,551,552],{"id":12,"depth":150,"text":13},{"id":33,"depth":150,"text":34},{"id":48,"depth":150,"text":49},{"id":60,"depth":150,"text":61},{"id":72,"depth":150,"text":73},{"id":84,"depth":150,"text":85},{"id":96,"depth":150,"text":97},{"id":108,"depth":150,"text":109},{"id":120,"depth":150,"text":121},{"id":132,"depth":150,"text":133},{"id":144,"depth":150,"text":144},{},{"title":5,"description":166},[174,175,176],1786005259838]