SSM搭建项目,从前端到后台(三)

今天写的是前端的内容

先说一下用到的哪些框架,webpack,vue,vuex,vue-router,axios,less,vue-cli,element-ui,iVue.......
使用vue-cli初始化项目。指令自己去网上找,vue init webpack ""
初始化完成后要自己配置webpack 的。
1.配置代理请求本地服务器上的接口地址

 proxyTable: {
      '/':{
        target:'http://localhost:8080',
        changeOrigin:true,
        pathRewrite:{
          '/':'/'
        }
      }
    },

2.封装axios请求发送json格式数据并做拦截请求处理和拦截响应处理

先说一下,其中有个qs模块,是把请求地址转成get字符串的,不知道是哪位大哥用到的,我看了其中的源码才知道,为啥我JSON.stringfy一直没起作用。
这段代码结合element-ui的message和loading

/**
 * Created by visupervi on 2018-07-14.
 */
import axios from 'axios'
import qs from 'qs'
import {Message,Loading } from 'element-ui'
import router from '../router'
axios.defaults.withCredentials = true;
let loadingInstance;
const opts = {
  lock: true,
  text: 'Loading',
  background: 'rgba(255, 255, 255, 0.3)',
  customClass: '请耐心等待'
}
const Axios = axios.create({
  baseUrl:'',//查一下自己的地址
  timeout:3000,
  responseType:'json',
  withCredentials:true,
  headers:{
    "Content-type":"application/json;charset=utf-8"//x-www-form-urlencoded
  }

});
Axios.interceptors.request.use(config =>{

  if(
    config.method == 'post' ||
    config.method == 'put' ||
    config.method == 'delete' ||
    config.method == 'axios'
  ){
    loadingInstance = Loading.service(opts);
    if(config.method == "put"){
      config.data = qs.stringify(config.data);
    }
  }
  if(localStorage.token){
    config.headers.Authorization = localStorage.token;
    // console.log(config.headers.Authorization);
    // loadingInstance = Loading.service(opts);
  }
  return config;
},error =>{
  Message({
    showClose:true,
    message:error,
    type:'error.data.error.message'
  });
  return Promise.reject(error.data.error.message)
});

Axios.interceptors.response.use(
  res => {
    setTimeout(function () {
      loadingInstance && loadingInstance.close();
    }, 2000);
    if(res.data && res.data.success){
      Message({
        showClose:true,
        message:res.data.error.message.message
        ? res.data.error.message.message
          : res.data.error.message,
        type:'error'
      });
      return Promise.reject(res.data.error.message);
    }
    // loadingInstance.close();
    return res;
  },
  error => {
    if (!window.localStorage.getItem("userInfo")) {
      router.push({
        path: "/"
      });
    } else {
      let lifeTime =
        JSON.parse(window.localStorage.getItem("userInfo")).lifeTime *
        1000;
      let nowTime = new Date().getTime(); // 当前时间的时间戳
      if (nowTime > lifeTime) {
        Message({
          showClose: true,
          message: "登录状态信息过期,请重新登录",
          type: "error"
        });
        router.push({
          path: "/"
        });
      } else {
        if (error.response.status === 403) {
          router.push({
            path: "/error/403"
          });
        }
        if (error.response.status === 500) {
          router.push({
            path: "/error/500"
          });
        }
        if (error.response.status === 502) {
          router.push({
            path: "/error/502"
          });
        }
        if (error.response.status === 404) {
          router.push({
            path: "/error/404"
          });
        }
      }
    }
    // let errorInfo =  error.data.error ? error.data.error.message : error.data;
    let errorInfo = error.data && error.data.error && error.data.error.message || error.data;
    return Promise.reject(errorInfo);
  }
);



export default {

  //作为插件使用,可以直接使用Vue.use方法使用
  install: function(Vue, Option) {
    Object.defineProperty(Vue.prototype, "$http", { value: Axios });
  },

};

3.引用vuex存储登陆状态


/**
 * Created by visupervi on 2018-07-17.
 */
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const token = JSON.parse(localStorage.getItem('token') || null);

const store = new Vuex.Store({
  state(){
    return {
      userInfo:{
        token: token,
        userName:"",
        lifeTime:null
      }
    }
  },
  mutations:{
    setToken(state,token,name){
      state.userInfo.token = token;
      state.userInfo.lifeTime = (new Date()).getTime();
      state.userInfo.userName = name;
      localStorage.setItem('userInfo',JSON.stringify(state.userInfo));
    },
    delToken(state){
      state.token = null;
      localStorage.removeItem('userInfo');
    }
  },
  getters:{
    getToken(){
      if(!localStorage.getItem("userInfo")){
        localStorage.setItem("userInfo",{})
      }
      return localStorage.getItem("userInfo");
    }
  }
});
export default store;

其中mutation这个参考官网介绍,包括怎么使用其中的函数。commit触发

4.路由请求处理

在路由上加了一个meta,来规定是否需要登录权限

const router = new Router({
  routes: [
    {
      path: '/',
      name: 'userLogin',
      component: userLogin,
      meta: {
        requireLogin: false
      },
    },
    {
      path:'/listVue',
      name:'listVue',
      component:listVue,
      meta: {
        requireLogin: true
      },
    }
  ]
});

router.beforeEach((to, from, next) => {
  if (to.matched.some(res => res.meta.requireLogin)) {
    // 判断是否需要登录权限
    // console.log(this.$store.getters.getToken);
    let userInfo = window.localStorage.getItem("userInfo");
    // console.log(JSON.parse(userInfo).lifeTime);
    if (userInfo!=null) {
      // 判断是否登录
      let lifeTime =
        JSON.parse(userInfo).lifeTime * 1000;
      // console.log(lifeTime)
      let nowTime = (new Date()).getTime(); // 当前时间的时间戳
      console.log(nowTime);
      if (nowTime < lifeTime) {
        next();
      } else {
        Message({
          showClose: true,
          message: "登录状态信息过期,请重新登录",
          type: "error"
        });
        next({
          path: "/"
        });
      }
    } else {
      // 没登录则跳转到登录界面
      next({
        path: "/"
      });
    }
  } else {
    next();
  }
});

export default router;

到这里项目就能分别运行,并且可以请求和跳转

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容