热门标签 | 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、使用



推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Inno Setup区段之Components篇相关知识详解
    本文详细介绍了Inno Setup区段之Components篇相关的知识,包括Components和Types的使用方式以及各个参数的说明,希望对读者有一定的参考价值。内容涵盖了ComponentsName、Description、Types、ExtraDiskSpaceRequired、ExtraDiskSpaceRequiredFlags等多个关键词,帮助读者更好地理解和应用Inno Setup区段之Components篇的知识。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • npminstall-Dbabelcorebabelpreset-envbabelplugin-transform-runtimebabelpolyfillbabel-loader ... [详细]
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社区 版权所有