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