<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yuntian001</title>
    <description>The latest articles on DEV Community by yuntian001 (@yuntian001).</description>
    <link>https://dev.to/yuntian001</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4214469%2Fb6d87f15-6498-4c1d-aaea-3b12999ad4d1.jpg</url>
      <title>DEV Community: yuntian001</title>
      <link>https://dev.to/yuntian001</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuntian001"/>
    <language>en</language>
    <item>
      <title>Solo dev stack: why I build admin systems with full-stack Node.js and a framework with fixed conventions</title>
      <dc:creator>yuntian001</dc:creator>
      <pubDate>Thu, 29 Oct 2026 06:28:28 +0000</pubDate>
      <link>https://dev.to/yuntian001/solo-dev-stack-why-i-build-admin-systems-with-full-stack-nodejs-and-a-framework-with-fixed-4p3g</link>
      <guid>https://dev.to/yuntian001/solo-dev-stack-why-i-build-admin-systems-with-full-stack-nodejs-and-a-framework-with-fixed-4p3g</guid>
      <description>&lt;h2&gt;
  
  
  Some context
&lt;/h2&gt;

&lt;p&gt;I build a lot of admin systems — client work and my own projects. They all share the same traits: &lt;strong&gt;tight deadlines, changing requirements, and usually just me on the keyboard.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After years of trial and error, the setup that works best for me is &lt;strong&gt;full-stack Node.js + a framework with fixed conventions&lt;/strong&gt;. Here's why, and what I built around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical benefits of full-stack Node.js
&lt;/h2&gt;

&lt;p&gt;Not theory — things I actually feel day to day:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One person can carry the whole project.&lt;/strong&gt; Vue on the frontend, Node on the backend, one language. I write an endpoint and immediately wire up the page for it. No context switching between two languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared types.&lt;/strong&gt; With TypeScript on both ends, the API's field types are the same types the frontend uses. Backend changes a field, the frontend build fails and tells you where. No comparing against API docs by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No integration meetings.&lt;/strong&gt; When you write both ends, you decide what the API looks like. Integration cost is basically zero — anyone who has done frontend/backend coordination knows how much time that saves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hiring is easier.&lt;/strong&gt; If the project grows, half the people who know Vue can pick up Node quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full-stack alone isn't enough — you need fixed conventions
&lt;/h2&gt;

&lt;p&gt;Node full-stack solves the &lt;em&gt;language&lt;/em&gt; problem. But there's another one: &lt;strong&gt;every project rebuilds the same plumbing&lt;/strong&gt; — directory layout, permissions, list pages, menu config. It's roughly the same every time, yet you redesign it every time. It wastes time, and the designs drift, so your own old projects feel foreign six months later.&lt;/p&gt;

&lt;p&gt;So I turned my own way of working into &lt;strong&gt;Me-Admin&lt;/strong&gt; — the conventions and common features are already decided:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed directory structure and layering; every module looks identical&lt;/li&gt;
&lt;li&gt;Built-in RBAC (menu / button / API levels), users, roles, menus — ready out of the box&lt;/li&gt;
&lt;li&gt;The stuff admin panels always need — lists, search, pagination, forms, uploads — already has components and established patterns&lt;/li&gt;
&lt;li&gt;Mainstream stack: Midway 3 + Sequelize + PostgreSQL on the backend, Vue 3 + Vite + Element Plus + vxeTable on the frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest time-saver: &lt;strong&gt;define an entity, run two commands, get a whole module.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sync the database schema&lt;/span&gt;
pnpm &lt;span class="nb"&gt;exec &lt;/span&gt;meadmin &lt;span class="nb"&gt;sync &lt;/span&gt;product

&lt;span class="c"&gt;# Generate controller, API, frontend pages, menu permissions&lt;/span&gt;
pnpm &lt;span class="nb"&gt;exec &lt;/span&gt;meadmin crud product &lt;span class="nt"&gt;--menu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Refresh the admin panel and the module is in the menu — full CRUD working. The output is plain source code in your repo, no black boxes. Edit it directly.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/meadmin-cn" rel="noopener noreferrer"&gt;
        meadmin-cn
      &lt;/a&gt; / &lt;a href="https://github.com/meadmin-cn/meadmin" rel="noopener noreferrer"&gt;
        meadmin
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Me-Admin 是一个免费开源的nodejs + vue 全栈一站式中后台解决方案,后端基于medwayjs ,前台基于vue3构建，开箱即用。本项目采用最宽松的MIT协议，最新技术栈，助力你快速创建企业级web中后台项目。
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Me-Admin&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@meadmin/cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0861f27c82c619470861542fdcea09a1b6766c61c1aae519edcea13174ff03de/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406d6561646d696e2f636f7265" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/meadmin-cn/meadmin/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://nodejs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/670e32ee5d36d41cf2c7662d999927110e48e7368545e189ae62fa39290675c1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d25334525334432322e31342d626c7565" alt="Node.js"&gt;&lt;/a&gt;
&lt;a href="https://github.com/meadmin-cn/meadmin/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/74834beda65ee78ba6f55296c4a773bd42fc2fd06f3980667cd25c40a5926448/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d6561646d696e2d636e2f6d6561646d696e3f7374796c653d736f6369616c" alt="GitHub stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/meadmin-cn/meadmin/README_EN.md" rel="noopener noreferrer"&gt;English&lt;/a&gt; | &lt;a href="https://github.com/meadmin-cn/meadmin/README.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/meadmin-cn/meadmin/docs/assets/crud-demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmeadmin-cn%2Fmeadmin%2FHEAD%2Fdocs%2Fassets%2Fcrud-demo.gif" alt="Me-Admin 一键 CRUD 演示" width="820"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/meadmin-cn/meadmin/docs/assets/admin-dashboard.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmeadmin-cn%2Fmeadmin%2FHEAD%2Fdocs%2Fassets%2Fadmin-dashboard.png" alt="Me-Admin 仪表盘" width="820"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/meadmin-cn/meadmin/docs/assets/admin-list.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmeadmin-cn%2Fmeadmin%2FHEAD%2Fdocs%2Fassets%2Fadmin-list.png" alt="Me-Admin 一键 CRUD 列表" width="49%"&gt;&lt;/a&gt;
  &amp;nbsp;
  &lt;a rel="noopener noreferrer" href="https://github.com/meadmin-cn/meadmin/docs/assets/rbac-config.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmeadmin-cn%2Fmeadmin%2FHEAD%2Fdocs%2Fassets%2Frbac-config.png" alt="Me-Admin 菜单权限（RBAC）" width="49%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;全栈一站式解决方案&lt;/strong&gt; —— Me-Admin 是一个免费开源的 Node.js + Vue 全栈中后台框架，后端基于 Midway.js 3，前端基于 Vue 3，一键 CRUD、SSR 渲染、权限体系开箱即用。MIT 协议，无加密、无授权限制，可商用。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 官网：&lt;a href="https://www.meadmin.cn" rel="nofollow noopener noreferrer"&gt;https://www.meadmin.cn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 文档：&lt;a href="https://www.meadmin.cn/aon/doc/" rel="nofollow noopener noreferrer"&gt;https://www.meadmin.cn/aon/doc/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 问题反馈：&lt;a href="https://github.com/meadmin-cn/meadmin/issues" rel="noopener noreferrer"&gt;https://github.com/meadmin-cn/meadmin/issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;30 秒生成一个业务模块&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;定义好 Sequelize 实体之后，只需两条命令：&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 同步数据库结构&lt;/span&gt;
pnpm &lt;span class="pl-c1"&gt;exec&lt;/span&gt; meadmin sync exampleDemo

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 一键生成：控制器、接口、前端页面、菜单权限&lt;/span&gt;
pnpm &lt;span class="pl-c1"&gt;exec&lt;/span&gt; meadmin crud exampleDemo --menu&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;meadmin 由 &lt;code&gt;@meadmin/cli&lt;/code&gt; 提供命令行入口，统一通过 &lt;code&gt;pnpm exec meadmin &amp;lt;命令&amp;gt;&lt;/code&gt; 调用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;刷新后台，菜单已经出现——列表、搜索、分页、增删改查、接口与菜单权限全部就位。生成的都是可读可改的源码，后续业务直接在上面写，没有黑盒。&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;主要特性&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一键 CRUD&lt;/strong&gt;：命令行一键生成控制器、模型、视图与菜单权限，重复工作交给框架&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR · CSR 混合渲染&lt;/strong&gt;：前台 SSR 提升 SEO 与首屏速度，后台 CSR 保证交互体验&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;内置权限系统&lt;/strong&gt;：RBAC 权限模型开箱即用，菜单、按钮、接口三级管控；支持无限父子级分组与自由授权，管理员可跨组别；动态路由权限方案，支持按钮级权限，前端菜单与接口动态获取两种模式&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;插件化架构&lt;/strong&gt;：功能以插件形式自由安装卸载，生态持续扩展，系统保持精简&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;全 TypeScript&lt;/strong&gt;：自动生成 TS 类型，前后端契约免维护&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;组件自动按需引入&lt;/strong&gt;：自动按需引入 components 下的组件定义，支持自定义引入位置和模式，真正的按需引入&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;友好的国际化&lt;/strong&gt;：前端支持按组件异步加载语言包&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;自定义 keepAlive&lt;/strong&gt;：可按 key 进行 vue keep-alive，解决不同路由统一组件不能独立刷新缓存的问题&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可配置主题&lt;/strong&gt;：主题色与主题模式均可配置&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;集成 vxeTable&lt;/strong&gt;：功能最完善的 Vue 表格组件&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;技术栈&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;层&lt;/th&gt;

&lt;th&gt;技术&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;计算层&lt;/td&gt;

&lt;td&gt;Vue 3 · Vite · TypeScript · Pinia · Element Plus · vue-request@next&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;服务层&lt;/td&gt;

&lt;td&gt;Node.js · Midway.js 3.x · Sequelize 7&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;存储层&lt;/td&gt;

&lt;td&gt;PostgreSQL · Redis&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;快速启动&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;依赖环境&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL 数据库&lt;/li&gt;
&lt;li&gt;Redis 缓存数据库&lt;/li&gt;
&lt;li&gt;Node.js &amp;gt;= 22.14.0&lt;/li&gt;
&lt;li&gt;pnpm&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;初始化项目&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pnpm create meadminjs@latest&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;根据提示配置数据库等选项即可。&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;调试项目&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pnpm dev&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;&lt;li&gt;…&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/meadmin-cn/meadmin" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;
  
  
  Works for agile sprints, works for AI coding too
&lt;/h2&gt;

&lt;p&gt;Two situations where this setup really pays off:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deadline-driven agile work.&lt;/strong&gt; Requirement comes in → define the entity → run the commands → the basics are done. All remaining time goes to actual business logic. Requirement changes? Update the entity and regenerate, or just edit the generated code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-assisted coding.&lt;/strong&gt; This is my biggest takeaway from the past year. Because the framework's conventions are fixed and every module has the same shape, &lt;strong&gt;AI writes noticeably more accurate code by copying existing modules&lt;/strong&gt;. Even more direct: I have the AI write the entity definition (describe the table's fields), which it does fast and well, then the commands generate the module. The only AI output I need to review is that one entity file — a few dozen lines, checked at a glance. Everything else is identical generator output.&lt;/p&gt;

&lt;p&gt;Simple truth: the more fixed the conventions, the smoother the work — whether a human or an AI is writing it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm create meadminjs@latest
pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Admin panel at &lt;a href="http://127.0.0.1:7001/admin" rel="noopener noreferrer"&gt;http://127.0.0.1:7001/admin&lt;/a&gt; (admin / meAdmin#202507!P). MIT licensed, use it for anything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/meadmin-cn/meadmin" rel="noopener noreferrer"&gt;https://github.com/meadmin-cn/meadmin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://www.meadmin.cn" rel="noopener noreferrer"&gt;https://www.meadmin.cn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.meadmin.cn" rel="noopener noreferrer"&gt;https://www.meadmin.cn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions → open an issue, I answer all of them: &lt;a href="https://github.com/meadmin-cn/meadmin/issues" rel="noopener noreferrer"&gt;https://github.com/meadmin-cn/meadmin/issues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it saves you time, a star means a lot: &lt;a href="https://github.com/meadmin-cn/meadmin" rel="noopener noreferrer"&gt;https://github.com/meadmin-cn/meadmin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>vue</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
