• vue pc商城项目 ----------登录


    目录

     注册登录

    注册---------通过数据库存储用户信息(名字,密码)

    登录过后首页用户信息进行展示

    退出登录

    导航守卫

    全局守卫

    路由独享守卫

    组件内守卫


     注册登录

    注册---------通过数据库存储用户信息(名字,密码)

    登录---------登录成功的时候,后台为了区分这个用户是谁,服务器下发token【令牌唯一表示】
    前台持久化存储token【带着token找服务器要用户信息进行展示】

    vuex 不是持久化存储

    网络请求

    1. //登录
    2. const reqLogin = (data) => {
    3. return axios.post('/api/user/passport/login', data)
    4. }
    5. //获取用户信息
    6. const reqUserInfo = () => {
    7. return axios.get('/api/user/passport/auth/getUserInfo')
    8. }
    9. //退出登录
    10. const reqlogoOut = () => {
    11. return axios.get('/api/user/passport/logout')
    12. }

    登录事件

    1. async userLogin() {
    2. try {
    3. const {
    4. phone,
    5. password
    6. } = this;
    7. (phone && password) && await this.$store.dispatch('AsyncLogin', {
    8. phone,
    9. password
    10. })
    11. this.$router.push('/Home')
    12. } catch (e) {
    13. console.log(e.message);
    14. }

    vuex

    1. import axios from '@/api'
    2. // user 组件的小仓库
    3. const state = {
    4. code: '',
    5. token: localStorage.getItem('Token'),
    6. userinfo: ''
    7. }
    8. const mutations = {
    9. userLogin(state, payload) {
    10. state.token = payload
    11. },
    12. GetUserInfo(state, payload) {
    13. state.userinfo = payload
    14. },
    15. CLEAR(state) {
    16. state.token = ''
    17. state.userinfo = ''
    18. localStorage.removeItem('Token')
    19. }
    20. }
    21. const actions = {
    22. async AsyncLogin({
    23. commit
    24. }, data) {
    25. let result = await axios.reqLogin(data)
    26. console.log(result);
    27. if (result.code == 200) {
    28. commit('userLogin', result.data.token)
    29. localStorage.setItem('Token', result.data.token)
    30. return 'ok'
    31. } else {
    32. return Promise.reject(new Error('false'))
    33. }
    34. },
    35. async asyncUserInfo({
    36. commit
    37. }) {
    38. let result = await axios.reqUserInfo()
    39. console.log(result);
    40. if (result.code == 200) {
    41. commit('GetUserInfo', result.data)
    42. return 'ok'
    43. } else {
    44. return Promise.reject(new Error('false'))
    45. }
    46. },
    47. async asyncUserOut({
    48. commit
    49. }) {
    50. let result = await axios.reqlogoOut()
    51. if (result.code == 200) {
    52. commit('CLEAR')
    53. return 'ok'
    54. } else {
    55. return Promise.reject(new Error('false'))
    56. }
    57. }
    58. }
    59. const getters = {}
    60. export default {
    61. state,
    62. mutations,
    63. actions,
    64. getters
    65. }

     

    登录过后首页用户信息进行展示

    当用户注册完成,用户登录【用户名+密码】向服务器发请求(组件派发 AsyncLogin)

    登录成功后获取token,存储与仓库当中(非持久化存储),路由跳转到home

    在首页当中(mounted)中派发 action  asyncUserInfo 动态展示用户信息

    持久化存储token

    退出登录

    清除 后台token 用户信息 本地token

    跳转到home

    1. async logoOut(){
    2. //退出登录发送请求 清楚token 用户信息
    3. try{
    4. await this.$store.dispatch('asyncUserOut')
    5. this.$router.push('/Home')
    6. }catch(e){
    7. //TODO handle the exception
    8. e.message
    9. }
    10. },

    导航守卫

    导航:表示路由正在发生变化

    守卫:紫禁城的护卫

    全局守卫

    举例子:紫禁城【皇帝,太后,妃子】紫禁城大门守卫都要排查

    只要发生路由变化,守卫就能监听到

    router.beforeEach( (to, from, next) => {}))

      //to:可以获取到你要跳转到哪个路由信息
      // from::可以获取到你从哪个路由来的信息
      // next : 放行函数 可以放行到指定的路由

    可以做token过期处理 控制路由跳转

    router里可以单独引入仓库import store from '@/store'

    1. // 配置路由的地方
    2. import Vue from 'vue'
    3. import VueRouter from 'vue-router'
    4. import routes from './router'
    5. import store from '@/store'
    6. //使用插件
    7. Vue.use(VueRouter)
    8. let router = new VueRouter({
    9. routes,
    10. });
    11. // 全局守卫,前置守卫 在路由跳转之前进行判断
    12. router.beforeEach(async (to, from, next) => {
    13. //to:可以获取到你要跳转到哪个路由信息
    14. // from::可以获取到你从哪个路由来的信息
    15. // next : 放行函数 可以放行到指定的路由
    16. let token = store.state.user.token
    17. let name = store.state.user.userinfo.name;
    18. if (token) {
    19. //用户已经登录了,去login(不让去,停留在首页)
    20. if (to.path == '/login') {
    21. next('/')
    22. } else {
    23. // 登录去的不是login,
    24. if (name) {
    25. next()
    26. } else {
    27. // 没有用户信息。派发action ,让仓库存储用户信息 进行跳转
    28. try {
    29. await store.dispatch('asyncUserInfo')
    30. next()
    31. } catch (e) {
    32. // token 失效,获取不到用户信息,清除token 重新登录,
    33. await store.dispatch('asyncUserOut')
    34. }
    35. }
    36. }
    37. } else {
    38. //登录了去的不是login,直接放行
    39. next()
    40. }
    41. })
    42. export default router

    路由独享守卫

    举例子:紫禁城【皇帝,太后,妃子】相对应的【皇帝,太后,妃子】路上守卫

    组件内守卫

    举例子;我要去皇帝的屋子,已经到了皇帝屋子的外面了(进入了)

  • 相关阅读:
    前端无法渲染CSS文件
    代码安全与质量 | 在这个充满变数的时代,花小钱办大事
    【2022.11.16】Lammps+Python+MATLAB在绘制维诺图时遇到的问题
    药品查询易语言代码
    计算机网络:应用层知识点汇总
    【Leetcode小解析】正则表达式匹配
    计算机网络(一)网络体系结构
    LIO-SAM:点云预处理前端---畸变矫正数据预处理
    GIT使用踩坑!!!我的妈妈呀,烦死了烦死了烦死了!!!
    HBase安装,配置,启动,检查
  • 原文地址:https://blog.csdn.net/qq_63358859/article/details/125537329