第63篇【终极整合巨作】从零手写原生中后台管理系统|整合62篇全部前端知识点|从头到尾完整架构+全功能逻辑
前言为什么写这一篇前面62篇我们从零学完了布局、CSS、原生JS、ES6、异步、事件循环、网络协议、浏览器原理、工程化、Vue3、TS、WebSocket、权限系统、Git、微前端、性能优化、手写源码、BUG排查、面试话术。但是知识点是分散的。这一篇我把全部前端能力从头到尾串联成一个完整可上线的企业级项目。不用Vue、不用框架、不用脚手架。纯 HTML CSS 原生JS 手写全套中后台系统包含架构设计、工具封装、网络层、权限层、路由层、状态层、业务层、组件层、全局拦截、异常处理、性能优化、团队规范。学完这一篇你就真正拥有「完整前端工程思维」一、项目整体架构设计工程化思维落地1.1 项目技术栈原生 HTML5 CSS3 JavaScriptES6少量 jQuery 简化DOM操作不影响原生思想全程手写架构、手写路由、手写权限、手写状态管理、手写工具库1.2 项目包含所有核心业务能力用户登录、Token 鉴权、过期拦截、本地持久化全局请求拦截器、响应拦截器、统一报错处理前端权限体系角色权限、动态菜单、按钮权限原生 Hash 路由系统手写无框架路由全局状态管理手写简易Pinia/Vuex思想工具库防抖、节流、深拷贝、时间格式化、数据处理通用组件弹窗、提示、分页、表单校验、图片上传预览业务页面首页看板、用户管理、新增编辑删除、分页查询全局BUG处理、空数据处理、重排重绘优化、内存优化完整团队Git规范、项目目录规范、代码规范1.3 标准工程化目录结构企业级admin-project/ ├─ login.html # 登录页 ├─ index.html # 主布局框架 ├─ css/ │ └─ global.css # 全局样式、重置、布局、组件样式 ├─ js/ │ ├─ router.js # 手写路由系统 │ ├─ permission.js # 权限系统 │ ├─ store.js # 全局状态管理 │ ├─ request.js # 网络请求拦截层 │ ├─ utils.js # 工具函数库 │ ├─ components.js # 通用组件 │ └─ pages/ # 所有业务页面逻辑 └─ lib/ # 第三方库二、全局工具库封装整合ES6、性能优化、手写源码所有项目高频工具统一封装全局复用。包含高阶防抖、高阶节流、深拷贝、时间格式化、空值处理、数据格式化// js/utils.js const Utils { // 高阶防抖支持立即执行、手动取消 debounce(fn, delay 300, immediate false) { let timer null const handler function(...args) { if (timer) clearTimeout(timer) if (immediate !timer) { fn.apply(this, args) } timer setTimeout(() { if (!immediate) fn.apply(this, args) timer null }, delay) } // 手动取消防止内存泄漏 handler.cancel () { clearTimeout(timer) timer null } return handler }, // 高阶节流固定频率执行 throttle(fn, delay 300) { let lastTime 0 let timer null const handler function(...args) { const now Date.now() if (now - lastTime delay) { lastTime now fn.apply(this, args) } else if (!timer) { timer setTimeout(() { lastTime Date.now() fn.apply(this, args) timer null }, delay) } } handler.cancel () { clearTimeout(timer) timer null lastTime 0 } return handler }, // 深拷贝解决引用类型赋值问题 deepClone(obj) { if (obj null || typeof obj ! object) return obj const res Array.isArray(obj) ? [] : {} for (let key in obj) { if (obj.hasOwnProperty(key)) { res[key] this.deepClone(obj[key]) } } return res }, // 时间格式化 formatTime(time) { const d new Date(time) const y d.getFullYear() const m String(d.getMonth() 1).padStart(2, 0) const day String(d.getDate()).padStart(2, 0) return ${y}-${m}-${day} } } window.Utils Utils三、本地存储封装持久化解决方案解决页面刷新数据丢失、Pinia/Vuex持久化原理手写实现。// js/storage.js const Storage { // 普通存储 set(key, value) { localStorage.setItem(key, JSON.stringify(value)) }, get(key) { const val localStorage.getItem(key) return val ? JSON.parse(val) : null }, // 敏感数据加密存储简单base64 setToken(key, value) { const encodeStr btoa(JSON.stringify(value)) localStorage.setItem(key, encodeStr) }, getToken(key) { const val localStorage.getItem(key) if (!val) return null return JSON.parse(atob(val)) }, remove(key) { localStorage.removeItem(key) }, clear() { localStorage.clear() } } window.Storage Storage四、全局状态管理手写简易Pinia整合全局用户信息、Token、角色、权限、全局数据。原理和Pinia完全一致集中式状态、初始化、持久化、统一修改// js/store.js const Store { // 全局状态 state: { token: , role: , permission: [], userInfo: {} }, // 页面刷新初始化数据 init() { const cache Storage.getToken(userState) if (cache) { this.state.token cache.token this.state.role cache.role this.state.permission cache.permission this.state.userInfo cache.userInfo } }, // 登录后设置用户信息 setUserState(data) { this.state.token data.token this.state.role data.role this.state.permission data.permission this.state.userInfo data.userInfo Storage.setToken(userState, this.state) }, // 退出登录清空状态 logout() { this.state { token: , role: , permission: [], userInfo: {} } Storage.clear() window.location.href login.html }, // 判断是否登录 isLogin() { return !!this.state.token } } // 初始化 Store.init() window.Store Store五、网络请求封装整合HTTP/HTTPS原理、拦截器、全局异常整合前面HTTP协议、状态码、跨域、401过期、全局请求统一处理。// js/request.js const Request { baseUrl: , // 统一请求入口 async fetch(options) { const { url, method GET, data {} } options const header { Content-Type: application/json } // 携带Token if (Store.state.token) { header.Authorization Bearer ${Store.state.token} } try { const res await fetch(this.baseUrl url, { method, headers: header, body: method GET ? null : JSON.stringify(data) }) const result await res.json() // 401 Token过期拦截 if (result.code 401) { alert(登录已过期请重新登录) Store.logout() return } return result } catch (err) { alert(网络请求异常) console.error(请求错误, err) } }, get(url, data) { return this.fetch({ url, method: GET, data }) }, post(url, data) { return this.fetch({ url, method: POST, data }) } } window.Request Request六、权限系统完整实现页面权限 按钮权限整合前面企业级权限体系、动态路由、角色判断原理。// js/permission.js const Permission { // 判断页面权限 hasPagePermission(role) { const myRole Store.state.role return myRole admin || myRole role }, // 判断按钮权限 hasBtnPermission(key) { const list Store.state.permission return list.includes(key) }, // 动态渲染按钮权限 initBtnPermission() { // 所有带权限标识的按钮 const btns document.querySelectorAll([data-perm]) btns.forEach(btn { const perm btn.getAttribute(data-perm) if (!this.hasBtnPermission(perm)) { btn.style.display none } }) } } window.Permission Permission七、手写原生路由系统Hash路由不用Vue Router原生手写路由理解前端路由底层原理。// js/router.js const Router { routes: { /home: pages/home.html, /user: pages/user.html }, // 初始化路由监听 init() { window.addEventListener(hashchange, () this.render()) this.render() }, // 渲染页面 render() { let hash window.location.hash.slice(1) || /home if (!this.routes[hash]) { hash /home } // 权限拦截 if (!Store.isLogin()) { window.location.hash /login return } // 加载页面 this.loadPage(this.routes[hash]) }, // 加载html页面 async loadPage(path) { const res await fetch(path) const html await res.text() document.getElementById(mainContent).innerHTML html // 每次页面渲染后重新初始化按钮权限 Permission.initBtnPermission() } } Router.init() window.Router Router

相关新闻

三年没人维护的 AI 派蒙,我把它重新救活了

三年没人维护的 AI 派蒙,我把它重新救活了

Digital Life Server Refactored:让 AI 派蒙重新运行,并支持现代 LLM 项目简介 Digital Life Server Refactored 是一个基于原版 Digital Life Server 的重构与维护项目,目标是在保留原有功能的基础上,使整个项目重新适配现代 A…

2026/10/18 17:01:48 阅读更多 →
使用.tcl脚本文件仿真代码

使用.tcl脚本文件仿真代码

前提是要先对modelsim进行编译仿真库。使用.tcl编译仿真代码需要一下文件:1.代码文件(.v);2.代码仿真文件(.v);3.glbl.v(赛灵思官方 为 Verilog 仿真专门提供的全局信号定义文件);4.…

2026/10/18 17:02:09 阅读更多 →
工商业光伏防逆流装置选型指南:从工业厂房到商业楼宇的适配方案

工商业光伏防逆流装置选型指南:从工业厂房到商业楼宇的适配方案

随着分布式光伏、储能等新能源并网项目规模持续扩大,防逆流装置作为保障电网安全、满足并网合规要求的核心设备,其选型直接影响项目验收通过率与长期运行稳定性。不少用户因对产品属性、选型标准认知不足,导致项目延误、运维成本增加甚至产生…

2026/10/18 17:02:14 阅读更多 →

最新新闻

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南 【免费下载链接】seed-vc zero-shot voice conversion & singing voice conversion, with real-time support 项目地址: https://gitcode.com/GitHub_Trending/se/seed-vc 有一场会要开…

2026/10/19 2:01:28 阅读更多 →
MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频

MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频

MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/Gi…

2026/10/19 2:01:28 阅读更多 →
biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单

biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单

biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 开售那几秒,你连刷七八次页面,「立即购买」刚亮起就弹出排队提示…

2026/10/19 2:01:28 阅读更多 →
低功耗设计中的反直觉陷阱:为什么进入 STOP 模式电流反而变大了?

低功耗设计中的反直觉陷阱:为什么进入 STOP 模式电流反而变大了?

摘要: 可穿戴设备续航从 7 天缩水到 2 天,电池容量没变、固件逻辑没改,问题出在低功耗模式上。更诡异的是——进入 STOP 模式后电流反而比 RUN 模式更大。这不是硬件故障,而是低功耗设计里最反直觉的一类陷阱:GPIO 悬空、外设时钟未关、上拉下拉配错、调试接口未禁用……每…

2026/10/19 2:01:28 阅读更多 →
Qwen-Image-Layered-6bit分层质量调优:steps与resolution如何取舍才最划算

Qwen-Image-Layered-6bit分层质量调优:steps与resolution如何取舍才最划算

【免费下载链接】Qwen-Image-Layered-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/zimengxiong/Qwen-Image-Layered-6bit 点击查看 免费下载 Qwen-Image-Layered-6bit 是面向 Apple Silicon 的 6-bit 量化图像分层模型,能把任意图片分解为多张 R…

2026/10/19 2:01:28 阅读更多 →
ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

采购申请页面上的保存按钮,背后通常不只有一次数据库写入。申请抬头需要保存,行项目需要关联,金额需要计算,供应商需要校验,当前操作者还必须具备相应权限。只要其中一项没有满足业务要求,系统就不能把这张申请当成一份完整、有效的业务单据。 这类围绕业务数据开展读取…

2026/10/19 2:00:28 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →