前后端项目分离之前端(vue项目)如何调用后端接口

本文所用vue-cli是3.0版本的,所以首先需要创建一个vue.config.js文件,然后配置axios,就可以请求接口获取数据了。
一 简单实现前端调用后端接口:
1.main.js文件中:

import axios from 'axios'
 
Vue.prototype.$axios = axios
 
axios.defaults.baseURL = '请求地址';//后端开发环境地址
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';//配置请求头信息。
//axios.defaults.headers.common['accessToken'] = 'FA4C308D5E8F6409E01344ADDAEB4C71';

2.vue.config.js文件完整代码

module.exports = {
  /* 部署生产环境和开发环境下的URL:可对当前环境进行区分,baseUrl 从 Vue CLI 3.3 起已弃用,要使用publicPath */
  /* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' */
  publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
  /* 输出文件目录:在npm run build时,生成文件的目录名称 */
  outputDir: 'dist',
  /* 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 */
  assetsDir: "assets",
  /* 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度 */
  productionSourceMap: false,
  /* 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存,你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) */
  filenameHashing: false,
  /* 代码保存时进行eslint检测 */
  lintOnSave: true,
  /* webpack-dev-server 相关配置 */
  devServer: {
    /* 自动打开浏览器 */
    open: false,
    /* 设置为0.0.0.0则所有的地址均能访问 */
    host: '0.0.0.0',
    port: 9528,
    https: false,
    hotOnly: false,
    /* 使用代理 */
    proxy: {
      '/api': {
        target: '请求地址',
        secure: false,  // 如果是https接口,需要配置这个参数
        ws: true,//是否代理websockets
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
}

3.在login.vue中使用

this.$axios({
        method: "post",
        url: "/user/login",
        contentType: "application/json;chart=utf-8",
        dataType: "json",
        data,
      }).then((res) => {
        if (res.data.status === "1") {
          this.$Message.info("登录成功!");
          this.logining = false;
          window.sessionStorage.setItem("userSession", res.data.data.id);
          window.sessionStorage.setItem("userName", res.data.data.userName);
          this.$router.push({ path: "/open/default" });
        } else {
          this.$Message.info("登录失败!");
          this.logining = false;
          this.modelLogin.password = "";
        }
      });

以上 即可实现前端调用后端接口。

二 实现拦截器和路由登录拦截功能
以下为进阶版,将所有的接口调用放在一个user.js文件中(该文件处于http文件夹下)以后其他接口均可放在里面:

import axios from '../interceptors.js'

// 登录
export const login = (data) => {
  return axios({
    url: '/user/login',
    method: 'post',
    data
  })
}

// 查看用户有没有登录
export const getSession = (data) => {
    return axios({
      url: '/user/getSession',
      method: 'post',
      data
    })
  }

Vue+axios(interceptors) 实现http拦截 + router路由拦截 (双拦截)!!!(论文中可写,可见https://www.jianshu.com/p/115b4c79a75d)
首先建文件夹http 文件夹下简历一个文件interceptors.js:

/*拦截器*/
import axios from 'axios'
import Vue from 'vue'

import {
  Message,
  LoadingBar
} from 'view-design'

Vue.prototype.HOST = '/api'
// Vue.prototype.$http = axios
Vue.prototype.$axios = axios
axios.defaults.baseURL = 'http://localhost:8080/c';//后端开发环境地址
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';//配置请求头信息

// 超时时间
axios.defaults.timeout = 12000
// http请求拦截器
axios.interceptors.request.use(config => {
  LoadingBar.start();
  return config
}, error => {
  LoadingBar.error();
  Message.error({
    message: '加载超时'
  })
  return Promise.reject(error)
})
// http响应拦截器
axios.interceptors.response.use(data => { // 响应成功关闭loading
  LoadingBar.finish();
  return data
}, error => {
  LoadingBar.error();
  Message.error({
    message: '加载失败'
  })
  return Promise.reject(error)
})

export default axios

main.js文件不需要再引入axios了。(以上初级版是在main.js中引入的)
在需要使用接口的vue文件中如此用:

import { login } from '../http/api/user'
login()
 {
   const { userName, password } = this.modelLogin;
      if (!userName) {
        this.$Message.info("用户名不能为空");
        return;
      }
      if (!password) {
        this.$Message.info("密码不能为空");
        return;
      }
      this.clearLocalStorage();
      this.logining = true;
      let data = {
        userName: this.modelLogin.userName,
        password: this.modelLogin.password,
      };
      login(data).then(res => {
          if (res.data.status === "1") {
            this.$Message.info("登录成功!");
            this.logining = false;
            window.localStorage.setItem("userSession", res.data.data.id);
            window.localStorage.setItem("userName", res.data.data.userName);
            this.$router.push({ path: "/open/default" });
          } else {
            this.$Message.info("登录失败!");
            this.logining = false;
            this.modelLogin.password = "";
          }
        })
        .catch(() => {
          this.logining = false;
        })
 }

登录路由拦截功能(某些页面需登录才可以看):
router文件夹下的index.js文件中:

import Vue from 'vue'
import Router from 'vue-router'
import Home from '../components/Home.vue'
import Login from '../components/Login.vue'
Vue.use(Router)

const router = new Router({
  routes: [{
      path: '/',
      meta: {
        requireAuth: false, // 添加该字段,为true表示进入这个路由是需要登录的
      },
      component: Home,
      redirect: '/open/default'
    },
    {
      path: '/open/default', //到时候地址栏会显示的路径
      meta: {
        requireAuth: true, // 添加该字段,为true表示进入这个路由是需要登录的
      },
      name: 'Home',
      component: Home // Home是组件的名字,这个路由对应跳转到的组件。。注意component没有加“s”.
    },
    {
      path: '/open/Login',
      meta: {
        requireAuth: false,
      },
      name: 'Login',
      component: Login
    }
  ],
  mode: "hash"
})

router.beforeEach((to, from, next) => {
  if (to.meta.requireAuth) { // 判断是否需要登录权限
    if (localStorage.getItem('userSession')) { // 判断是否登录
      next()
    } else { // 没登录则跳转到登录界面
      next({
        path: '/open/Login',
        query: {
          redirect: to.fullPath
        }
      })
    }
  } else {
    next()
  }
})

export default router

以上即可实现路由登录检查;

三 解决 Vue 重复点击相同路由,出现 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation 问题
只需要在以上router文件夹的index.js中增加:

const VueRouterPush = Router.prototype.push
Router.prototype.push = function push (to) {
  return VueRouterPush.call(this, to).catch(err => err)
}
 
  • 38
    点赞
  • 328
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 外卖项目前后端分离是指将项目前端部分和后端部分进行分离开发,前端使用Vue框架,后端使用Spring Boot框架。 前端使用Vue框架可以提供良好的用户界面和交互体验。Vue具有组件化的特点,使得前端开发更加模块化和可维护。同时,Vue的数据绑定和响应式设计可以帮助实现快速更新页面的功能。通过Vue,用户可以方便地浏览外卖项目的菜单、下单、支付等操作,提升用户的使用体验。 后端使用Spring Boot框架可以提供强大的后台支持。Spring Boot是一种轻量级的Java框架,可以快速搭建和部署项目,减少开发的复杂度。使用Spring Boot,开发人员可以方便地实现外卖项目的后台逻辑,例如订单的处理、菜单的管理、支付的接口等。同时,Spring Boot集成了许多常用且可靠的开源库,为项目提供了高效、稳定的基础设施。 前后端分离的优势在于前端后端可以并行开发,提高开发效率。前端后端之间通过定义接口进行通信,降低了耦合度,灵活性更强。同时,单独部署前端后端也可以提高项目的可维护性和可扩展性。例如,当需要添加新的功能或修改现有功能时,只需要修改相应的前端后端代码,而不会影响到整个项目。 总之,外卖项目前后端分离以及使用Vue和Spring Boot框架的设计选择,可以帮助实现一个高效、稳定、可扩展的外卖平台。 ### 回答2: 外卖项目采用前后端分离的架构,前端使用Vue框架,后端采用Spring Boot框架。 前端使用Vue框架可以实现用户界面的可视化设计和交互体验。Vue框架具有简单易用、灵活可扩展、高效性能等特点,适用于构建复杂的单页面应用(SPA)。通过Vue框架,可以实现用户注册、登录、浏览菜单、购物车管理、订单处理等功能的前端设计和开发。前端通过调用后端接口,获取后端处理的数据,并将数据展示在用户界面上。 后端使用Spring Boot框架可以实现业务逻辑的处理和数据存储。Spring Boot框架提供了快速构建、简化配置和集成多种功能的特性,适用于快速开发和维护可靠的应用程序。通过Spring Boot框架,可以处理用户注册、登录验证、菜单管理、订单处理等业务逻辑,并与数据库进行交互,存储与外卖项目相关的数据。后端还需要提供RESTful接口,供前端调用和交互。 前后端分离架构的好处是可以实现前端后端的解耦,提高开发效率和维护性。前端后端可以同时进行开发,并可采用不同的技术栈,使得团队成员能够专注于自己的领域。前后端分离还可以实现多端复用,例如可以用同一组后端接口提供给Web端和移动端调用。 总的来说,外卖项目采用前后端分离的架构,借助Vue和Spring Boot框架实现了用户界面的展示和交互以及业务逻辑的处理和数据存储,从而使得项目开发更加高效和可维护。 ### 回答3: 外卖项目采用前后端分离的架构,前端使用Vue.js框架进行开发,后端使用Spring Boot框架进行开发。 前端使用Vue.js框架的原因是因为Vue.js具有简洁、高效、灵活的特点,能够轻松构建交互式的用户界面。Vue.js还拥有一套完整的生态系统,能够方便地进行组件化开发,并提供了强大的工具来处理数据和状态的变化。 后端使用Spring Boot框架的原因是因为Spring Boot是一个简化了Spring开发的微框架,能够快速构建可独立运行的、生产级的应用。Spring Boot提供了大量的开箱即用的特性,如自动配置、快速开发等,能够极大地提高开发效率。 在外卖项目中,前端负责用户界面的展示和交互逻辑的实现。前端通过Vue.js进行组件化开发,将页面拆分为多个可复用的组件,提高开发效率和代码维护性。前端还通过Vue.js提供的路由功能,实现不同页面之间的跳转和导航。同时,前端还与后端通过HTTP协议进行通信,获取后端提供的数据和服务,并将其展示给用户。 后端负责处理前端发送的请求,并根据业务逻辑进行相应的处理,最终返回数据给前端后端还负责与数据库交互,对数据进行增删改查操作。后端使用Spring Boot提供的RESTful风格的API,能够轻松构建出符合规范的接口。同时,后端还可以利用Spring Security进行权限管理,确保只有具备相应权限的用户才能访问特定的接口。 综上所述,外卖项目采用前后端分离的架构,前端使用Vue.js框架进行开发,后端使用Spring Boot框架进行开发,能够提高开发效率和代码的可维护性,同时还能够满足用户对于界面交互和数据操作的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值