手把手教你写毕设-前端篇-day02

一年经验的全栈程序员,目前头发健在,但不知道能撑多久。

目录

前言

一、Element plus图标导入

 二、Axios安装和使用

1. 安装Axios

2. 封装Axios

3. 登录接口

4. 跨域解决

三、登录页面的完善

1. 登录成功失败弹窗提示

 2. 页面跳转

四、路由守卫 

1. Cookie是什么

2.  VueUse

3. 使用VueUse

4. 全局路由拦截

总结

🙌 求点赞、收藏、关注! 



前言

上一篇文章我们学习了如何创建前端项目并且配置一些样式依赖Tailwind CSS、Element plus,以及路由配置的建立,和登录页面的编写。

这一篇我们将完成Element plus图标的导入和axios依赖添加,登录接口的封装,以及解决前后端跨域的问题。

上一篇的地址手把手教你写毕设-前端篇-day01


一、Element plus图标导入

命令行输入

npm install @element-plus/icons-vue

 然后在src/main.js文件把图标引入

import '../src/assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
// 导入路由
import router from './router'
// 导入 Element Plus 图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
const app = createApp(App)
// 引入图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}
// 应用路由
app.use(router)
app.mount('#app')

启动项目就可以看到登录页面以及有图标显示了,这种方式的图标导入是全局的,因为main.js的页面的主js文件 

登录页src/pages/login.vue里面上一篇文章我们就以及把图标写入了prefix-icon="User"

<!-- 用户名输入框 -->
            <el-form-item prop="username">
              <el-input
                v-model="loginForm.username"
                placeholder="请输入账号"
                prefix-icon="User"
                clearable
              />
            </el-form-item>
            
            <!-- 密码输入框 -->
            <el-form-item prop="password">
              <el-input
                v-model="loginForm.password"
                placeholder="请输入密码"
                prefix-icon="Lock"
                show-password
                clearable
              />
            </el-form-item>

 二、Axios安装和使用

1. 安装Axios

命令行输入

npm install axios

安装完成

2. 封装Axios

在目录src下新建一个文件夹util存放一些公共的实例或者方法,并且创建axios.js文件

axios.js文件代码如下

import axios from "axios";

// 创建 Axios 实例
const http_axios = axios.create({
    baseURL: "api", 
    timeout: 7000, // 请求超时时间
})

// 暴露出去
export default http_axios;

3. 登录接口

在src目录下面创建api文件夹用来专门放接口的。

在api里面建立一些login.js的文件,登录接口放在里面

login.js代码内容

//导入axios的实例
import axios from "../util/axios";

// 登录接口
export function login(username, password) {
    return axios.post("/login", {username, password})
}

4. 跨域解决

 跨域问题(Cross-Origin Issues)是Web开发中常见的安全限制,指的是浏览器出于安全考虑,阻止网页从一个源(origin)向另一个不同的源发起请求的行为。

大家仔细观察可以看到前端应用启动时候端口是5173

后端启动的端口也不一样,所以这时候就需要继续跨域处理 。

其实vue官网的解决方案就是打开根目录下的vite.config.js加入

server: {
    proxy: {
      '/api': {
        target: 'http://localhost:9090',// 你的后端接口API地址
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ''),
      },
    }
  },

三、登录页面的完善

1. 登录成功失败弹窗提示

登录的用户名和密码先写固定后期我们在开发后端,在login.vue文件下面找到登录按钮的方法handleLogin,加上代码

// 登录处理函数
const handleLogin = () => {
  loginFormRef.value.validate(valid => {
    if (valid) {
      if (loginForm.value.username === "admin" && loginForm.value.password === '123456') {
        ElMessage({
          message: '登录成功',
          type: 'success'
        });
        
      } else {
        ElMessage({
          message: '用户名或密码错误',
          type: 'error'
        });
      }
    }
  })
}

 这样就完成了

 2. 页面跳转

登录成功我们需要进行页面跳转

首先我们需要在pages页面文件夹下面创建index.vue首页页面

接下来需要在router/index.js文件下面把这个页面的路由添加进去

import { createRouter, createWebHashHistory } from 'vue-router'
import Login from '../pages/login.vue'
import Index from '../pages/index.vue'
//这里是声明所有路由
const routes = [
    {
        path: '/login', // 路由地址
        component: Login, // 对应组件
        meta: { // meta 信息
            title: '登录页' // 页面标题
        }
    },
    {
        path: '/', // 路由地址
        component: Index, // 对应组件
        meta: { // meta 信息
            title: '首页' // 页面标题
        }
    }
]

// 创建路由
const router = createRouter({
    // 指定路由的历史管理方式,hash 模式指的是 URL 的路径是通过 hash 符号(#)进行标识
    history: createWebHashHistory(),
    routes,
})

// 导出语句,将 router 对象导出,以便其他文件可以导入和使用这个对象
export default router

在登录成功时候我们需要进行页面跳转,所以打开login.vue文件添加路由跳转代码

......
import { useRouter } from 'vue-router';

const router = useRouter()
......
// 登录处理函数
const handleLogin = () => {
  loginFormRef.value.validate(valid => {
    if (valid) {
      if (loginForm.value.username === "admin" && loginForm.value.password === '123456') {
        ElMessage({
          message: '登录成功',
          type: 'success'
        });
        //路由跳转到首页
        router.push('/')
      } else {
        ElMessage({
          message: '用户名或密码错误',
          type: 'error'
        });
      }
    }
  })
}

四、路由守卫 

路由守卫是 Vue Router 提供的一种机制,允许你在路由导航过程中插入钩子函数,用于控制导航行为或执行特定操作。路由守卫主要分为三类:全局守卫、路由独享守卫和组件内守卫。

大家可以看到每次启动项目他默认访问http://localhost:5173/#/这个路径,不会直接访问登录页面,这时候我们就需要通过全局路由守卫进行页面跳转逻辑判断。

1. Cookie是什么

Cookie 是网站存储在用户浏览器中的小型文本数据,用于跟踪和识别用户状态。它是 Web 开发中重要的客户端存储机制之一。

简单来说我们后端登录成功会返回一个Token到前端进行校验判断是否登录成功以及后续的一些认证。

随便打开一个网站按住F12就可以打开开发者工具可以看到网页的cookie

2.  VueUse

VueUse 是一个基于 Composition API 的 Vue 工具函数集合,提供了大量实用的可组合函数(composable functions),帮助开发者更高效地构建 Vue 应用。

简单来说VueUse可以操控一些方法对网页的cookie进行增删改查。

🆗经过上面的介绍,我们将使用VueUse进行登录成功得到的Token存放网页的cookie里面。

3. 使用VueUse

命令行输入

npm i @vueuse/integrations

npm i universal-cookie

这里为什么要安装 universal-cookie?,因为对网页的cookie的操作封装在vueuse里面,有兴趣的可以打开安装好的自行查看。

安装完成,我们需要在src/composables文件夹下面创建一个auth.js文件,封装操作cookie的方法

import { useCookies } from '@vueuse/integrations/useCookies'

// 存储在 Cookie 中的 Token 的 key
const TOKEN_KEY = 'Authorization'
const cookie = useCookies()

// 获取 Token 值
export function getToken() {
    return cookie.get(TOKEN_KEY)
}

// 设置 Token 到 Cookie 中
export function setToken(token) {
    return cookie.set(TOKEN_KEY, token)
}

// 删除 Token
export function removeToken() {
    return cookie.remove(TOKEN_KEY)
}

在登录成功里面我们保存一个自定义的token先

.....
//导入方法
import { setToken } from '../composables/auth'
.....

// 登录处理函数
const handleLogin = () => {
  loginFormRef.value.validate(valid => {
    if (valid) {
      if (loginForm.value.username === "admin" && loginForm.value.password === '123456') {
        ElMessage({
          message: '登录成功',
          type: 'success'
        });
        //保存Token
        setToken("abcdefghijklnm")
        //路由跳转到首页
        router.push('/')
      } else {
        ElMessage({
          message: '用户名或密码错误',
          type: 'error'
        });
      }
    }
  })
}
</script>

 运行项目,可以看到外面的token保存成功

4. 全局路由拦截

这一步我们需要完成前面开头说的这个问题

 大家可以看到每次启动项目他默认访问http://localhost:5173/#/这个路径,不会直接访问登录页面,这时候我们就需要通过全局路由守卫进行页面跳转逻辑判断。

在src/util文件夹下创建permission.js,放全局路由守卫的代码

// 导入路由实例 - 从router目录下的index.js文件中导入已经配置好的路由实例
import router from '../router/index'

// 导入获取token的工具函数 - 从composables/auth.js中导入getToken方法
import { getToken } from '../composables/auth'

// 全局路由前置守卫
// 每次路由跳转前都会执行这个回调函数
router.beforeEach((to, from, next) => {
    // 打印日志,方便调试
    console.log('==> 全局路由前置守卫')
    
    // 从本地存储中获取用户token
    let token = getToken()
    
    // 检查用户是否未登录(token不存在)并且路径不是login
    if (!token && to.path !== '/login') {
        // 使用Element Plus的消息组件提示用户需要登录
        ElMessage({
            message: '请先登录',
            type: 'warning'
        });
        
        // 如果用户未登录,则重定向到登录页面
        // 注意:这里使用了path而不是name,确保即使路由配置改变也能正确跳转
        next({ path: '/login' })
    } else {
        // 如果用户已登录,则放行,继续正常导航
        next()
    }
    
    /* 
     * 补充说明:
     * 1. to: 即将要进入的目标路由对象
     * 2. from: 当前导航正要离开的路由对象
     * 3. next: 必须调用此方法来resolve这个钩子
     *    - next(): 进行管道中的下一个钩子
     *    - next(false): 中断当前导航
     *    - next('/path'): 跳转到一个不同的地址
     */
})

// 全局路由后置守卫
// 路由跳转完成后执行(没有next参数,不会影响导航)
router.afterEach((to, from) => {
    /*
     * 动态设置页面标题
     * 逻辑:如果路由元信息中有title字段,则使用它,否则使用空字符串
     * 然后统一加上" - Weblog"后缀
     */
    let title = (to.meta.title ? to.meta.title : '')
    
    // 修改文档标题
    document.title = title
    
    /* 
     * 补充说明:
     * 1. 这里可以添加其他后置操作,如:
     *    - 页面访问统计
     *    - 滚动回顶部
     *    - 关闭加载动画等
     * 2. 与beforeEach不同,afterEach没有next参数,因为导航已经完成
     */
})

进行在主js文件main.js加入路由注册

..............
// 导入路由
import router from './router'
// 导入全局路由守卫
import '../src/util/permission'
...............

 删除刚刚哪个cookie里面的值刷新页面就可以看到

总结

本文我们将上一篇文章的登录页面进行完善,并且讲解了Axios发送网络请求和跨域问题的解决,以及全局路由的的使用等。后续的后端等把前端页面完善进行编写。

🙌 求点赞、收藏、关注! 

如果这篇文章对你有帮助,不妨:
👍 点个赞 → 让更多人看到这篇干货!
⭐ 收藏一下 → 方便以后随时查阅!
🔔 加关注 → 获取更多 前端/后端/全栈技术深度解析

你的支持,是我持续创作的最大动力! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二七有头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值