ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

零依赖HTML后台管理静态模板:从布局到上线的完整实践

零依赖HTML后台管理静态模板:从布局到上线的完整实践 简介面向Web开发者与后台系统搭建人群的HTML后台管理静态模板为中文版涵盖登录、首页、品牌管理、产品列表、订单、权限、用户、广告等常见业务模块能够帮助开发者跳过UI搭建聚焦后端逻辑与业务实现。包体共791个文件约10.36MB以HTML、CSS、JavaScript为核心配合png/jpg/gif等图片资源完成界面呈现另有少量服务端脚本与配置文件便于前后端联调参考。模板结构清晰页面模块完整可快速替换品牌信息并扩展新功能适合中小型管理系统、企业网站管理端及后台开发学习实践。目前已有1032人浏览学习适合有一定HTML/CSS基础、希望提高开发效率的初中级前端或全栈开发者。1. 看懂这个标题到底在卖什么方案第一次听到“HTML后台管理静态模板”这个说法你可能会觉得它土——都什么年代了后台不做成前后端分离的 SPA不用 Vue 或 React怎么还有人提纯静态 HTML但真到实际项目里你会发现静态后台模板的适用范围比想象中大得多。它不是一个完整的项目而是一整套“零依赖、能直开、能随手改”的后台界面骨架登录页、侧边栏、顶栏导航、表格列表、表单弹窗、统计卡片全部用原生 HTML 加一点点 CSS 和 JavaScript 拼出来拿到手放进任意 Web 服务器就能跑。适合谁用后端工程师不想为内部工具单独写前端、前端新手想先把布局和交互手感练熟、以及任何需要快速出管理界面原型的场景。这篇文章会把搭建这种模板的完整路径拆给你从文件结构、页面骨架到表格数据填充、表单校验和常见兼容性坑最后再补几个能让模板真正派上用场的小技巧。2. 为什么还要用静态后台模板这是一道成本计算题2.1 静态模板和 SPA 之间差的不是性能是工程成本在做技术选型之前先想清楚一个事实后台管理系统管理控制台通常是内部工具用户量是几十人并发是几十或几百没有 SEO 需求也没有复杂的客户端状态管理。这种场景下SPA 的前端框架确实强大但代价是工具链——Node 环境、构建打包、路由配置、组件库升级、依赖漏洞修复这些成本在一两个人的内部项目里会被无限放大。而静态模板的核心理念是把 HTML 文件本身当作应用页面切换靠a标签的跳转数据刷新靠刷新浏览器交互反馈靠几十行原生 JavaScript 就能完成。我见过不少团队明明只是要做一个设备登记后台却搭了 Vue 全家桶最后维护的人走了剩下的同事连npm run build都不敢按。反过来一个纯静态的admin.html加三个 CSS 文件和一个 JS 文件任何会 HTML 的人都能接手。这里的对比不是性能高下而是维护成本的天平倾向于哪边。你可以把静态模板理解成一个“零配置项目”不需要 Node、不需要 Webpack连http-server都可以不装直接双击文件也能跑通大部分功能——这也是它最大的落地优势。2.2 标准 HTML 骨架在这类模板里的份量静态模板并不意味着胡写一气。恰恰相反因为少了框架帮你擦屁股你对 HTML 的规范性要求反而要更高。热搜里反复出现!doctype html、html langzh-cn、meta charsetutf-8这些代码看起来是浏览器自动补全的模板头其实它们是后台管控界面的地基——langzh-cn影响浏览器的拼写检查和翻译插件行为meta charsetutf-8决定了你页面上所有中文是否能正常显示。我一般会建议模板里的每个页面文件都对齐这样的骨架而不是依赖浏览器的容错机制!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 meta http-equivX-UA-Compatible contentIEedge title设备管理后台/title link relstylesheet hrefcss/style.css /head body !-- 页面内容 -- script srcjs/common.js/script /body /html这里的几个参数各有讲究viewport是给平板缩放用的后台不一定只在 PC 上看X-UA-Compatible是给旧版浏览器尤其是 Windows 自带的 IE 内核文档模式看的强制使用最高版本内核渲染CSS放到head里是为了避免页面加载时的白屏闪烁JS放到body底部是为了避免脚本阻塞 DOM 解析。如果你后续想把模板里的某个页面嵌入到pyqt5的QWebEngineView里做桌面工具这套规范的骨架同时也能保证 Qt 的 Chromium 版本能正确识别编码和视口。2.3 静态后台模板的典型文件结构拿到手的静态后台模板无论是你下载的还是自己规划的文件结构应该清晰到一眼就能看懂。这是我比较推荐的组织方式适合大多数中小型内部后台admin-template/ ├── index.html # 登录页 / 或跳转到 dashboard ├── dashboard.html # 主工作台放统计卡片和最近动态 ├── pages/ │ ├── device-list.html # 列表页设备登记 │ ├── device-edit.html # 表单页新增/编辑设备 │ ├── user-list.html # 列表页用户管理 │ └── settings.html # 设置页 ├── css/ │ ├── style.css # 全局样式布局、按钮、表格、表单 │ └── theme-dark.css # 暗黑主题覆盖项可选 ├── js/ │ ├── common.js # 侧边栏展开收起、Toast 提示、通用工具 │ └── device-list.js # 列表页专属的数据渲染逻辑 └── assets/ ├── logo.svg └── 其他图片资源关键在于pages目录放业务页面css和js按全局和页面维度拆分而不是把每个页面的样式都写在style里。否则过了三个月你想改一个按钮颜色就得翻遍所有页面文件。这个结构也照顾了静态模板的“静态”属性——没有路由配置页面跳转就是a hrefpages/device-list.html所以文件之间的相对路径要提前规划好否则从index.html点到pages/下的页面CSS 路径容易全部失效这是一个非常容易翻车的细节。3. 把后台首页抄出来布局、侧边栏与顶栏的静态实现3.1 经典三栏布局的套路不是 Flex 就是 Grid后台管理界面的布局万变不离其宗左侧是导航菜单侧边栏、右侧上方是顶栏面包屑、用户信息、退出按钮、右侧下方是内容区。静态模板的 CSS 实现我一般用一个高度 100vh 的 Flex 容器来装整块布局避免出现页面滚动条和内容区滚动条互相打架的问题。下面是一个可以直接用的dashboard.html骨架!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title工作台 - 设备管理后台/title link relstylesheet hrefcss/style.css /head body div classlayout aside classsidebar idsidebar div classsidebar-logo img srcassets/logo.svg altlogo span设备管理/span /div ul classnav-menu li classnav-item activea hrefdashboard.html工作台/a/li li classnav-itema hrefpages/device-list.html设备登记/a/li li classnav-itema hrefpages/user-list.html用户管理/a/li li classnav-itema hrefpages/settings.html系统设置/a/li /ul /aside div classmain header classtopbar button idsidebarToggle classbtn-icon☰/button div classbreadcrumb首页 / 工作台/div div classuser-info span管理员/span a hrefindex.html退出/a /div /header main classcontent h2欢迎回来管理员/h2 !-- 统计卡片区域 -- /main /div /div script srcjs/common.js/script /body /html对应的style.css核心布局段是这样的* { margin: 0; padding: 0; box-sizing: border-box; } .layout { display: flex; height: 100vh; overflow: hidden; } .sidebar { width: 220px; background: #1e293b; color: #e2e8f0; display: flex; flex-direction: column; flex-shrink: 0; transition: width 0.2s ease; } .main { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .topbar { height: 56px; background: #ffffff; border-bottom: 1px solid #e2e8f0; display: flex; align-items: center; justify-content: space-between; padding: 0 16px; flex-shrink: 0; } .content { flex: 1; padding: 24px; overflow-y: auto; background: #f1f5f9; }这段代码里的参数值得细说height: 100vh是把视口高度定死配合.content的overflow-y: auto实现真正的“内容区滚动侧边栏和顶栏固定”的效果flex-shrink: 0是为了防止侧边栏在窄屏下被压缩变形transition: width 0.2s ease是为后面“点击按钮收起侧边栏”准备的动画过渡。不要小看box-sizing: border-box它是全局规则否则padding会把元素的实际宽度撑破导致布局“差几个像素”的白白浪费你一小时。3.2 侧边栏收起与展开的 JavaScript 逻辑静态模板的交互不是零 JS而是把 JS 精简到服务布局和基础交互这个层面。最常见的交互就是侧边栏的展开收起以及收起后菜单文字隐藏、只留下图标。在common.js里这样处理(function () { var sidebar document.getElementById(sidebar); var toggleBtn document.getElementById(sidebarToggle); var collapsed false; toggleBtn.addEventListener(click, function () { collapsed !collapsed; if (collapsed) { sidebar.classList.add(collapsed); } else { sidebar.classList.remove(collapsed); } }); // 点击菜单项时在移动端窄屏自动收起侧边栏 var menuLinks document.querySelectorAll(.nav-item a); Array.prototype.forEach.call(menuLinks, function (link) { link.addEventListener(click, function () { if (window.innerWidth 768) { sidebar.classList.add(collapsed); } }); }); })();这段代码注意两点第一用 IIFE 包裹是为了避免变量污染全局作用域因为后面device-list.js也会加载进来第二window.innerWidth 768的判断很关键窄屏下收起侧边栏是后台的默认操作否则内容区被压到只剩一个手机宽度表格和表单会完全没法看。同时CSS 里还需要配套的collapsed样式把width改为64px并隐藏.sidebar-logo span和.nav-item a的文字。如果你给模板加“记住收起状态”的功能可以在这段代码里加localStorage.setItem(sidebarCollapsed, collapsed)页面加载时再读出来——这算是最基础的状态持久化了。3.3 统计卡片用网格就能排得整齐后台首页的内容区总会放几张统计卡片总设备数、在线设备、今日告警等很多新手会用 Flex 再加margin来控制间距结果屏幕尺寸一变就挤成一团。我一般用 CSS Grid 一次性解决div classstat-grid div classstat-card div classstat-label总设备数/div div classstat-value idtotalDevices--/div /div div classstat-card div classstat-label在线设备/div div classstat-value idonlineDevices--/div /div div classstat-card div classstat-label今日告警/div div classstat-value idtodayAlerts--/div /div /div.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px; margin-bottom: 24px; } .stat-card { background: #fff; border-radius: 8px; padding: 20px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); } .stat-label { font-size: 14px; color: #64748b; margin-bottom: 8px; } .stat-value { font-size: 32px; font-weight: 600; color: #0f172a; }这里的repeat(auto-fit, minmax(240px, 1fr))是响应式的关键。它让 Grid 自动计算能放下多少个最小宽度为 240px 的卡片屏幕够宽就一行放四张不够就自动换行。你觉得这跟自己手动算百分比比好像差不多但遇到 1366px、1440px、1920px 这些常见分辨率Grid 的表现完美不需要任何媒体查询。这种写法在“HTML后台管理静态模板”里属于最实用的反直觉技巧明明没写一个media布局却自己适配了。4. 表格加表单撑起后台的真骨骼4.1 设备列表页用 JavaScript 渲染表格而不是在 HTML 里写死后台模板里最核心的页面就是列表页数据以表格形式展示支持搜索、分页、操作按钮编辑、删除、启用/禁用。直接在 HTML 里写死tr是最蠢的做法——数据一变你就得改 HTML。正确做法是HTML 里只放一个空的table容器数据由 JS 数组承接再动态生成表格行。这样以后对接真实接口时只需要把fetchData()里的数据源换掉就行。div classtable-wrapper div classtable-toolbar input typetext idsearchInput placeholder搜索设备名称 / 编号 button idaddDeviceBtn classbtn-primary新增设备/button /div table classdata-table thead tr th设备编号/th th设备名称/th th所属部门/th th状态/th th最近在线时间/th th操作/th /tr /thead tbody iddeviceTableBody !-- 数据由 JS 渲染 -- /tbody /table /div对应的device-list.js的核心逻辑(function () { // 模拟数据后续替换成 fetch(/api/devices) var mockData [ { id: DEV-001, name: 打印机-前台, dept: 行政部, status: online, time: 2024-05-20 09:30 }, { id: DEV-002, name: 扫描仪-财务, dept: 财务部, status: offline, time: 2024-05-19 18:02 }, { id: DEV-003, name: 路由器-机房, dept: 信息中心, status: online, time: 2024-05-20 10:15 } ]; var tbody document.getElementById(deviceTableBody); function renderTable(data) { var html ; data.forEach(function (item) { var statusText item.status online ? 在线 : 离线; var statusClass item.status online ? tag-green : tag-gray; html tr td item.id /td td item.name /td td item.dept /td tdspan classtag statusClass statusText /span/td td item.time /td td a hrefdevice-edit.html?id item.id classbtn-link编辑/a button classbtn-link btn-danger>form iddeviceForm classform-panel novalidate div classform-group label fordeviceId设备编号/label input typetext iddeviceId namedeviceId placeholder例如 DEV-1001 span classerror-msg iddeviceIdError/span /div div classform-group label fordeviceName设备名称/label input typetext iddeviceName namedeviceName placeholder请输入设备名称 span classerror-msg iddeviceNameError/span /div div classform-group label fordept所属部门/label select iddept namedept option value请选择部门/option option value行政部行政部/option option value财务部财务部/option option value信息中心信息中心/option /select span classerror-msg iddeptError/span /div div classform-actions button typesubmit classbtn-primary保存/button button typebutton idcancelBtn classbtn-default取消/button /div /formnovalidate属性很关键它关掉了浏览器原生气泡提示那个丑而且不可定制的弹层把校验交给 JS 统一处理。对应的校验逻辑(function () { var form document.getElementById(deviceForm); var idInput document.getElementById(deviceId); var nameInput document.getElementById(deviceName); var deptSelect document.getElementById(dept); function setError(input, errorEl, message) { errorEl.textContent message; input.classList.add(input-error); } function clearError(input, errorEl) { errorEl.textContent ; input.classList.remove(input-error); } form.addEventListener(submit, function (e) { e.preventDefault(); // 阻止真正的提交 var valid true; var idPattern /^[A-Za-z0-9-]{3,20}$/; if (!idPattern.test(idInput.value.trim())) { setError(idInput, document.getElementById(deviceIdError), 编号需为3-20位字母、数字或短横线); valid false; } else { clearError(idInput, document.getElementById(deviceIdError)); } if (nameInput.value.trim().length 2) { setError(nameInput, document.getElementById(deviceNameError), 设备名称至少2个字符); valid false; } else { clearError(nameInput, document.getElementById(deviceNameError)); } if (!deptSelect.value) { setError(deptSelect, document.getElementById(deptError), 请选择所属部门); valid false; } else { clearError(deptSelect, document.getElementById(deptError)); } if (valid) { // 正式环境改为表单提交或 fetch POST showToast(保存成功静态模板模拟); setTimeout(function () { window.location.href device-list.html; }, 800); } }); })();正则^[A-Za-z0-9-]{3,20}$里的{3,20}是长度约束^和$是锚定字符防止用户输入“DEV-1001 ”这种带空格的内容被放过去。注意e.preventDefault()的位置——它必须放在submit监听器里并且不需要判断表单是否合法就执行因为浏览器默认的表单提交会跳转页面你要么阻止它要么就得设置成action配合methodpost而静态模板里没有后端来处理这个请求。所以只要用静态模板preventDefault是铁定的除非你的表单是发给第三方接口。4.3 表格与表单的样式参数间距、对齐、边框选对才有质感后台模板好不好看七成在表格和表单的细节参数上。行高、内边距、边框颜色、表头背景色这些参数微调一下整体观感立刻从“练习页面”变成“能交付的内部系统”。我从不会在这部分含糊.data-table { width: 100%; border-collapse: collapse; background: #fff; } .data-table th { padding: 12px 16px; text-align: left; font-weight: 600; color: #475569; background: #f8fafc; border-bottom: 2px solid #e2e8f0; white-space: nowrap; } .data-table td { padding: 10px 16px; border-bottom: 1px solid #f1f5f9; } .data-table tbody tr:hover { background: #f8fafc; } .form-panel { background: #fff; padding: 24px; border-radius: 8px; max-width: 640px; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 6px; font-weight: 500; color: #334155; } .form-group input, .form-group select { width: 100%; padding: 8px 12px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 14px; } .form-group input:focus, .form-group select:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .input-error { border-color: #ef4444 !important; } .error-msg { color: #ef4444; font-size: 12px; margin-top: 4px; display: block; }border-collapse: collapse解决的是表格双边框问题不设的话th和td的边框会叠加成视觉上的粗线。focus状态用box-shadow外发光而不是单纯改边框颜色是因为只改border-color会让输入框“跳一下”变粗视觉上很廉价。错误信息的display: block是为了让它独占一行不会和输入框挤在一起。这些参数你可以按自己的审美调色但结构上别砍——它们就是后台模板的行业“通用语义”。5. 避坑与排查静态后台模板翻车的 5 个常见场景5.1 双击打开 HTML 文件一切正常放在服务器上样式全丢现象本地直接双击dashboard.html打开页面完整上传到服务器后只剩文字没有排版和颜色。原因文件结构变了。本地双击时浏览器以文件系统路径解析相对路径上传服务器后如果你的目录结构是html/下直接放页面而 CSS 在assets/css/下路径写错就必然 404。更隐蔽的情况是大小写不对Linux 服务器严格区分Style.css和style.css本地 Windows 不区分。解决先按 F12 打开开发者工具切到 Network 面板刷新页面看 CSS 文件的状态码。如果不是 200就去检查link的href路径并确认文件名大小写。经验法则所有路径都建议用相对路径./css/style.css或绝对路径/static/css/style.css不要在页面文件里写file:///开头的本地路径。5.2 表单加了 required但提交时浏览器没有任何反应现象input required放在了表单里点提交按钮不弹提示也没有阻止提交。原因按钮类型不是submit。在 HTML 里button保存/button的默认类型就是submit但你如果写的是button typebutton保存/button原生校验就不会触发因为浏览器只对“提交”行为做检查。另外如果你的表单里有多个按钮第一个按钮默认是submit第二个就会变成“回车提交”的触发源这也是你意想不到的翻车点。解决想用原生校验按钮用button typesubmit想自定义校验表单加novalidate按钮保持typesubmit在submit事件里写preventDefault。不要把按钮设置成typebutton再手动绑click去校验——那是绕弯路而且键盘回车时表单直接在没有任何反馈的情况下“消失”了数据却没保存。5.3 表格数据渲染出来了搜索功能却失效现象打开设备列表页表格加载正常在搜索框输入文字过滤后的数据没变或者直接报e.target.value is undefined的错误。原因input事件监听对象绑错了。常见是把监听绑到了document上然后用e.target.value取输入值但用户点的是搜索按钮而不是输入框或者你在DOMContentLoaded之前就绑定了事件此时getElementById返回null后面的addEventListener直接抛异常。解决先把事件监听放在 IIFE 里面并且确保脚本在 DOM 底部加载参考第 3 章的/body前引入然后明确document.getElementById(searchInput).addEventListener(input, ...)。如果监听的对象不是输入框而是按钮就用click事件并且用document.getElementById(searchInput).value来读取内容。另外要注意过滤条件里的toLowerCase()也要作用在搜索关键字上但indexOf返回 0 时是合法命中别写成了if (!indexOf)。5.4 中文内容出现乱码或者显示成菱形问号现象页面标题和表格里的中文全是测试或者锟斤拷。原因文件本身的编码不是 UTF-8但meta声明了 UTF-8。最常见的是你用 Windows 自带的记事本保存的 HTML记事本默认编码是 GBK而 HTML 头声明了charsetutf-8——两边对不上。另一个场景是你用第三方工具把 HTML 转成其他格式比如html格式转换wps表格转换过程和原文件丢失了编码声明。解决用 VS Code 或任何现代编辑器重新打开文件右下角状态栏能看到当前文件编码点击后选择“通过编码重新打开”选 UTF-8另存为 UTF-8 格式。如果你在做后端渲染把 HTML 当模板输出还要确认服务端的Content-Type里有charsetutf-8否则以 HTTP 响应头为准会覆盖 HTML 头里的声明。这个问题的排查优先级高于所有其他样式问题因为编码乱掉整个页面相当于报废。5.5 页面在 Google Chrome 正常在某个老浏览器上布局稀碎现象同一个dashboard.htmlChrome 里完美换到 IE 11 或旧版 Edge 就侧边栏掉到页面顶部、Grid 不生效。原因display: grid和flex的某些属性在旧浏览器里不支持或部分支持。比如gap属性在 Flex 布局里是相对新的特性旧浏览器完全忽略间距全部归零。解决先想清楚这个后台的浏览器访问基线是什么。内部工具如果允许用户用 Chrome就直接放弃对 IE 的兼容省下的时间投入在功能上如果必须兼容老浏览器就不要用Grid的gap改用margin实现间距Flex 布局用justify-content: space-between来腾出空间。静态模板的“静态”也意味着测试成本低——可以快速在不同浏览器里打开验证没有构建步骤不需要打包前加上多余的babel转译。6. 让模板更进一步从能看能用走向能上线6.1 离线缓存策略静态模板也能秒开HTML后台管理静态模板不需要任何框架最近热词里的“ubuntu的html编辑器”“html邮件”“打包多个html”都指向一个现实应用场景其实比想象中宽泛。一个特别值得做的进阶是给模板加离线缓存做法不是 PWA 那种复杂的 Service Worker而是利用浏览器 HTTP 缓存# Apache 环境下的静态资源缓存配置 IfModule mod_expires.c ExpiresActive On ExpiresByType text/css access plus 7 days ExpiresByType application/javascript access plus 7 days ExpiresByType image/svgxml access plus 30 days /IfModule这样用户第一次打开后CSS 和 JS 在 7 天内不会再发起网络请求页面刷新基本是无感秒开。注意如果你改了 CSS 里某个颜色用户那边却看不到更新那是缓存生效了——解决方法不是清掉缓存规则而是给 CSS 文件加版本查询参数link relstylesheet hrefcss/style.css?v20240520。版本一变浏览器视为新 URL重新拉取。这是最基础的加版本号技巧静态模板里特别实用。6.2 多页面公共部分的维护导航改了要全站同步怎么办这是静态模板最痛的一个点你有 5 个页面每个页面都有一个相同的侧边栏改了菜单名称就要打开 5 个文件去改。两个可行方案一是把公共部分复制到所有文件缺点是维护量线性增长二是用构建工具或模板语法——这是把静态模板引入工程化方向的折中。但如果你只想保持“0 构建”的纯粹性也有一个小技巧把公共 HTML 存成一个common.js在页面里动态注入。// common.js 里追加导航注入逻辑 document.addEventListener(DOMContentLoaded, function () { var sidebarHtml aside classsidebar ... /aside; var container document.getElementById(layoutRoot); if (container) { container.insertAdjacentHTML(afterbegin, sidebarHtml); } });需要在每个页面的div classlayout上加一个idlayoutRoot。这样导航 HTML 只维护一份缺点是闪现——页面加载瞬间没有侧边栏。所以不要优先选这种方式只有在“完全不想加构建工具、又必须改一处处”的时候才用。我个人的习惯是超过 6 个页面且导航复杂度高直接上EJS模板加一个简单的 Node 脚本去生成静态文件只有 2、3 个页面复制粘贴也够用。关键是别在一个项目里混用两种方式。6.3 从静态模板到前后端对接接口预留是唯一的逃生通道静态模板最终大概率要面对真实数据。最平滑的路径是在模板里统一封装一个request函数所有页面都走它而不是到处写fetch。// js/request.js function apiRequest(url, method, data) { var options { method: method || GET, headers: { Content-Type: application/json } }; if (data) { options.body JSON.stringify(data); } return fetch(url, options).then(function (response) { if (!response.ok) { throw new Error(HTTP response.status); } return response.json(); }); }然后device-list.js里的mockData就换成apiRequest(/api/devices, GET).then(function (data) { renderTable(data.data || []); }).catch(function (err) { showToast(加载设备列表失败: err.message); });这个封装让所有页面结构不变未来换后端时只需要保证接口返回的 JSON 格式一致。我常被人问“那静态模板不是还得配个后端才能跑吗”答案是能。静态模板是前端那层壳你完全可以把它和任何后端语言Java、Go、Node、Python 的 Flask配对后端只负责输出 JSON前端模板负责渲染。还有一个小众但常见的用法把HTML后台管理静态模板嵌入到桌面工具里比如pyqt5显示html技术在桌面端展示一个基于静态模板的管理页面这样跨平台、零依赖的 UI 方案在嵌入式场景里非常能打。最后说个我自己踩过的坑以前我做内部后台时总想把模板做得“完整一点”提前上了前端框架结果项目还没上线框架已经升级了一次大版本旧代码被迫跟着折腾升级。后来再做类似的内部工具我只用纯静态 HTML 模板先把页面的信息架构跑通再决定要不要工程化。如果你也是一个人扛一个后台先把本篇这套壳子搭好留着接口后面接数据只是时间问题。希望帮到你。本文还有配套的精品资源点击获取
返回列表