vue-element-admin登录模块所踩的坑(登录请求真实数据)

vue-element-admin登录模块所踩的坑

前言

公司开发的项目前台选用了vue-element-template简单模板做二次开发,后台用的SpringBoot+Hibernate。话不多说,让我们直接进入登录模块。简单来说就是不再使用mock假数据,去后台请求真实的数据。

后台接口

这里是controller层的接口:
http://localhost:9001/login/loginByPhone。。。

@RestController
@RequestMapping("/login")
@CrossOrigin
public class SysLoginController {
	@Autowired
	private SysUserService userService;

	@RequestMapping(value="/loginByPhone",method=RequestMethod.POST)
	public Object findByUsernameAndPassword(@RequestBody Map<String,Object> loginInfo) {
		String username = (String) loginInfo.get("username");
		String password = (String) loginInfo.get("password");
		User result = userService.findByUsernameAndPassword(username, password);
		String token = UUID.randomUUID().toString().replace("-", "");
		Map<String,Object> result1 = new HashMap<>();
		result1.put("user", result);
		result1.put("token", token);
		if(result.getId() != null) {
			return result1;
		}else {
			return AjaxObject.newError("登录失败!").toString();
		}
	}

vue-element-template

登录流程

*1.src/view/login/index.vue页面文件中,其他的根据自己的需求做更改,点击登录时会进到handleLogin()方法中。

handleLogin() {
      var _this = this
      this.$refs.loginFormRef.validate(valid => {
        if (valid) {
          _this.$store.dispatch('user/Login', _this.loginForm).then(() => { // user/login这是store目录下的一个方法
            _this.$router.push({ path: this.redirect || '/' })
          }).catch(function(error) {
            _this.$message.error('登录失败,请检查用户名或密码!')
            console.log(error)
          })
        } else {
          console.log('error submit!!')
          return false
        }
      })
    }

_this.$store.dispatch(‘user/Login’, _this.loginForm)这句代码将会带我们进入流程的第二步。
2.src/store/modules/user.js
_this.store.dispatch(‘user/Login’, _this.loginForm),会到src/store/modules/user.js中请求Login方法。

// user Login自定义
  Login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      Login({ username: username.trim(), password: password }).then(response => {
        commit('SET_NAME', response.user.username)
        // 储存username,刷新页面时调用
        sessionStorage.setItem("username", JSON.stringify(response.user.username))
        sessionStorage.setItem("type", JSON.stringify(response.user.type))
        commit('SET_TYPE', response.user.type)
        commit('SET_TOKEN', response.token)
        setToken(response.token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

注意:Login是我自己定义的方法,需要在这个文件的第一行,把Login从’@/api/user’导进来

import { Login, logout, getUserInfo } from '@/api/user'

断点跟踪的话,你会发现参数 userInfo,就是_this.store.dispatch(‘user/Login’, _this.loginForm)中传递过来的参数。
这个方法中又去调用Login方法,(教你个快捷键–按住Ctrl点击Login方法会进到该方法中去)
3.src/api/user.js
这个模板中所有的请求都放在了api这个目录下,直接看Login方法,这里的data就是登录时你在输入框中输入的用户名跟密码。

/* 自定义,访问后台接口 */
export function Login(data) {
  return request({
    url: 'http://localhost:9001/login/loginByPhone',
    method: 'post',
    data
  })
}

到这里还没完哦,马上走完了,Login方法中去返回一个request…同样的方法,Ctrl点击,会发现它会走到下一步。

4.src/utils/request.js
这个里面才决定你是否成功登录的关键

import axios from 'axios'
/* import { MessageBox, Message } from 'element-ui' */
import store from '@/store'
import { getToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API
  timeout: 500000 // request timeout
})

service.interceptors.request.use(
  config => {

    if (store.getters.token) {
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)


service.interceptors.response.use(
  response => {
    const res = response.data
    console.info(res)
    if (res.token === null) {
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    return Promise.reject(error)
  }
)

export default service

它自己定义了一些返回的code,比如20000、50008、 50012 、50014,要把这些都改掉。我是根据用户名跟密码去请求后台数据,查到数据的同时会生成一个token,所以if条件中:if (res.token === null) {。。。},它肯定是true,会去执行相关代码。
const res = response.data
console.info(res)
可以进入调试模式,查看从后台返回的数据是什么东西。
在请求的超时时间 timeout: 500000在这里插入图片描述

结束语

到此,登录模块就已实现从后后请求真实的数据。欢迎各位大佬指正!

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue-Element-Admin是一个基于Vue.js和Element UI的后台管理系统模板,主要包括用户管理、权限管理、菜单管理、角色管理、日志管理等功能模块。其中,登录功能是系统的核心功能之一,下面详细介绍Vue-Element-Admin登录功能的具体实现。 1. 登录页面 登录页面是用户登录系统的入口,需要提供用户名和密码输入框、验证码输入框和登录按钮。在Vue-Element-Admin中,登录页面的实现主要包括以下几个部分: (1)路由配置:在路由配置文件(router/index.js)中添加登录页面的路由配置。 (2)页面布局:使用Element UI中的布局组件实现登录页面的布局。 (3)表单验证:使用Vue.js中的表单验证功能验证用户名、密码和验证码的输入合法性。 (4)登录请求:使用axios库向后台发送登录请求,验证用户的登录信息是否正确。 (5)登录状态保存:将登录成功后返回的token保存在本地,供后续请求时使用。 2. 登录请求Vue-Element-Admin中,登录请求是通过axios库发送的。axios是一个基于Promise的HTTP库,可以用于浏览器和Node.js平台。在发送登录请求时,需要设置请求的URL、请求方法、请求头和请求体等参数。 以下是发送登录请求的代码示例: ```javascript import axios from 'axios' export function login(username, password, code, uuid) { const data = { username, password, code, uuid } return axios({ url: '/auth/login', method: 'post', headers: { 'Content-Type': 'application/json;charset=UTF-8' }, data }) } ``` 在上述代码中,login函数接收四个参数,分别是用户名、密码、验证码和UUID。其中,UUID是用于生成验证码的唯一标识符。login函数返回一个Promise对象,该对象的then方法用于处理登录成功后的逻辑,catch方法用于处理登录失败后的逻辑。 3. 登录状态保存 在Vue-Element-Admin中,登录状态是通过Vuex库保存的。Vuex是一个专为Vue.js应用程序开发的状态管理模式,可以用于集中管理应用程序中的所有组件的状态。 在登录成功后,后台会返回一个token,该token需要保存在本地,以便后续请求时使用。以下是保存登录状态的代码示例: ```javascript import { login } from '@/api/user' import { setToken } from '@/utils/auth' const state = { token: '' } const mutations = { SET_TOKEN: (state, token) => { state.token = token } } const actions = { login({ commit }, userInfo) { const { username, password, code, uuid } = userInfo return new Promise((resolve, reject) => { login(username, password, code, uuid).then(response => { const { data } = response commit('SET_TOKEN', data.token) setToken(data.token) resolve() }).catch(error => { reject(error) }) }) } } ``` 在上述代码中,login函数接收一个userInfo对象作为参数,该对象包含用户名、密码、验证码和UUID等信息。login函数返回一个Promise对象,该对象的then方法用于处理登录成功后的逻辑,catch方法用于处理登录失败后的逻辑。 4. 登录状态验证 在Vue-Element-Admin中,登录状态验证是通过路由拦截实现的。路由拦截是Vue.js中的一种权限控制方式,可以在路由跳转前对用户的登录状态进行验证,从而实现页面的权限控制。 以下是路由拦截的代码示例: ```javascript import router from './router' import { getToken } from '@/utils/auth' const whiteList = ['/login'] router.beforeEach(async(to, from, next) => { const hasToken = getToken() if (hasToken) { if (to.path === '/login') { next({ path: '/' }) } else { next() } } else { if (whiteList.indexOf(to.path) !== -1) { next() } else { next(`/login?redirect=${to.path}`) } } }) ``` 在上述代码中,beforeEach函数用于路由拦截,该函数接收三个参数,分别是要跳转的路由对象、当前路由对象和next函数。在beforeEach函数中,首先获取本地的token,如果token存在,则跳转到要访问的路由页面,否则跳转到登录页面。如果要访问的路由页面在白名单中,则直接跳转到该页面,否则跳转到登录页面,并将要访问的页面作为参数传递给登录页面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值