12.9 Vue3+Vuex+Js+El-Plus+vite(项目搭建)

参考案例

vue-element-admin:https://panjiachen.github.io/vue-element-admin/#/dashboard

豆皮:https://www.douphp.com/

课后服务平台:https://www.axureshop.com/ys/2206290

element-plus-admin:https://element-plus-admin.hsianglee.cn/#/Login?from=%252FDashboard%252FWorkplace

ivew Admin plus:https://adminplus.iviewui.com/dashboard/console

C端:consumer消费者【我们看的端】

B端:business 商家【element-plus饿了么】

应用:服务器端,用户端,后台管理【B端】

vue3+vuex+ts+el-plus+vite+axios+router

初始化项目

TypeScript 复制代码
//创建项目
pnpm create vite my-vue3

//进目录
cd my-vue3

//安装依赖
pnpm i

//启动
npm run dev

配置proxy跨域和路径别名

vite.config.js

通过配置服务器反向代理,实现跨域

JavaScript 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from "path"

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve:{
    // 设置别名
    alias:{
      "@":path.resolve(__dirname,'src')
    }
  },
  server:{
    // 配置服务器代码,实现跨域
    proxy:{
       // 所有以 'api'为前缀的借口都会转向http://localhost:3001
      "/api":{
        target:"http://localhost:3001",
        changeOrigin:true,
        // 去掉接口中的 'api' 以便和后端接口匹配
        rewrite:(path)=>path.replace(/^\/api/,'')
      }
    }
  }
})

安装包依赖

JSON 复制代码
"dependencies": {
    "@element-plus/icons-vue": "^2.1.0",
    "axios": "^1.7.7",
    "dayjs": "^1.11.9",
    "element-plus": "^2.3.7",
    "lodash": "^4.17.21",
    "sass": "^1.81.0",
    "vue": "^3.5.12",
    "vue-router": "^4.5.0",
    "vuex": "^4.1.0"
  }

配置路由

创建基础组件

  • src/pages/notFound/index.vue 404页面

  • src/pages/login/index.vue 登录页面

  • src/pages/layout/index.vue 管理页面

src/router/index.js

配置路由, 设置路由拦截

JavaScript 复制代码
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
    {
        path: '/',
        name: 'admin',
        component: () => import('@/pages/layout/index.vue')
    },
    {
        path: '/login',
        name: 'login',
        component: () => import('@/pages/login/index.vue')
    },
    { 
        // 推荐使用这种方式,不要使用重定向的方式
        path: '/:pathMatch(.*)*', 
        name: 'NotFound', 
        component: () => import('@/pages/notFound/index.vue')
    }
]

const router = createRouter({history: createWebHistory(),
    routes, // routes: routes 的缩写
})

export default router

main.js引入路由

JavaScript 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')

App.vue定义路由出口

Plain 复制代码
<template>
  <RouterView></RouterView>
</template>

添加路由拦截

src/router/index.js

JavaScript 复制代码
...
//路由拦截
router.beforeEach((to,from)=>{
    let token = sessionStorage.getItem('token');
    // 如果token不存在,并且要跳转的不是login页,则重定向到login
    if(!token && to.fullPath !== '/login'){
        return {
            path:'/login'
        }
        // return '/login'
    }
})
...

API封装(axios的二次封装)

api/config.js

  • 配置请求url,超时时间

  • 配置请求拦截器,以便携带token信息

  • 配置相应拦截器,集中处理错误

JavaScript 复制代码
import axios from "axios";
// 创建axios实例
const instance = axios.create({
    baseURL:'/api',
    // 超时时间
    timeout:5000
})

// 添加请求拦截器,会在发送请求之前执行相应的需求
// 应用场景:携带token 
instance.interceptors.request.use(
    config=>{
        // 携带token
        let token = sessionStorage.getItem('token')
        if(token){
            // config.headers.common['Authorization'] = 'Bearer '+token;
            // 如果上面格式报错,替换成下面这种形式
            config.headers.Authorization = 'Bearer '+ token;
        }
        return config;
    },
    function(error){
        return Promise.reject(error)
    }
)

// 添加响应拦截器,会在返回数据后先执行相应的需求
// 应用场景:集中处理错误响应
instance.interceptors.response.use((response)=>{
        let {code} = response.data;
        if(code === 401){
            // token失效
        }
        return response;
    },function(error){
        console.log("res-err",error);
        return Promise.reject(error);
})
export default instance;

举例:接口的第一种写法

api/news.js

JavaScript 复制代码
import axios  from "./config"

// 添加新闻
export function _addNews(data) {
    // return 的是axios()调用后返回的promise对象
    return axios({
        url:'/news',
        method:'post',
        data
    })
}

// 获取新闻列表
export function _getNews(params) {
    return axios({
        url:'/news',
        method:'get',
        params
    })
}

// 获取制定newsId的新闻
export function _getOneNews(newId) {
    return axios({
        url:`/news/${newId}`,
        method:'get'
    })
}

// 编辑新闻
export function _editNews(data) {
    return axios({
        url:'/news',
        method:'put',
        data
    })
}

// 删除新闻
export function _delNews(params) {
    return axios({
        url:'/news',
        method:'delete',
        params
    })
}

举例:接口第二种写法

api/new.js

JavaScript 复制代码
import axios  from "./config"

// 添加新闻
// export function _addNews(data) {
    // return 的是axios()调用后返回的promise对象
    // return axios({
        // url:'/news',
        // method:'post',
        // data
    // })
// }
export const _addNews = data => axios.post('/news',data);

// 获取制定newsId的新闻
export function _getOneNews(newId) {
    return axios({
        url:`/news/${newId}`,
        method:'get'
    })
}

// 编辑新闻
export function _editNews(data) {
    return axios({
        url:'/news',
        method:'put',
        data
    })
}

// 删除新闻
export function _delNews(params) {
    return axios({
        url:'/news',
        method:'delete',
        params
    })
}

接口在组件中使用

JavaScript 复制代码
import { onMounted } from 'vue';
import { _addUsers } from '@/api/user.js';
onMounted(async () => {
    let res = await _addUsers();
    console.log(res);
})
相关推荐
Kaze_story2 小时前
Vue第四节:组件化、组件生命周期
前端·javascript·vue.js
卓码软件测评2 小时前
第三方软件验收评测机构【Gatling安装指南:Java环境配置和IDE插件安装】
java·开发语言·ide·测试工具·负载均衡
weixin_307779132 小时前
Jenkins中的Jakarta Activation API插件:功能、使用与最佳实践
运维·开发语言·ci/cd·自动化·jenkins
妮妮分享2 小时前
H5获取定位的方式是什么?
java·前端·javascript
weixin_439930642 小时前
前端js日期计算跨月导致的错误
开发语言·前端·javascript
柳安2 小时前
手写new操作符执行过程
前端·javascript
UIUV3 小时前
JavaScript内存管理与闭包原理:从底层到实践的全面解析
前端·javascript·代码规范
liu****3 小时前
9.二叉树(一)
c语言·开发语言·数据结构·算法·链表
她说..3 小时前
Spring AOP场景2——数据脱敏(附带源码)
java·开发语言·java-ee·springboot·spring aop