[{"data":1,"prerenderedAt":401},["ShallowReactive",2],{"project-admin-scaffold":3,"all-projects-nav":308,"project-posts-admin-scaffold":400},{"id":4,"title":5,"architecture":6,"body":7,"category":265,"client":266,"cover":267,"date":268,"demo":251,"demoMobile":6,"description":256,"extension":269,"featured":270,"features":271,"github":287,"manual":6,"meta":288,"modules":6,"navigation":289,"order":290,"path":291,"seo":292,"slug":293,"stem":294,"summary":295,"techStack":296,"visible":289,"year":306,"__hash__":307},"projects\u002Fprojects\u002Fadmin-scaffold.md","多端管理脚手架基座",null,{"type":8,"value":9,"toc":255},"minimark",[10,14,18,21,24,27,30,33,123,134,137,213,216,219,233,236,243],[11,12,13],"h2",{"id":13},"缘起",[15,16,17],"p",{},"几个管理系统做完，我回头看了一眼：登录、JWT、RBAC、操作日志、字典、Excel 导入导出，每个项目都重写了一遍，而且每一遍写得都不太一样。结果是同一个 bug 我要在三个仓库里各修一次，改一处响应格式要翻四份文档。",[15,19,20],{},"这套基座就是那次盘点剩下的东西。它不含任何业务，只装「每个管理系统都得有、且不该长得不一样」的那部分：协议、鉴权、权限、日志，加上把这几条钉死的护栏测试。新项目 clone 下来改个名字就能开工，业务模块从一份黄金范例生成，不用谁再凭记忆手抄一遍。",[11,22,23],{"id":23},"背景",[15,25,26],{},"管理系统之间的差异其实都在业务层，横切的那部分高度一致：controller \u002F service \u002F model 怎么分层，统一响应体和分页体长什么样，JWT 走哪个头，权限码按什么粒度落库，操作日志记哪些字段，菜单和字典怎么配，导入导出的模板从哪来。这些东西没有一份统一定义时，落到代码里就是四种写法，之后只能靠人去对齐。要沉淀的就是这一层：与业务无关、可复用，并且把约定写成违反即失败的检查，作为后续所有业务项目的起点。",[11,28,29],{"id":29},"方案",[15,31,32],{},"构建四端一体（Go 后端 + Web 前端 + 移动端 H5 + 微信小程序）的脚手架基座，四端共享同一套协议与工程铁律，并由架构护栏强制约束：",[34,35,36,52,62,71,80,86,100,114],"ul",{},[37,38,39,43,44,48,49],"li",{},[40,41,42],"strong",{},"统一响应协议","：",[45,46,47],"code",{},"{code, message, data}","，分页 ",[45,50,51],{},"{list, total, page, page_size}",[37,53,54,57,58,61],{},[40,55,56],{},"统一鉴权","：JWT（",[45,59,60],{},"Authorization: Bearer \u003Ctoken>","），401\u002F403 由前端拦截器统一处理",[37,63,64,67,68],{},[40,65,66],{},"RBAC 权限","：用户-角色-权限三级模型，受保护路由挂 ",[45,69,70],{},"PermissionRequired(\"\u003C资源>:\u003C动作>\")",[37,72,73,43,76,79],{},[40,74,75],{},"操作日志",[45,77,78],{},"OperationLogger"," 中间件自动记录受保护路由的操作与登录日志",[37,81,82,85],{},[40,83,84],{},"系统管理五件套","：用户 \u002F 角色 \u002F 权限 \u002F 字典 \u002F 操作日志，开箱即用",[37,87,88,91,92,95,96,99],{},[40,89,90],{},"品牌可配置","：config 的 ",[45,93,94],{},"app"," 段驱动四端登录页、标题与页脚，静态资源经 ",[45,97,98],{},"\u002Fapi\u002Fsystem\u002Finfo"," 下发",[37,101,102,105,106,109,110,113],{},[40,103,104],{},"架构护栏","：后端 ",[45,107,108],{},"internal\u002Fguard\u002F"," 与根 ",[45,111,112],{},"eslint.config.js"," 把铁律编译成「违反即测试 \u002F Lint 失败」的静态检查",[37,115,116,43,119,122],{},[40,117,118],{},"依赖登记制",[45,120,121],{},"deps.yaml"," 与各端清单双向校验，漏登记或僵尸条目即失败",[15,124,125,126,129,130,133],{},"新增业务模块无需手写骨架，",[45,127,128],{},"make gen name=\u003C模块>"," 从唯一范例 ",[45,131,132],{},"_example\u002F"," 生成全套骨架并自动接线。",[11,135,136],{"id":136},"技术架构",[138,139,140,153],"table",{},[141,142,143],"thead",{},[144,145,146,150],"tr",{},[147,148,149],"th",{},"模块",[147,151,152],{},"技术选型",[154,155,156,165,173,181,189,197,205],"tbody",{},[144,157,158,162],{},[159,160,161],"td",{},"后端",[159,163,164],{},"Go + Gin + GORM",[144,166,167,170],{},[159,168,169],{},"Web 前端",[159,171,172],{},"Vue3 + Element Plus + Pinia",[144,174,175,178],{},[159,176,177],{},"移动端",[159,179,180],{},"Vue3 + Vant + Pinia",[144,182,183,186],{},[159,184,185],{},"小程序端",[159,187,188],{},"uniapp + Vue3 + Pinia",[144,190,191,194],{},[159,192,193],{},"数据库",[159,195,196],{},"SQLite（WAL）\u002F MySQL 双驱动",[144,198,199,202],{},[159,200,201],{},"鉴权",[159,203,204],{},"JWT + RBAC 权限码两级中间件",[144,206,207,210],{},[159,208,209],{},"工程",[159,211,212],{},"Makefile 统一入口 + 架构护栏测试 + 依赖登记制",[15,214,215],{},"采用 controller → service → model 三层分层，默认值 → YAML → 环境变量三层配置，一键打包为单进程可部署形态（后端自动托管 Web 与移动端产物）。",[11,217,218],{"id":218},"成果",[15,220,221,222,225,226,228,229,232],{},"从企业固定资产管理系统中提炼出与业务无关的可复用横切能力，形成可运行的四端 monorepo 骨架：clone 后 ",[45,223,224],{},"make init name=my-system"," 一键改名即可开发新项目，",[45,227,128],{}," 从黄金范例生成业务模块，",[45,230,231],{},"make test\u002Flint\u002Fsmoke"," 靠护栏与冒烟证明「没改坏」。多个后续业务项目（公车管理、出租订单等）均基于此基座快速起盘，统一了协议、鉴权与工程约定。",[11,234,235],{"id":235},"体验",[15,237,238,239,242],{},"基座已部署，可在线体验（默认账号 ",[45,240,241],{},"admin \u002F admin123","）：",[34,244,245],{},[37,246,247,248],{},"在线体验：",[249,250,254],"a",{"href":251,"rel":252},"https:\u002F\u002Fbase.bennywen.xyz",[253],"nofollow","base.bennywen.xyz",{"title":256,"searchDepth":257,"depth":257,"links":258},"",2,[259,260,261,262,263,264],{"id":13,"depth":257,"text":13},{"id":23,"depth":257,"text":23},{"id":29,"depth":257,"text":29},{"id":136,"depth":257,"text":136},{"id":218,"depth":257,"text":218},{"id":235,"depth":257,"text":235},"toolkit","开源项目","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fadmin-scaffold\u002Fadmin-scaffold-hero.webp","2026-09-04","md",false,[272,275,279,283],{"title":273,"description":274,"image":267},"登录页 · 品牌可配置","四端登录页、标题与页脚由配置统一驱动，logo\u002F背景可换，开箱即用",{"title":276,"description":277,"image":278},"用户管理","用户 CRUD、启用\u002F禁用、密码重置、角色分配","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fadmin-scaffold\u002Fadmin-scaffold-users.webp",{"title":280,"description":281,"image":282},"权限管理 · RBAC 权限码","用户-角色-权限三级模型，权限码 `{资源:动作}` 幂等落库，新模块权限自动纳入","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fadmin-scaffold\u002Fadmin-scaffold-rbac.webp",{"title":284,"description":285,"image":286},"字典管理 · Excel 导入导出","字典类型 + 字典项维护，支持 Excel 导入 \u002F 导出 \u002F 下载模板","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fadmin-scaffold\u002Fadmin-scaffold-dict.webp","https:\u002F\u002Fgithub.com\u002FBenny66\u002Fadmin-scaffold",{},true,8,"\u002Fprojects\u002Fadmin-scaffold",{"title":5,"description":256},"admin-scaffold","projects\u002Fadmin-scaffold","开箱即用的多端管理脚手架基座——Go+Gin+GORM 后端，Vue3+Element Plus\u002FVant\u002Funiapp 三端，内置系统管理五件套与统一响应、JWT 鉴权、RBAC 权限、操作日志",[297,298,299,300,301,302,303,304,305],"Go","Gin","GORM","Vue3","Element Plus","Vant","UniApp","SQLite","MySQL","2026","EYr2YYi4WmthNUEsq8lTk_2zkW5x5KYPlmVE6up0WiI",[309,315,320,326,331,336,341,342,347,350,355,361,367,371,376,380,384,388,392,396],{"title":310,"slug":311,"order":312,"year":306,"date":313,"category":314},"图片工坊 · 离线批量图片处理","image-workshop",20,"2026-10-24","desktop",{"title":316,"slug":317,"order":318,"year":306,"date":319,"category":314},"Morrow · 桌面健康提醒","morrow",19,"2026-10-23",{"title":321,"slug":322,"order":323,"year":306,"date":324,"category":325},"家教学情管理系统","tutor-analytics",17,"2026-09-30","operations",{"title":327,"slug":328,"order":329,"year":306,"date":324,"category":330},"闲鱼素材工坊","xianyu-content-gen",18,"ai",{"title":332,"slug":333,"order":334,"year":306,"date":335,"category":330},"电商详情页 AI 生成客户端","ecom-detail-ai",16,"2026-09-29",{"title":337,"slug":338,"order":339,"year":306,"date":340,"category":265},"Wails 桌面端脚手架基座","wails-bailer-starter",15,"2026-09-15",{"title":5,"slug":293,"order":290,"year":306,"date":268,"category":265},{"title":343,"slug":344,"order":345,"year":306,"date":346,"category":325},"公车车辆管理系统","bus-admin-system",1,"2026-09-02",{"title":348,"slug":349,"order":257,"year":306,"date":346,"category":325},"设备出租订单管理系统","rental-order-manager",{"title":351,"slug":352,"order":353,"year":306,"date":354,"category":330},"家庭绿植管家","family-plant-manager",3,"2026-08-19",{"title":356,"slug":357,"order":358,"year":359,"date":360,"category":330},"古诗词AI取名工具","chinese-poetry-give-name",7,"2025","2026-06-22",{"title":362,"slug":363,"order":364,"year":359,"date":365,"category":366},"企业固定资产管理系统","asset-admin",4,"2026-06-16","admin",{"title":368,"slug":369,"order":370,"year":359,"date":365,"category":330},"知祖AI","kingpt",5,{"title":372,"slug":373,"order":374,"year":359,"date":365,"category":375},"深圳房产智能分析平台","sz-realestate",6,"data",{"title":377,"slug":378,"order":379,"year":359,"date":365,"category":366},"工厂轻量化智能排班系统","staff-scheduling",9,{"title":381,"slug":382,"order":383,"year":359,"date":365,"category":325},"电商服装仓库物流管理系统","clothing-warehouse",10,{"title":385,"slug":386,"order":387,"year":359,"date":365,"category":330},"知识库问答系统","kb-qa",11,{"title":389,"slug":390,"order":391,"year":359,"date":365,"category":366},"企业微信邮箱运营管理系统","mail-manager",12,{"title":393,"slug":394,"order":395,"year":359,"date":365,"category":325},"Switch 电玩库存管理系统","switch-manager",13,{"title":397,"slug":398,"order":399,"year":359,"date":365,"category":366},"学生宿舍管理系统","dorm-manager",14,[],1792857942280]