当前位置: 首页 > news >正文

第63篇【终极整合巨作】从零手写原生中后台管理系统|整合62篇全部前端知识点|从头到尾完整架构+全功能逻辑

前言:为什么写这一篇?

前面62篇,我们从零学完了:布局、CSS、原生JS、ES6、异步、事件循环、网络协议、浏览器原理、工程化、Vue3、TS、WebSocket、权限系统、Git、微前端、性能优化、手写源码、BUG排查、面试话术。

但是知识点是分散的。

这一篇,我把全部前端能力,从头到尾串联成一个完整可上线的企业级项目。

不用Vue、不用框架、不用脚手架。

纯 HTML + CSS + 原生JS 手写全套中后台系统

包含:架构设计、工具封装、网络层、权限层、路由层、状态层、业务层、组件层、全局拦截、异常处理、性能优化、团队规范。

学完这一篇,你就真正拥有「完整前端工程思维」


一、项目整体架构设计(工程化思维落地)

1.1 项目技术栈

原生 HTML5 + CSS3 + JavaScript(ES6+)

少量 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

http://www.jsqmd.com/news/1337625/

相关文章:

  • 一周扎堆更新!3款顶级AI视频模型实测对比,该怎么选?
  • RTAB-Map在机器人三维建图与导航中的实战应用:从算法原理到工程部署
  • Kubernetes核心概念与生产环境实践指南
  • 机械人学习 day 14
  • 从零搭建美股盘前量化分析Agent:Python技术栈与多因子策略实战
  • PS5 DEVKit系统升级与Unity开发环境部署避坑指南
  • 河北仓储笼批发厂家怎么选才省心实用又耐用 - 品牌优推
  • 2026 年现阶段,晋州有实力的靠谱的全钢防静电地板公司制造厂选型指南,选对它,机房从此少掉链子,你要找的这类靠谱厂商藏在这了? - 行业推荐官[官方】--
  • AI手机进化论:从功能点到工作流,豆包AI如何重塑移动智能体验
  • ConfigMap 配置错误导致pod持续处于Error状态的排查记录
  • 芯片设计逻辑综合实战:从RTL到门级网表的DC流程与约束详解
  • AI开发中的“面具”:从提示词到工程化智能体工作流
  • 2026 年现阶段,巴彦淖尔可靠的 误差控制1mm工厂深度解析,你敢信?这玩意儿能把工业零件的偏差卡死在1毫米里 - 企业推荐官-
  • C++多态性深度解析:从虚函数表到动态绑定原理与实战
  • NLP与知识图谱实战:解析科幻文本并构建概念关系网络
  • 文章明明写对了关键词,为什么还是没进入AI的答案?
  • 2026 年现阶段,绍兴靠谱的35#精密光亮管制造企业推荐,用它做的零件竟比普通管耐用3倍?你绝想不到的行业秘密 - 行业推荐官-2
  • Android日志截断问题全解析:从Logcat限制到完整日志输出方案
  • 二次规划与二次约束规划:从建模到求解的实战指南
  • 2026 年至今,钟山靠谱的热镀锌双边丝护栏网企业怎么联系,花几百块装的围栏竟能用15年?内行都在靠它避坑,原来这玩意儿才是工地刚需-允安丝网 - 实业推荐官
  • GD32 Eclipse开发环境手动搭建与调试实战指南
  • 软件项目经理必知:软件生命周期模型在项目管理中的核心价值
  • 从取火柴游戏到尼姆博弈:异或运算与必胜策略的算法实战
  • RTX 4090D深度评测:精准刀法下的性能巨兽,与4090差距仅2%
  • 2026 年枣强诚信的岩棉净化板定制厂家哪家靠谱,建洁净车间别乱选,这玩意儿居然能省一半后期维护钱? - 行业推荐官【认证】
  • C++部署YOLOv8图像分类模型:ONNX Runtime与OpenCV实战指南
  • 2026 年赤峰正规的真草坪种植基地源头厂家哪家好,小区铺草坪别乱选,这玩意儿能让楼下永远像踩在春日草地上? - 行业严选官
  • 热风枪温度控制原理与实战指南:从PID算法到电子维修应用
  • 电力行业AR智能运维哪个品牌好
  • 2026 年至今,平江优秀的新风系统厂商找哪家,你家墙上那台不起眼的机器,居然悄悄改善了全家的健康? - 企业推荐管【认证】