news 2026/9/26 2:25:29

黑马电商后台管理系统实战:从环境搭建到前后端联调与部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
黑马电商后台管理系统实战:从环境搭建到前后端联调与部署

简介:这是一套面向前后端开发者的电商后台管理系统实战资源,以前端 Vue.js 与后端 Node.js 为主线,覆盖用户管理、商品管理、订单管理、库存管理、数据分析、权限控制等核心业务模块,既适合初学者理解项目结构,也适合有经验者复盘整体技术方案。压缩包内包含 2000 个文件,主要涉及 Vue 组件、JavaScript/TypeScript 源码、CSS/SCSS 样式、Markdown 说明文档以及 JSON 配置和依赖包相关文件,整体大小 82.42MB。其中前端部分涉及 Vuex 状态管理、Vue Router 路由、组件通信与页面懒加载;后端部分涉及 Express/Koa 搭建 RESTful API、JWT 鉴权、MongoDB/MySQL 数据操作和 RBAC 权限控制。此外还包含 Webpack 打包、热更新、图表可视化等实践内容。已有 4184 人学习浏览,适合按模块对照源码逐步拆解,建立电商后台从界面到接口的完整认知。

1. 黑马电商后台管理系统是什么?一个能直接落地的前后端分离样板

电商后台管理是前端开发面试里出现频率最高的实战场景之一。黑马电商后台管理系统这个源码包,说白了就是一套完整的电商运营后台:前端用 Vue 实现页面和交互,后端用 Node.js 提供接口和数据,两者通过 HTTP 联调。你拿到的是一个 zip 压缩包,解压后里面有前端工程、后端工程,通常还带一份 SQL 初始化脚本。它的价值在于把“前后端分离项目实战”从概念变成了可运行的东西,特别适合用来面试前补项目经验、毕业设计直接改编,或者作为你学习接口设计和鉴权流程的活教材。这篇文章就围绕怎么把它跑通、怎么改造成适合自己的项目来写。

2. 环境准备:装对 Node.js 和 npm,少走一半弯路

2.1 选对 Node.js 版本:先看 package.json 再用 nvm

很多人在第一步就翻车。拿到 zip 包后急急忙忙装最新版 Node.js,结果 npm install 报一堆错。黑马电商后台这种项目,网上流传的版本大多基于 Vue 2 和较早期的 Express 4,它们在 Node 17 以上的版本里经常出现兼容问题,最典型的是 OpenSSL 相关报错。

常见做法是先用 nvm(Node 版本管理器)装一个 LTS 版本,比如 Node 14 或 Node 16。这两个版本对老项目的兼容性最好,跑 Express 和 Webpack 4 都没什么压力。Windows 下安装 nvm 很简单:去 nvm 的 GitHub 仓库下载 nvm-setup.exe,装完在命令行执行nvm list available查看可用版本列表,然后安装指定版本。

# 安装 Node 16 并切换到该版本 nvm install 16.20.2 nvm use 16.20.2 # 确认当前版本 node -v npm -v

这里的nvm install 16.20.2装的是 Node 16 的最后一个维护版本,包含 npm 8,配合老项目足够了。nvm use会在当前终端窗口临时切换版本,重新开终端后需要再执行一次。如果你想默认使用某个版本,可以用nvm alias default 16.20.2。

还有一个细节:不要用 cnpm 代替 npm。老项目里 cnpm 虽然能绕过一些网络问题,但它会生成扁平化程度不同的 node_modules,导致某些依赖的版本和 lock 文件对不上,运行时出现诡异报错。老老实实用 npm 加国内镜像,才是正道。

2.2 npm 安装与国内镜像配置:解决下载慢和安装失败

npm 默认源在国外,下载速度看运气。黑马电商后台的依赖数量通常在几百个以上,Electron 或 node-sass 这类带二进制文件的包经常下载失败或卡在 postinstall 步骤。解决方案是换源。

# 查看当前 npm 源 npm config get registry # 切换到淘宝镜像源 npm config set registry https://registry.npmmirror.com # 查看配置是否生效 npm config get registry

把 registry 切到 https://registry.npmmirror.com 后,下载速度会有立竿见影的提升。这里要注意,镜像源和 npm 官方源在大版本上保持一致,但个别包可能更新滞后。如果你 install 时遇到某个包版本不存在(ETARGET)的报错,大概率是镜像源还没同步最新版本,这时直接去 node_modules 里删掉旧版本目录重新安装,或者临时切回官方源装完再切回来。

2.3 用 Vue CLI 还是 Vite?先确认你拿到的是哪个版本

黑马电商后台源码包有两个常见分支:老版本基于 Vue CLI(vue-cli 4),项目结构里有vue.config.js;稍后一些的版本用 Vite(vite 2/3/4),项目结构里有vite.config.js。这两个东西区别很大,直接影响你启动项目的命令。

# 解压后进入前端目录,先看 package.json 里的 scripts 字段 cd ./admin cat package.json

打开后看 scripts 部分。如果看到"dev": "vue-cli-service serve",说明是 Vue CLI 项目;如果看到"dev": "vite",说明是 Vite 项目。Vue CLI 项目默认运行在 8080 端口,Vite 项目默认运行在 5173 端口。这个差异会决定你后面配置跨域代理时怎么写。

有个体感很强的建议:如果你的电脑是近几年买的,建议直接选 Vite 版本的项目,冷启动速度快得多,热更新体验也更好。但 Vite 版本对 Node 版本有最低要求,必须在 14.18 以上,最好是 16。如果你非要跑老版本 Vue CLI 项目,Node 14 是安全牌,很多黑马老学员项目在 Node 16 下都能跑,Node 14 更稳。

3. 把项目跑起来:从 zip 解压到前后端联调的最小路径

3.1 解压后的目录结构:先认清哪部分是前端、哪部分是后端

拿到 zip 包第一步是解压,但解压完别急着装依赖,先把结构看清。黑马电商后台管理系统的典型结构是前端目录叫admin或web,后端目录叫server或serve,有的版本还把数据库脚本放在db或sql目录下。在 Windows 资源管理器里打开根目录,用dir看更直观。

# 在项目根目录下查看目录结构 dir

你会看到类似这样的输出:admin/(前端工程),server/(Node.js 后端工程),sql/或xxx.sql(数据库初始化脚本)。如果只有admin和server两个目录而没有 sql 文件,那么 SQL 脚本可能在后端工程的db目录里,或者需要你自己根据后端代码里的建表语句反推。

认清结构的意义在于:前端和后端是两个独立的 npm 项目,各自的package.json互不干扰。你需要进入两个目录分别执行依赖安装,不能在最外层安装。这一步出错的人很多:在最外层执行npm install,装了一堆无关依赖,前端和后端的命令完全跑不起来,回头还以为是源码包有问题。

3.2 安装依赖与启动命令:前端和后端分开装、分开启动

这是整个流程里最需要耐心的一步。进入前端目录安装依赖,再进入后端目录安装依赖,最后分别启动。

# 安装前端依赖(进入前端目录) cd admin npm install # 启动前端 npm run dev

如果npm install过程没有报 fatal 级别的错误,就进入下一步。看启动日志里的Compiled successfully或者 Vite 的ready in字样,说明前端页面已经起来了,默认地址是http://localhost:8080(Vue CLI)或http://localhost:5173(Vite)。注意打开浏览器后先别急着点登录,因为后端还没启动。

后端启动前需要确认一件事:数据库是否已经准备好了。黑马电商后台管理系统几乎都用 MySQL,后端通过sequelize或mysql库连接数据库。如果你跳过数据库初始化直接启动后端,会在日志里看到connect ECONNREFUSED之类的连接失败错误。

# 安装后端依赖(进入后端目录) cd ../server npm install # 初始化数据库(如果有 sql 脚本) mysql -u root -p < ./sql/black_mall.sql # 启动后端 node app.js

这里的node app.js是大多数版本的默认启动方式。也有版本用了nodemon,开发热重载用npm run dev,生产用npm start。看后端目录里的package.jsonscripts 字段,跟着里面的命令走。启动成功的标志是控制台输出server is running on port 3000或类似日志。

3.3 联调验证:用一个登录请求确认前后端已经打通

前后端各自启动成功,并不代表真正打通。联调的核心是验证前端发起的请求能到达后端,后端返回的数据能被前端正确处理。最直接的办法是看浏览器开发者工具的 Network 面板,然后触发一次登录请求。

我一般会这么验证:打开前端页面http://localhost:8080,按 F12 打开开发者工具,切到 Network 标签,勾选 Fetch/XHR,然后在前端页面上输入账号密码点击登录。正常情况下你会看到一个POST请求,URL 类似http://localhost:8080/api/user/login(注意这里的域名和端口是前端页面的,而不是后端服务的)。如果这个请求返回 200,并带有一个 token 字段,说明前后端联调已通。

如果请求显示 404 或 500,先不要慌,九成是跨域方案没配对。别急,跨域的细节在第五章会专门展开。这里你要记住的关键点是:前端页面的地址和后端接口地址不是同一个端口,两者之间必须有代理或 CORS 配置作为桥梁。黑马电商后台的黑匣子就在这里,很多人把前后端都启动成功了,但登录一直失败,就是因为少了这一步确认链路。

4. 拆解电商后台的核心实现:登录鉴权、商品管理与路由设计

4.1 登录鉴权这块硬骨头:JWT 为什么是默认选项

黑马电商后台管理系统的登录模块用的是 JWT(JSON Web Token),这是目前前后端分离项目里最主流的会话方案。为什么不是 session?因为 session 依赖服务端存储,需要共享缓存才能支撑多实例部署,而 JWT 把用户信息加密后直接放在客户端,后端无状态,扩展性和维护成本低很多。

后端登录接口的逻辑通常是:接收用户名和密码 → 查数据库校验 → 生成 token 返回给前端。下面是一段典型的 Express 实现,我加了关键注释。

// server/routes/user.js 登录接口的简化版 const jwt = require('jsonwebtoken'); const { User } = require('../models'); // 假设用 sequelize 定义的模型 // 密钥:生产环境务必存放在环境变量里,不要写死在代码中 const SECRET_KEY = process.env.JWT_SECRET || 'black_mall_secret'; // POST /api/user/login exports.login = async (req, res) => { try { const { username, password } = req.body; // 1. 从数据库查找用户 const user = await User.findOne({ where: { username } }); // 2. 简单校验:这里实际项目会用 bcrypt 比对哈希,而不是明文 if (!user || user.password !== password) { return res.status(401).json({ code: 401, message: '用户名或密码错误' }); } // 3. 生成 token,有效期 2 小时 const token = jwt.sign( { id: user.id, username: user.username, role: user.role }, SECRET_KEY, { expiresIn: '2h' } ); // 4. 返回 token 给前端 res.json({ code: 0, token, user: { id: user.id, username: user.username } }); } catch (err) { res.status(500).json({ code: 500, message: '服务器内部错误' }); } };

这段代码里值得注意的参数有三个:jwt.sign的第一个参数是 payload,里面不要放敏感信息,只放用户 id、用户名和角色就够了,手机号之类的东西别放进来;expiresIn设置为2h意味着 token 两小时后过期,前端收到 401 时需要跳转到登录页重新登录;SECRET_KEY是核心安全参数,生产环境一定要通过环境变量注入,否则代码泄露等于所有用户的会话都暴露了。

对应地,前端拿到 token 后要存起来,并在后续请求的请求头里带上。这就是 axios 拦截器要做的工作。

// admin/src/utils/request.js axios 实例封装 import axios from 'axios'; const service = axios.create({ baseURL: '/api', // 走 devServer 代理,不写完整后端地址 timeout: 10000 }); // 请求拦截器:每次请求自动携带 token service.interceptors.request.use((config) => { const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = 'Bearer ' + token; } return config; }, (error) => { return Promise.reject(error); }); // 响应拦截器:统一处理业务错误和登录过期 service.interceptors.response.use( (response) => { const res = response.data; if (res.code !== 0) { // 业务状态码非 0,通常表示失败 return Promise.reject(new Error(res.message || '请求失败')); } return res; }, (error) => { if (error.response && error.response.status === 401) { // token 过期或无效,清空本地登录信息并跳转登录页 localStorage.removeItem('token'); window.location.href = '/login'; } return Promise.reject(error); } ); export default service;

baseURL: '/api'这个参数很关键,它不是后端地址,而是走前端 devServer 的代理路径。代理规则在vue.config.js或vite.config.js里配置,指向真正的后端。请求头里的Authorization: Bearer <token>是前后端约定俗成的鉴权传递方式,后端通过检查这个头是否存在和有效来判断用户是否登录。

4.2 商品管理模块:后端接口怎么设计、前端表格怎么对接

商品列表是电商后台的核心页面。它的典型特征是数据量大、筛选条件多、需要分页。后端接口设计通常围绕这些需求展开:用 GET 请求携带查询参数,返回分页数据和总条数。

// server/routes/product.js 商品列表接口精简版 // GET /api/product/list?page=1&pageSize=10&name=手机&status=1 exports.list = async (req, res) => { const { page = 1, pageSize = 10, name, status } = req.query; // 构建查询条件:这里用 sequelize 作为示例 const where = {}; if (name) { where.name = { [Op.like]: `%${name}%` }; } if (status !== undefined && status !== '') { where.status = status; } const { count, rows } = await Product.findAndCountAll({ where, offset: (page - 1) * parseInt(pageSize, 10), limit: parseInt(pageSize, 10), order: [['id', 'DESC']] }); res.json({ code: 0, data: { list: rows, total: count, page: parseInt(page, 10), pageSize: parseInt(pageSize, 10) } }); };

三个必调参数说明:page和pageSize是分页的核心参数,接口层的 offset 计算方式是(page - 1) * pageSize,前端传错类型会导致 SQL 报错或数据异常,所以这里特意做了parseInt强转;name用LIKE模糊查询,注意%的位置,拼接错了就是全表匹配或完全匹配,结果差很远;order: [['id', 'DESC']]让新商品排在前面,这是列表页的默认体验。

前端对应的商品列表页面,用 el-table 绑定后端返回的 list 数组,用 el-pagination 绑定 total。请求参数写成响应式对象,改变页码或搜索条件时重新调用接口。这个流程在 Vue Element UI 或 Element Plus 里几乎是固定套路,你需要修改的就是 table 列和查询表单字段。千万不要为了炫技改成分页一次性加载全部数据的版本,后台管理系统建表索引没跟上时,数据量一大页面能卡死几秒。

4.3 路由与状态管理:vue-router 守卫和用户信息的存放

后台管理系统的路由设计和普通网站不太一样。普通网站的路由大多是公开的,而后台管理系统的绝大多数页面都需要登录才能访问。这类需求用 vue-router 的全局前置守卫解决。

// admin/src/router/index.js 路由守卫 import router from './router'; import { getToken, getUserInfo } from '@/utils/auth'; router.beforeEach((to, from, next) => { const token = getToken(); if (token) { // 已登录 if (to.path === '/login') { next('/'); } else { next(); } } else { // 未登录:白名单放行,其他一律跳登录页 const whiteList = ['/login']; if (whiteList.includes(to.path)) { next(); } else { next(`/login?redirect=${to.path}`); } } });

next(/login?redirect=${to.path})这一行的作用是带 redirect 参数跳转,用户登录成功后回跳原页面。这个参数在很多面试题里出现过,核心逻辑是在登录页拿到路由里的 redirect 参数,登录成功后用router.replace(redirect || '/')做跳转,而不是固定跳首页。这也是登录页跳转的一个小细节,很多新手项目都不做,导致用户每次登录后都要手动点菜单。

用户信息存哪?老项目常用的方案是放进 Vuex(或 Pinia),同时塞一份到 localStorage。放进 store 是为了组件间共享状态,塞进 localStorage 是为了刷新页面后不丢登录状态。注意:token 一定要放 localStorage 或 cookie,用户基本信息放 store 即可,刷新后再通过接口拉取,避免敏感信息长期留在本地。

5. 避坑指南:黑马电商后台跑通路上的常见问题与排查

5.1 npm.ps1 禁止运行脚本:PowerShell 执行策略拦路

现象:在 Windows PowerShell 里执行npm install或npm run dev,直接报错:npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

原因:Windows 默认 PowerShell 执行策略是 Restricted,禁止运行任何 .ps1 脚本文件。npm 的命令行入口是npm.ps1,被策略拦住了。这和 Node.js 本身无关,是操作系统层面的限制。

解决:以管理员身份打开 PowerShell,执行一条命令:

# 修改当前用户的执行策略为 RemoteSigned Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

RemoteSigned的意思是本地创建的脚本可以运行,从网上下载的脚本需要数字签名。npm 的 ps1 文件是 npm 安装时生成的本地文件,满足条件,可以正常运行。如果你是在公司电脑上,没有管理员权限,换用 CMD(命令提示符)或 Git Bash 执行 npm 命令也能绕过这个限制。这个问题太常见了,几乎所有 Windows 新人都会遇到,属于黑马电商后台系列项目的标配第一坑。

5.2 后端一启动就报 EADDRINUSE:端口被占用怎么处理

现象:启动后端时控制台报错Error: listen EADDRINUSE: address already in use :::3000,服务起不来。

原因:3000 端口被其他进程占用了。这种情况在黑马电商后台里尤其常见,因为很多教程都用 3000 端口做后端,你之前跑过别的项目没停掉,或者 3000 端口被一些系统服务占用了,甚至可能是上一次启动的后端进程还在后台挂着没退出。

解决分两步:先找出占用端口的进程,再按需处理它。

# 查看 3000 端口被哪个进程占用(Windows 下用 netstat) netstat -ano | findstr :3000 # 用输出的 PID 查看对应进程名 tasklist | findstr PID号 # 确认是无用进程后,终止它 taskkill /PID PID号 /F

如果你不想杀进程,更推荐改后端端口。在后端入口文件里找到app.listen(3000),改成app.listen(3001),然后去前端的代理配置里把 target 同步改成http://localhost:3001。改端口比杀进程安全,尤其是你不确定那个占用进程是不是系统服务的时候。

5.3 跨域问题:前端能打开页面但接口全部 404 或 CORS 报错

现象:前端页面正常加载,接口请求全部失败。Network 面板里看到Failed to load resource: the server responded with a status of 404 (Not Found),或者控制台报Access to XMLHttpRequest ... has been blocked by CORS policy。

原因:前后端端口不同,前端发请求给后端时浏览器拦截。注意这里的 404 不是说接口不存在,而是请求根本没到达后端。Vue CLI 和 Vite 都用 devServer 做代理,代理配置不对,或者代理路径匹配不上后端路由,就会出现这种情况。

解决:检查前端配置文件里的代理设置。Vue CLI 项目看vue.config.js,Vite 项目看vite.config.js。

// vue.config.js 中的 devServer 代理配置 module.exports = { devServer: { port: 8080, proxy: { // 以 /api 开头的请求才会走代理 '/api': { target: 'http://localhost:3000', // 后端地址 changeOrigin: true, // 解决虚拟主机和域名校验问题 pathRewrite: { '^/api': '' } // 去掉 /api 前缀再转发 } } } };

这里有一个黑马电商老版本特有的坑:后端接口路由里如果本身不带/api前缀,比如登录接口是POST /user/login,那么你前端请求POST /api/user/login时,必须把pathRewrite里的^/api替换成空字符串,否则后端收到的是/api/user/login,匹配不到路由返回 404。而有些版本的后端路由带/api前缀,此时就不需要 pathRewrite。怎么判断?看后端 app.js 里的接口定义,如果有app.use('/api', ...)就不需要重写。这就是为什么很多人照抄教程的代理配置仍然失败的原因。

5.4 MySQL 连不上:注意 mysql8 的加密协议和字符集

现象:后端启动时报错ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server,或者中文数据全部变成问号。

原因:MySQL 8 默认使用了caching_sha2_password加密插件,而黑马电商老版本后端用的mysql模块或sequelize的旧版本驱动不认识这个插件。字符集问题则是因为数据库或表的默认字符集不是 utf8mb4。

解决:有两个方向。第一个是改数据库,把账号的加密方式改回 mysql_native_password(不升级改造问题挺好的);第二个是换 Node.js 侧的驱动,把mysql包换成mysql2,mysql2完全兼容 mysql8 的新加密协议。

# 方案一:在 MySQL 里执行 SQL,修改用户的加密方式 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
# 方案二:在后端工程里替换驱动(在 server 目录下执行) npm uninstall mysql npm install mysql2

安装完成后,修改后端数据库连接配置里的dialect或driver字段指向mysql2。改了驱动后不用改任何 SQL 代码,因为 mysql2 的 API 设计和 mysql 基本一致。另一个保险操作是在后端入口文件或数据库连接初始化里设置charset: 'utf8mb4',如果数据表已经建好了且出现乱码,那就执行ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。

5.5 登录页能打开但登录失败:先分清是接口挂了还是参数错了

现象:前端登录页正常显示,点击登录后一直提示“用户名或密码错误”,或者按钮转圈几秒后报 500。

原因:这类问题最容易被误判。它的背后可能是三种原因:后端服务没启动(请求 404);前端请求参数名和后端接口约定的参数名不一致(虽然返回 200 但业务码是错误);数据库里根本没有初始化管理员账号。

解决:按照链路一步步排查。先看 Network 面板里登录请求的状态码。如果是 404,检查代理配置和后端是否启动。如果是 200 但业务失败,把请求的 Payload 和后端接口原型对比,确认字段名是否一致。黑马电商后端的登录接口通常接收username和password,如果有某个版本接收的是name和pwd,那你照着教程里的用户名密码死磕也登不上。最后一步是直接查数据库:

-- 查看用户表里有没有管理员账号 SELECT * FROM user WHERE username = 'admin';

如果查询结果为空,说明 SQL 脚本没执行成功,需要重新初始化数据库。很多人在这一步才意识到自己之前的mysql -u root -p < xxx.sql根本没有成功执行,只是因为 mysql 客户端没有把错误打出来。纠正方法是执行时加上-f参数强制继续,并留意报错输出。

6. 把黑马电商后台改造成能上线的项目:权限扩展与部署验证

6.1 从“能跑”到“能用”:改造权限模型比改页面更值

跑通之后,这个项目只能算一个可演示的样板,距离能拿出手还有一段路。我最推荐的改造点是权限模型。黑马电商后台通常只有登录接口做了鉴权,页面权限和按钮权限基本是静态的,菜单对所有登录用户可见。这虽然能跑,但和真实电商后台差距很大。

我习惯的做法是把 JWT 里的 role 字段用起来,配合 vue-router 的 addRoute 做动态菜单。后端登录时在 token 里写入 role,前端拿到角色后根据角色过滤路由表,只有该角色拥有的菜单才addRoute注册。这样管理员看不到运营的菜单,运营也看不到财务的菜单。改造大约需要一天半,但这一项写在简历上的分量,比十几页机械地堆 Element UI 表格要重得多。面试官问权限怎么做的,你说得出“动态路由 + 角色鉴权 + token 失效处理”这条链路,项目就从一个练习变成了一个有思考的作品沉淀。

6.2 部署前必做的三类验证:接口超时、静态资源、日志落盘

如果只是本地写写代码,前面的步骤已经完全够用。但你要是打算部署到服务器展示,有三件容易被忽略的事。用 Vue CLI 构建前端时,编辑器里常常直接拿本地跑通了的结果当生产包,这是要吃苦头的。构建前先改前端环境变量,把接口地址从/api(devServer 代理)改成后端服务的完整域名,不然部署后所有请求都会打到前端服务器上。构建后打开dist/index.html,确认里面引用的 JS/CSS 路径用的是相对路径而不是以/开头,不然在子目录部署时资源全部白屏。部署后端时建议用 PM2 守护进程,不然服务器一重启你的后台就连不上了:

# 用 PM2 启动后端并设置开机自启 pm2 start app.js --name black-mall-server pm2 save pm2 startup

启动后顺手做一轮验证:浏览器登录一次(验证鉴权流程),刷新页面一次(验证 token 持久化),在 Network 里挑一个列表接口看耗时(验证慢查询和老项目常见的内存泄漏)。

这些年我接手过不少从网上下载的老项目,黑马电商后台是其中最值得改的之一。因为它的结构足够典型,又不至于庞大到让人失去耐心。我在帮一个学弟做毕设时替他改过一次这个系统,当时印象最深的是权限模块的整体重构,过程虽然折腾,但做完后我对整个前后端分离的鉴权流程再也没有盲区。现在这套脚手架依然是我手上接外包项目时,优先选用的基础工程之一。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 2:24:37

恩施碎米荠基因组--Cell Discovery

The Cardamine enshiensis genome reveals whole genome duplication and insight into selenium hyperaccumulation and tolerance 恩施碎米荠基因组揭示全基因组复制事件及硒超富集与耐硒机制 摘要 恩施碎米荠&#xff08;Cardamine enshiensis&#xff09;是知名的硒超富集…

作者头像 李华
网站建设 2026/9/26 2:24:17

森林火灾烟雾检测数据集:VOC/COCO/YOLO标签转换与YOLO训练全流程

简介&#xff1a;本资源面向目标检测初学者与需要森林火灾烟雾识别方案的开发者&#xff0c;提供一套可直接用于YOLO系列训练的真实场景数据集。数据包含1000张高质量图片&#xff0c;场景丰富&#xff0c;经labelimg精细标注&#xff0c;并同步提供voc(xml)、coco(json)与yolo…

作者头像 李华