Vue 快速开发模板
Vue 快速开发模板 - 项目说明书一、环境准备1.1 安装 nvmNode.js 版本管理工具nvm 用于管理多个 Node.js 版本方便切换。下载地址https://github.com/coreybutler/nvm-windows/releases 下载 nvm-setup.exe 安装即可1.2 使用 nvm 安装 Node.js# 查看可安装的版本 nvm list available 安装 Node.js 22.x LTS 版本 nvm install 22 切换到 22.x 版本 nvm use 22.x.x具体版本号 验证安装 node -v # 应显示 v22.x.x npm -v # 应显示 10.x.x1.3 常见问题nvm use 后 node -v 还是旧版本原因PATH 环境变量中有写死的旧版本路径。解决方法 1. 右键此电脑 → 属性 → 高级系统设置 → 环境变量 2. 在 Path 中找到类似 D:\xxx\nvm\nvm\v14.21.3\ 的路径 3. 删除这一行 4. 确认 NVM_HOME 和 NVM_SYMLINK 环境变量存在 5. 关闭所有命令行窗口重新打开 6. 执行 nvm use 22.x.x再执行 node -v 验证1.4 常见问题npm 命令报安全策略错误错误信息无法加载文件 npm.ps1因为在此系统上禁止运行脚本。解决方法以管理员身份运行 PowerShell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 输入 Y 回车确认1.5 设置 npm 镜像国内加速npm config set registry https://registry.npmmirror.com1.6 安装 yarnnpm install -g yarn二、创建 Vue 项目2.1 安装 Vue 脚手架yarn global add vue/cli vue --version # 应显示 vue/cli 5.x.x2.2 创建项目# 切换到你想放项目的目录 cd D:\你的目录 创建项目 vue create quick-dev-template2.3 创建时的选项配置第1步选择 Manually select features手动选择功能 第2步勾选以下功能空格键选中回车确认 ✅ Babel ✅ Router ✅ Vuex ✅ CSS Pre-processors ✅ Linter / Formatter 第3步Vue 版本选择 3.x 第4步Use history mode for router? → Yes 第5步CSS 预处理器 → Sass/SCSS (with dart-sass) 第6步ESLint → ESLint Prettier 第7步Lint on save保存时检查 第8步配置文件位置 → In dedicated config files 第9步Save as preset? → No 第10步包管理器 → Use Yarn三、安装依赖cd quick-dev-template 安装 Element PlusUI 组件库 yarn add element-plus 安装 axiosHTTP 请求库 yarn add axios 安装 js-cookieCookie 管理库 yarn add js-cookie四、项目配置4.1 入口文件 src/main.jsimport { createApp } from vue; import App from ./App.vue; import router from ./router; import store from ./store; // Element Plus import ElementPlus from element-plus; import element-plus/dist/index.css; import zhCn from element-plus/dist/locale/zh-cn.mjs; const app createApp(App); app.use(store); app.use(router); app.use(ElementPlus, { locale: zhCn }); app.mount(#app);4.2 路由配置 src/router/index.jsimport { createRouter, createWebHashHistory } from vue-router; import Cookies from js-cookie; const routes [ { path: /login, name: Login, component: () import(/views/login/index.vue), }, { path: /, name: Layout, component: () import(/views/layout/index.vue), redirect: /home, children: [ { path: home, name: Home, component: () import(/views/home/index.vue), }, { path: center, name: Center, component: () import(/views/center/index.vue), }, // ↓↓↓ 以后新增的页面路由写在这里 ↓↓↓ ], }, { path: /:pathMatch(.), name: NotFound, component: () import(/views/404/index.vue), }, ]; const router createRouter({ history: createWebHashHistory(), routes, }); // 路由守卫每次跳转前检查是否登录 router.beforeEach((to, from, next) { const token Cookies.get(token); if (to.path /login) { next(); } else if (!token) { next(/login); } else { next(); } }); export default router;4.3 状态管理 src/store/index.jsimport { createStore } from vuex; import Cookies from js-cookie; export default createStore({ state: { user: {}, token: Cookies.get(token) || , }, getters: { getUser(state) { return state.user; }, getToken(state) { return state.token; }, }, mutations: { setUser(state, user) { state.user user; }, setToken(state, token) { state.token token; Cookies.set(token, token); }, logout(state) { state.user {}; state.token ; Cookies.remove(token); }, }, actions: {}, modules: {}, });4.4 HTTP 请求工具 src/utils/request.jsimport axios from axios; import { ElMessage } from element-plus; import router from /router; import Cookies from js-cookie; const service axios.create({ baseURL: http://localhost:8080/springboot, // 后端接口地址根据实际情况修改 timeout: 30000, }); // 请求拦截器自动带上 token service.interceptors.request.use( (config) { const token Cookies.get(token); if (token) { config.headers[Token] token; } return config; }, (error) { return Promise.reject(error); } ); // 响应拦截器统一处理错误 service.interceptors.response.use( (response) { const res response.data; if (res.code 401) { ElMessage.error(请先登录); router.push(/login); return Promise.reject(new Error(未登录)); } return res; }, (error) { ElMessage.error(error.message || 请求失败); return Promise.reject(error); } ); export default service;4.5 根组件 src/App.vuetemplate router-view / /template style langscss { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, 微软雅黑, Arial, sans-serif; } /style4.6 ESLint 配置 .eslintrc.jsmodule.exports { root: true, env: { node: true, }, extends: [plugin:vue/vue3-essential, eslint:recommended], parserOptions: { parser: babel/eslint-parser, }, rules: { no-console: process.env.NODE_ENV production ? warn : off, no-debugger: process.env.NODE_ENV production ? warn : off, vue/multi-word-component-names: off, no-unused-vars: off, }, };五、基础页面5.1 登录页 src/views/login/index.vuetemplate div classlogin-container div classlogin-box h2 classlogin-title系统登录/h2 el-form :modelloginForm :rulesrules refloginFormRef el-form-item propusername el-input v-modelloginForm.username placeholder请输入账号 prefix-iconUser / /el-form-item el-form-item proppassword el-input v-modelloginForm.password typepassword placeholder请输入密码 prefix-iconLock show-password / /el-form-item el-form-item el-radio-group v-modelloginForm.role el-radio labeladmin管理员/el-radio el-radio labeluser普通用户/el-radio /el-radio-group /el-form-item el-form-item el-button typeprimary stylewidth: 100% clickhandleLogin登 录/el-button /el-form-item /el-form /div /div /template script import Cookies from js-cookie; export default { name: Login, data() { return { loginForm: { username: , password: , role: admin, }, rules: { username: [{ required: true, message: 请输入账号, trigger: blur }], password: [{ required: true, message: 请输入密码, trigger: blur }], }, }; }, methods: { handleLogin() { this.$refs.loginFormRef.validate((valid) { if (!valid) return; // TODO: 替换为实际的登录接口 Cookies.set(token, test-token); this.$store.commit(setToken, test-token); this.$store.commit(setUser, { username: this.loginForm.username }); this.$message.success(登录成功); this.$router.push(/); }); }, }, }; /script style langscss scoped .login-container { width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } .login-box { width: 400px; padding: 40px; background: #fff; border-radius: 12px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); } .login-title { text-align: center; margin-bottom: 30px; color: #333; font-size: 24px; } /style5.2 主框架 src/views/layout/index.vuetemplate div classlayout div classheader div classlogo管理系统模板/div div classuser-info el-dropdown commandhandleCommand span classel-dropdown-link {{ $store.state.user.username || 管理员 }} el-iconarrow-down //el-icon /span template #dropdown el-dropdown-menu el-dropdown-item commandcenter个人中心/el-dropdown-item el-dropdown-item commandlogout divided退出登录/el-dropdown-item /el-dropdown-menu /template /el-dropdown /div /div div classcontainer div classsidebar el-menu :default-activeactiveMenu router el-menu-item index/home el-iconhome-filled //el-icon span首页/span /el-menu-item el-menu-item index/center el-iconuser //el-icon span个人中心/span /el-menu-item !-- ↓↓↓ 以后新增的菜单写在这里 ↓↓↓ -- /el-menu /div div classmain-content router-view / /div /div /div /template script import Cookies from js-cookie; export default { name: Layout, computed: { activeMenu() { return this.$route.path; }, }, methods: { handleCommand(command) { if (command center) { this.$router.push(/center); } else if (command logout) { this.$store.commit(logout); Cookies.remove(token); this.$router.push(/login); this.$message.success(已退出登录); } }, }, }; /script style langscss scoped .layout { height: 100vh; display: flex; flex-direction: column; } .header { height: 60px; background: #409eff; color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; } .logo { font-size: 20px; font-weight: bold; } .user-info { cursor: pointer; } .el-dropdown-link { color: #fff; display: flex; align-items: center; } .container { flex: 1; display: flex; overflow: hidden; } .sidebar { width: 200px; background: #fff; border-right: 1px solid #e6e6e6; overflow-y: auto; } .main-content { flex: 1; padding: 20px; background: #f5f5f5; overflow-y: auto; } /style5.3 首页 src/views/home/index.vuetemplate div classhome h1欢迎使用管理系统/h1 p这是首页你可以在这里放统计信息、图表等/p /div l

相关新闻

英雄联盟Akari助手:基于LCU API的终极游戏效率工具,快速提升你的操作水平

英雄联盟Akari助手:基于LCU API的终极游戏效率工具,快速提升你的操作水平

英雄联盟Akari助手:基于LCU API的终极游戏效率工具,快速提升你的操作水平 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …

2026/10/15 2:56:29 阅读更多 →
智能体技术演进与核心架构解析

智能体技术演进与核心架构解析

1. 智能体技术发展脉络 2006年斯坦福大学首次提出"软件智能体"概念时,可能没想到这个概念会在20年后引发全球科技竞赛。智能体技术经历了三个关键发展阶段: 第一阶段(2006-2015)的规则型智能体,就像严格按照…

2026/10/14 15:13:14 阅读更多 →
2026年考试系统选购指南:功能、部署与避坑全解析

2026年考试系统选购指南:功能、部署与避坑全解析

随着企业、学校和部队培训需求的多样化,考试系统成为信息化管理和培训考核的重要工具。面对市场上众多系统选择,IT和培训负责人如何科学选购,确保功能、部署、安全与易用性兼顾,成为关键问题。本文将从专业视角提供2026年考试系统…

2026/10/14 16:27:27 阅读更多 →

最新新闻

Nacos源码启动全流程:环境配置、编译打包与IDEA调试实战

Nacos源码启动全流程:环境配置、编译打包与IDEA调试实战

1. 为什么源码启动 Nacos 比下载压缩包更值得折腾很多人第一次接触 Nacos 都是直接去官网拖一个 release 包,解压、改改application.properties、执行startup.sh -m standalone,看到控制台打印出那个绿色的启动成功日志,就觉得已经掌握了。但…

2026/10/15 9:08:50 阅读更多 →
MATLAB自适应滤波在ECG信号去噪中的应用与优化

MATLAB自适应滤波在ECG信号去噪中的应用与优化

1. 项目背景与核心挑战心电信号(ECG)作为临床诊断的重要依据,其质量直接影响心血管疾病的检出率。但在实际采集过程中,工频干扰(50/60Hz)、肌电噪声(0.1-1kHz)、基线漂移&#xff08…

2026/10/15 9:08:50 阅读更多 →
荧光标记技术Alexa Fluor 647-LNT在糖生物学研究中的应用

荧光标记技术Alexa Fluor 647-LNT在糖生物学研究中的应用

1. 项目概述:荧光标记技术在糖生物学研究中的应用在糖生物学和免疫学研究领域,荧光标记技术已经成为不可或缺的研究工具。Alexa Fluor 647-LNT(乳糖-N-四糖标记物)作为一种新型荧光探针,因其优异的荧光性能和特异性结合…

2026/10/15 9:08:50 阅读更多 →
外设端口到底该不该封?这 4 个问题先搞清楚

外设端口到底该不该封?这 4 个问题先搞清楚

后台里关于外设管控的提问一直很集中:USB 要不要一刀切禁掉?禁了打印机、鼠标键盘怎么办?只审计不拦截有没有用?和文件外发审计、屏幕监控到底怎么配合?还有些管理员说,策略配完发现业务部门投诉不断&#…

2026/10/15 9:08:50 阅读更多 →
C/C++编译链接全流程解析:从源代码到可执行文件

C/C++编译链接全流程解析:从源代码到可执行文件

1. 从文本到机器指令:编译与链接到底在干什么很多人写了好几年代码,对“编译”这个词的理解还停留在“点一下运行按钮,代码就跑起来了”。一旦遇到undefined reference to xxx或者multiple definition of xxx这种报错,就彻底懵了&…

2026/10/15 9:08:50 阅读更多 →
Vue3 Composition API 核心设计与实战解析

Vue3 Composition API 核心设计与实战解析

1. Vue3 Composition API 核心设计理念解析第一次接触Composition API时,最让我震撼的是它彻底改变了Vue代码的组织方式。传统Options API就像在填写一份固定格式的问卷,而Composition API则像在白纸上自由作画。这种编程范式的转变背后,是Vu…

2026/10/15 9:07:45 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →