热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue3.2后台管理系统搭建学习笔记

1、创建项目更改版本1-1、创建项目vuecreatevue3-admin1-2、更改vue版本更改前更改后2、开发项目1、按需引入element-plus1、安装np
1、创建项目更改版本

1-1、创建项目

vue create vue3-admin


1-2、更改vue版本

更改前

更改后

 

2、开发项目

1、按需引入element-plus


1、安装

npm install element-plus --save

2、按需导入(自动导入)

cnpm install -D unplugin-vue-components unplugin-auto-import

3、Webpack配置(vue.config.js)

const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')module.exports = {
intOnSave:false,devServer:{open:true,port:9000,},configureWebpack: {plugins: [AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),]},
}

4、使用

tips:在main.js中引入样式(避免弹出框等组件样式错乱)

import 'element-plus/dist/index.css'

2、使用element-plus Icon图标 


1、安装

cnpm install @element-plus/icons-vue

2、注册全局组件

//main.js
import * as ELIcons from '@element-plus/icons-vue'
for (const iconName in ELIcons) {app.component(iconName, ELIcons[iconName])
}

 3、使用(左侧菜单icon)


3、样式初始化,使用scss变量


1、导入初始样式,导出变量值


 2、在main.js中引入

import '@/styles/index.scss'

3、配置webpack

css: {loaderOptions: {sass: {// 8版本用prependData:prependData: `@import "@/styles/variables.scss"; // scss文件地址@import "@/styles/mixin.scss"; // scss文件地址`}}}

4、使用svg,全局注册


1、svg图标导入到项目

 2、在components文件夹下创建SvgIcon组件



4、在icons 文件夹下新建index.js

import SvgIcon from '@/components/SvgIcon'const svgRequired = require.context('./svg', false, /\.svg$/)
svgRequired.keys().forEach((item) => svgRequired(item))export default (app) => {app.component('svg-icon', SvgIcon)
}

5、在main.js中引入

import SvgIcon from '@/icons'
const app=createApp(App)
SvgIcon(app)

6、安装依赖

cnpm i --save-dev svg-sprite-loader@6.0.9

7、配置webpack

const path = require('path')
function resolve(dir) {return path.join(__dirname, dir)
}
const webpack = require('webpack')module.exports = {
chainWebpack(config) {// 设置 svg-sprite-loader// config 为 webpack 配置对象// config.module 表示创建一个具名规则,以后用来修改规则config.module// 规则.rule('svg')// 忽略.exclude.add(resolve('src/icons'))// 结束.end()// config.module 表示创建一个具名规则,以后用来修改规则config.module// 规则.rule('icons')// 正则,解析 .svg 格式文件.test(/\.svg$/)// 解析的文件.include.add(resolve('src/icons'))// 结束.end()// 新增了一个解析的loader.use('svg-sprite-loader')// 具体的loader.loader('svg-sprite-loader')// loader 的配置.options({symbolId: 'icon-[name]'})// 结束.end()config.plugin('ignore').use(new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn$/))config.module.rule('icons').test(/\.svg$/).include.add(resolve('src/icons')).end().use('svg-sprite-loader').loader('svg-sprite-loader').options({symbolId: 'icon-[name]'}).end()},
}

8、使用


5、请求封装


1、安装axios 

cnpm i axios --save

 2、新建utils文件夹,新建auth.js设置过期时间

const TOKEN_TIME = 'tokenTime'const TOKEN_TIME_VALUE = 2 * 60 * 60 * 1000// 登录时设置时间
export const setTokenTime = () => {localStorage.setItem(TOKEN_TIME, Date.now())
}// 获取
export const getTokenTime = () => {return localStorage.getItem(TOKEN_TIME)
}// 是否已经过期
export const diffTokenTime = () => {const currentTime = Date.now()const tokenTime = getTokenTime()return currentTime - tokenTime > TOKEN_TIME_VALUE
}

3、新建api文件夹,新建request.js文件

import axios from 'axios'
import { ElMessage } from 'element-plus'
import { diffTokenTime } from '@/utils/auth'
import store from '@/store'
const service = axios.create({baseURL: process.env.VUE_APP_BASE_API,timeout: 5000
})service.interceptors.request.use((config) => {if (localStorage.getItem('token')) {if (diffTokenTime()) {store.dispatch('app/logout')return Promise.reject(new Error('token 失效了'))}}config.headers.Authorization = localStorage.getItem('token')return config},(error) => {return Promise.reject(new Error(error))}
)service.interceptors.response.use((response) => {const { data, meta } = response.dataif (meta.status === 200 || meta.status === 201) {return data} else {ElMessage.error(meta.msg)return Promise.reject(new Error(meta.msg))}},(error) => {console.log(error.response)error.response && ElMessage.error(error.response.data)return Promise.reject(new Error(error.response.data))}
)
export default service

4、本地跨域配置

devServer: {https: false,hotOnly: false,open:true,port:9000,proxy: {'/api': {target: 'https://*******/api/private/v1/',changeOrigin: true,pathRewrite: {'^/api': ''}}}},

5、全局坏境变量定义

 新建 .env.development、.env.production文件

ENV = 'development'VUE_APP_BASE_API = '/api'

ENV = 'production'VUE_APP_BASE_API = '/prod-api'

6、全局导航守卫 

import { createRouter, createWebHashHistory } from 'vue-router'const routes = [{path: '/login',name: 'Login',component: () => import('../views/login/index.vue')},{path: '/',name: '/',component: () => import('../layout'),redirect: '/users',children: [{path: 'users',name: 'users',component: () => import('@/views/users/index.vue')},{path: 'categories',name: 'categories',component: () => import('@/views/categories/index.vue')},{path: 'goods',name: 'goods',component: () => import('@/views/goods/index.vue')},{path: 'orders',name: 'orders',component: () => import('@/views/orders/index.vue')},{path: 'params',name: 'params',component: () => import('@/views/params/index.vue')},{path: 'reports',name: 'reports',component: () => import('@/views/reports/index.vue')},{path: 'rights',name: 'rights',component: () => import('@/views/rights/index.vue')},{path: 'roles',name: 'roles',component: () => import('@/views/roles/index.vue')}]}
]const router = createRouter({history: createWebHashHistory(),routes
})export default router

1、新建router/permission.js

import router from './index'
import store from '@/store'const whiteList = ['/login']
router.beforeEach((to, from, next) => {if (store.getters.token) {if (to.path === '/login') {next('/')} else {next()}} else {if (whiteList.includes(to.path)) {next()} else {next('/login')}}
})

2、main.js引入 

import '@/router/permission'

5、登录 


1、新增登录界面login/index.vue



2、新建api/login.js

import request from './request'export const login = (data) => {return request({url: '/login',method: 'POST',data})
}

3、新建store/modules/app.js

import { login as loginApi } from '@/api/login'
import router from '@/router'
import { setTokenTime } from '@/utils/auth'
export default {namespaced: true,state: () => ({token: localStorage.getItem('token') || '',siderType: true,}),mutations: {setToken(state, token) {state.token = tokenlocalStorage.setItem('token', token)},changeSiderType(state) {state.siderType = !state.siderType},},actions: {login({ commit }, userInfo) {return new Promise((resolve, reject) => {loginApi(userInfo).then((res) => {console.log(res)commit('setToken', res.token)setTokenTime()router.replace('/')resolve()}).catch((err) => {reject(err)})})},// 退出logout({ commit }) {commit('setToken', '')localStorage.clear()router.replace('/login')}}
}

4、store/getters.js、store/index.js

export default {token: (state) => state.app.token,siderType: (state) => state.app.siderType,
}

import { createStore } from 'vuex'
import app from './modules/app'
import getters from './getters'
export default createStore({modules: {app},getters
})


3、Layout 布局




1、左侧菜单 新建layout/Menu/index.vue


menu数据 

{"data": [{"id": 125,"authName": "用户管理","path": "users","children": [{"id": 110,"authName": "用户列表","path": "users","children": [],"order": null}],"order": 1},{"id": 103,"authName": "权限管理","path": "rights","children": [{"id": 111,"authName": "角色列表","path": "roles","children": [],"order": null},{"id": 112,"authName": "权限列表","path": "rights","children": [],"order": null}],"order": 2},{"id": 101,"authName": "商品管理","path": "goods","children": [{"id": 104,"authName": "商品列表","path": "goods","children": [],"order": 1},{"id": 115,"authName": "分类参数","path": "params","children": [],"order": 2},{"id": 121,"authName": "商品分类","path": "categories","children": [],"order": 3}],"order": 3},{"id": 102,"authName": "订单管理","path": "orders","children": [{"id": 107,"authName": "订单列表","path": "orders","children": [],"order": null}],"order": 4},{"id": 145,"authName": "数据统计","path": "reports","children": [{"id": 146,"authName": "数据报表","path": "reports","children": [],"order": null}],"order": 5}],"meta": {"msg": "获取菜单列表成功","status": 200}
}

2、右侧头部



1、hamburger.vue 控制左侧菜单折叠展开



2、breadcrumb.vue 面包屑导航



3、screenFull.vue 全屏组件

1、安装

cnpm i screenfull --save

2、使用



4、driver引导组件

1、安装

cnpm i driver.js --save

2、使用


 5、头像下拉 退出



4、用户管理开发

1、搜索功能 、结果列表展示



2、新建components/dialog.vue 新增、编辑用户弹框组件





3、新建全局时间过滤器


1、安装dayjs

cnpm i dayjs --save

2、新建utils/filters.js


import dayjs from 'dayjs'const filterTimes = (val,format='YYYY-MM-DD') =>{if(!isNull(val)){val = parseInt(val)*1000return dayjs(val).format(format)}else{return '--'}
}export const isNull = (val)=>{if(!val) return trueif(JSON.stringify(val)==="{}") return trueif(JSON.stringify(val)==="[]") return true
}export default (app)=>{app.config.globalProperties.$filters={filterTimes}
}

3、main.js传入app

import filters from './utils/filters'
filters(app)

4、使用



推荐阅读
  • 如何使用ES6语法编写Webpack配置文件? ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 如何在任意浏览器中轻松安装并使用VSCode——Codeserver简易指南
    code-server 是一款强大的工具,允许用户在任何服务器上部署 VSCode,并通过浏览器进行访问和使用。这一解决方案不仅简化了开发环境的搭建过程,还提供了高度灵活的工作方式。用户只需访问 GitHub 上的官方仓库(GitHub-coder/code-server),即可获取详细的安装和配置指南,快速启动并运行 code-server。无论是个人开发者还是团队协作,code-server 都能提供高效、便捷的代码编辑体验。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
author-avatar
奇奇丶承诺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有