日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue中的使用token的方法示例

瀏覽:112日期:2023-02-01 16:30:43

初始于登錄頁面

Home.vue

<template> <div class='home'> </div></template><script>// @ is an alias to /srcimport HelloWorld from ’@/components/HelloWorld.vue’import axios from ’axios’;export default { name: ’home’, components: { HelloWorld }, created(){ axios.get(’/api/userinfo’).then(res=>console.log(res.data)) }}</script>

About.vue

<template> <div class='about'> <h1>This is an about page</h1> </div></template>

login.vue

<template> <div> <div class='logo'> <img src='https://img.kaikeba.com/logo-new.png' alt> </div> <!-- <cube-button>登錄</cube-button> --> <cube-form :model='model' :schema='schema' @submit.prevent='handleLogin' @validate='handleValidate' ></cube-form> </div></template><script>export default { data() { return { model: { username: '', password: '' }, schema: { fields: [ { type: 'input', modelKey: 'username', label: '用戶名', props: { placeholder: '請輸入用戶名' }, rules: { required: true }, trigger: 'blur' }, { type: 'input', modelKey: 'password', label: '密碼', props: { placeholder: '請輸入密碼', type: 'password', eye: { open: true } }, rules: { required: true }, trigger: 'blur' }, { type: 'submit', label: '登錄' } ] } }; }, methods: { handleValidate(ret) { console.log(ret); }, handleLogin(e) { // 登錄請求 this.$store.dispatch('login', this.model).then(success => { if (success) { const path = this.$route.query.redirect || ’/’ this.$router.push(path) } }).catch(error => { const toast = this.$createToast({ time:2000, txt:’登錄失敗’, type:’error’ }).show(); }); } }};</script><style scoped></style>

/service/user

import axios from 'axios';export default { login(user) { return axios.get('/api/login', { params: user }) .then(({ data }) => data); }};

App.vue

<template> <div id='app'> <div id='nav'> <router-link to='/'>Home</router-link> | <router-link to='/about'>About</router-link> <button v-if='$store.state.user.isLogin' @click='logout'>注銷</button> </div> <router-view/> </div></template><script>export default { methods: { logout() { this.$store.dispatch(’logout’) } },}</script><style>#app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50;}</style>

cube-ui組件的引用 cube-ui.js

import Vue from ’vue’// By default we import all the components.// Only reserve the components on demand and remove the rest.// Style is always required.import { /* eslint-disable no-unused-vars */ Style, // basic Button, Loading, Tip, Toolbar, TabBar, TabPanels, // form Checkbox, CheckboxGroup, Checker, Radio, RadioGroup, Input, Textarea, Select, Switch, Rate, Validator, Upload, Form, // popup Popup, Toast, Picker, CascadePicker, DatePicker, TimePicker, SegmentPicker, Dialog, ActionSheet, Drawer, ImagePreview, // scroll Scroll, Slide, IndexList, Swipe, Sticky, ScrollNav, ScrollNavBar} from ’cube-ui’Vue.use(Button)Vue.use(Loading)Vue.use(Tip)Vue.use(Toolbar)Vue.use(TabBar)Vue.use(TabPanels)Vue.use(Checkbox)Vue.use(CheckboxGroup)Vue.use(Checker)Vue.use(Radio)Vue.use(RadioGroup)Vue.use(Input)Vue.use(Textarea)Vue.use(Select)Vue.use(Switch)Vue.use(Rate)Vue.use(Validator)Vue.use(Upload)Vue.use(Form)Vue.use(Popup)Vue.use(Toast)Vue.use(Picker)Vue.use(CascadePicker)Vue.use(DatePicker)Vue.use(TimePicker)Vue.use(SegmentPicker)Vue.use(Dialog)Vue.use(ActionSheet)Vue.use(Drawer)Vue.use(ImagePreview)Vue.use(Scroll)Vue.use(Slide)Vue.use(IndexList)Vue.use(Swipe)Vue.use(Sticky)Vue.use(ScrollNav)Vue.use(ScrollNavBar)

cube-ui的樣式 theme.styl

@require '~cube-ui/src/common/stylus/var/color.styl'// action-sheet$action-sheet-color := $color-grey$action-sheet-active-color := $color-orange$action-sheet-bgc := $color-white$action-sheet-active-bgc := $color-light-grey-opacity$action-sheet-title-color := $color-dark-grey$action-sheet-space-bgc := $color-mask-bg/// picker style$action-sheet-picker-cancel-color := $color-light-grey$action-sheet-picker-cancel-active-color := $color-light-grey-s// bubble// button$btn-color := $color-white$btn-bgc := $color-regular-blue$btn-bdc := $color-regular-blue$btn-active-bgc := $color-blue$btn-active-bdc := $color-blue$btn-disabled-color := $color-white$btn-disabled-bgc := $color-light-grey-s$btn-disabled-bdc := $color-light-grey-s/// primary$btn-primary-color := $color-white$btn-primary-bgc := $color-orange$btn-primary-bdc := $color-orange$btn-primary-active-bgc := $color-dark-orange$btn-primary-active-bdc := $color-dark-orange/// light$btn-light-color := $color-grey$btn-light-bgc := $color-light-grey-sss$btn-light-bdc := $color-light-grey-sss$btn-light-active-bgc := $color-active-grey$btn-light-active-bdc := $color-active-grey/// outline$btn-outline-color := $color-grey$btn-outline-bgc := transparent$btn-outline-bdc := $color-grey$btn-outline-active-bgc := $color-grey-opacity$btn-outline-active-bdc := $color-grey/// outline-primary$btn-outline-primary-color := $color-orange$btn-outline-primary-bgc := transparent$btn-outline-primary-bdc := $color-orange$btn-outline-primary-active-bgc := $color-orange-opacity$btn-outline-primary-active-bdc := $color-dark-orange// toolbar$toolbar-bgc := $color-light-grey-sss$toolbar-active-bgc := $color-active-grey// checkbox$checkbox-color := $color-grey$checkbox-icon-color := $color-light-grey-s/// checked$checkbox-checked-icon-color := $color-orange$checkbox-checked-icon-bgc := $color-white/// disabled$checkbox-disabled-icon-color := $color-light-grey-ss$checkbox-disabled-icon-bgc := $color-light-grey-ss// checkbox hollow$checkbox-hollow-checked-icon-color := $color-orange$checkbox-hollow-disabled-icon-color := $color-light-grey-ss// checkbox-group$checkbox-group-bgc := $color-white$checkbox-group-horizontal-bdc := $color-light-grey-s// radio$radio-group-bgc := $color-white$radio-group-horizontal-bdc := $color-light-grey-s$radio-color := $color-grey$radio-icon-color := $color-light-grey-s/// selected$radio-selected-icon-color := $color-white$radio-selected-icon-bgc := $color-orange/// disabled$radio-disabled-icon-bgc := $color-light-grey-ss// radio hollow$radio-hollow-selected-icon-color := $color-orange$radio-hollow-disabled-icon-color := $color-light-grey-ss// dialog$dialog-color := $color-grey$dialog-bgc := $color-white$dialog-icon-color := $color-regular-blue$dialog-icon-bgc := $color-background$dialog-title-color := $color-dark-grey$dialog-close-color := $color-light-grey$dialog-btn-color := $color-light-grey$dialog-btn-bgc := $color-white$dialog-btn-active-bgc := $color-light-grey-opacity$dialog-btn-highlight-color := $color-orange$dialog-btn-highlight-active-bgc := $color-light-orange-opacity$dialog-btn-disabled-color := $color-light-grey$dialog-btn-disabled-active-bgc := transparent$dialog-btns-split-color := $color-row-line// index-list$index-list-bgc := $color-white$index-list-title-color := $color-dark-grey$index-list-anchor-color := $color-light-grey$index-list-anchor-bgc := #f7f7f7$index-list-item-color := $color-dark-grey$index-list-item-active-bgc := $color-light-grey-opacity$index-list-nav-color := $color-grey$index-list-nav-active-color := $color-orange// loading// picker$picker-bgc := $color-white$picker-title-color := $color-dark-grey$picker-subtitle-color := $color-light-grey$picker-confirm-btn-color := $color-orange$picker-confirm-btn-active-color := $color-light-orange$picker-cancel-btn-color := $color-light-grey$picker-cancel-btn-active-color := $color-light-grey-s$picker-item-color := $color-dark-grey// popup$popup-mask-bgc := rgb(37, 38, 45)$popup-mask-opacity := .4//scroll// slide$slide-dot-bgc := $color-light-grey-s$slide-dot-active-bgc := $color-orange// time-picker// tip$tip-color := $color-white$tip-bgc := $color-dark-grey-opacity// toast$toast-color := $color-light-grey-s$toast-bgc := rgba(37, 38, 45, 0.9)// upload$upload-btn-color := $color-grey$upload-btn-bgc := $color-white$upload-btn-active-bgc := $color-light-grey-opacity$upload-btn-box-shadow := 0 0 6px 2px $color-grey-opacity$upload-btn-border-color := #e5e5e5$upload-file-bgc := $color-white$upload-file-remove-color := rgba(0, 0, 0, .8)$upload-file-remove-bgc := $color-white$upload-file-state-bgc := $color-mask-bg$upload-file-success-color := $color-orange$upload-file-error-color := #f43530$upload-file-status-bgc := $color-white$upload-file-progress-color := $color-white// switch$switch-on-bgc := $color-orange$switch-off-bgc := $color-white$switch-off-border-color := #e4e4e4// input$input-color := $color-grey$input-bgc := $color-white$input-border-color := $color-row-line$input-focus-border-color := $color-orange$input-placeholder-color := $color-light-grey-s$input-clear-icon-color := $color-light-grey//textarea$textarea-color := $color-grey$textarea-bgc := $color-white$textarea-border-color := $color-row-line$textarea-focus-border-color := $color-orange$textarea-outline-color := $color-orange$textarea-placeholder-color := $color-light-grey-s$textarea-indicator-color := $color-light-grey-s// validator$validator-msg-def-color := #e64340// select$select-color := $color-grey$select-bgc := $color-white$select-disabled-color := #b8b8b8$select-disabled-bgc := $color-light-grey-opacity$select-border-color := $color-light-grey-s$select-border-active-color := $color-orange$select-icon-color := $color-light-grey$select-placeholder-color := $color-light-grey-s// swipe$swipe-btn-color := $color-white// form$form-color := $color-grey$form-bgc := $color-white$form-invalid-color := #e64340$form-group-legend-color := $color-light-grey$form-group-legend-bgc := $color-background$form-label-required-color := #e64340// drawer$drawer-color := $color-dark-grey$drawer-title-bdc := $color-light-grey-ss$drawer-title-bgc := $color-white$drawer-panel-bgc := $color-white$drawer-item-active-bgc := $color-light-grey-opacity// scroll-nav$scroll-nav-bgc := $color-white$scroll-nav-color := $color-grey$scroll-nav-active-color := $color-orange// image-preview$image-preview-counter-color := $color-white// tab-bar & tab-panel$tab-color := $color-grey$tab-active-color := $color-dark-orange$tab-slider-bgc := $color-dark-orange

axios 請求響應攔截器 interceptor.js

import axios from 'axios';export default function(vm) { axios.interceptors.request.use(config => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = 'Bearer ' + token; } return config; }); axios.interceptors.response.use(null, err => { if (err.response.status === 401) { // 清空 vm.$store.dispatch('logout'); // 跳轉 vm.$router.push('/login'); } return Promise.reject(err); });}

路由守衛 路由 router.js

import Vue from 'vue';import Router from 'vue-router';import Home from './views/Home.vue';import Login from './views/Login.vue';Vue.use(Router);const router = new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ { path: '/', name: 'home', component: Home }, { path: '/login', name: 'login', component: Login }, { path: '/about', name: 'about', meta: { auth: true }, // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: 'about' */ './views/About.vue') } ]});router.beforeEach((to, from, next) => { if (to.meta.auth) { // 只要本地有token就認為登錄了 const token = localStorage.getItem('token'); if (token) { next(); } else { // 未登錄 next({ path: '/login', query: { redirect: to.path } }); } } else { next(); }});export default router;

mock數據 或mock-easy vue.config.js

module.exports = { css: { loaderOptions: { stylus: { 'resolve url': true, import: ['./src/theme'] } } }, pluginOptions: { 'cube-ui': { postCompile: true, theme: false } }, configureWebpack: { devServer: { proxy: { '/api': { target: 'http://127.0.0.1:3000/', changOrigin: true } }, // before(app) { // app.get('/api/login', (req, res) => { // const { username, password } = req.query; // if (username === 'kaikeba' && password === '123') { // res.json({ code: 1, token: 'jilei' }); // } else { // res.status(401).json({ code: 0, message: '用戶名或密碼錯誤' }); // } // }); // 中間件函數 // function auth(req, res, next) { // if (req.headers.token) { // next(); // } else { // res.status(401); 如果設置這個 只是設置狀態,并沒有返回前端,會導致前端等待狀態res.sendStatus(401) 這個正確的 // } // } // app.get('/api/userinfo', auth, (req, res) => { // res.json({ code: 1, data: { name: 'Jerry' } }); // }); // } } }};

登錄動作,store.js

index.js

import user from ’./user’Vue.use(Vuex)export default new Vuex.Store({ modules: {user}})

user.js

import us from ’@/service/user’export default { state: { isLogin: !!localStorage.getItem('token') }, mutations: { setLoginState(state, val) { state.isLogin = val; } }, actions: { login({commit}, userInfo) { return us.login(userInfo).then(({token}) => {// code, tokenif (token) { // 登錄成功 commit(’setLoginState’, true) localStorage.setItem(’token’, token) return true}return false }) }, logout({commit}){ localStorage.removeItem(’token’) commit(’setLoginState’, false) } }}

gitignore

.DS_Storenode_modules/dist# local env files.env.local.env.*.local# Log filesnpm-debug.log*yarn-debug.log*yarn-error.log*# Editor directories and files.idea.vscode*.suo*.ntvs**.njsproj*.sln*.sw*

main.js

import Vue from ’vue’import ’./cube-ui’import App from ’./App.vue’import store from ’./store’import router from ’./router’import interceptor from ’./interceptor’Vue.config.productionTip = falseconst app = new Vue({ store, router, render: h => h(App)}).$mount(’#app’);interceptor(app);

vue中的使用token的方法示例

深入理解令牌機制

Bearer Token規范概念:描述在http訪問OAuth2保護資源時如何使用令牌的規范特點:令牌就是身份證明,無需證明令牌的所有權具體規定:在請求頭中定義Authorization

Authorization: Bearer <token>

Json Web Token規范概念:令牌的具體定義方式規定:令牌由三部分構成 “頭”,“載荷”,“簽名”頭:包含加密算法。令牌類型等信息載荷:包含用戶信息。簽發時間和過期時間等信息,base64編碼簽名:根據頭 和載荷及秘鑰加密得到的哈希串Hmac Sha1 256

server/server.js

const Koa = require('koa');const Router = require('koa-router');const jwt = require('jsonwebtoken');const jwtAuth = require('koa-jwt');const secret = 'it’s a secret';const app = new Koa();const router = new Router();router.get('/api/login', async ctx => {const { username, passwd } = ctx.query;console.log(username, passwd);if (username == 'kaikeba' && passwd == '123') {// 生成令牌const token = jwt.sign({data: { name: 'kaikeba' }, // 用戶信息數據exp: Math.floor(Date.now() / 1000) + 60 * 60 // 過期時},secret);ctx.body = { code: 1, token };} else {ctx.status = 401;ctx.body = { code: 0, message: '用戶名或者密碼錯誤' };}});router.get('/api/userinfo',jwtAuth({ secret }),async ctx => {ctx.body = { code: 1, data: { name: 'jerry', age: 20 } };});app.use(router.routes());app.listen(3000);

到此這篇關于vue中的使用token的方法示例的文章就介紹到這了,更多相關vue使用token內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区欧美| 亚洲女同一区| 欧美日韩国产探花| 国产精品久久久久久久免费观看 | 三上亚洲一区二区| 国产精品不卡| 精品深夜福利视频| 91精品蜜臀一区二区三区在线 | 美女性感视频久久| 免费视频一区二区三区在线观看| 国产精品国产三级国产在线观看| 在线日韩视频| 久久午夜视频| 日本午夜精品视频在线观看| 日韩三级视频| 你懂的国产精品| 国产精品麻豆成人av电影艾秋| 国产亚洲一级| 日本中文字幕视频一区| 亚洲一区日韩在线| 免费黄网站欧美| 久久青青视频| 日本精品影院| 久久国产精品美女| 精品午夜久久| 久久婷婷av| 视频一区二区不卡| 久久国产日韩欧美精品| 亚洲精品a级片| 黑丝一区二区三区| 国产一级一区二区| 国产亚洲久久| 国产乱码午夜在线视频| 亚洲高清av| 亚洲精品一级| 免费观看久久av| 国产精品videosex极品| 精品国产美女a久久9999| 色黄视频在线观看| 亚洲精品亚洲人成在线观看| 日本欧美在线| 成人精品动漫一区二区三区| 一区二区国产在线观看| 91嫩草精品| 人在线成免费视频| 另类国产ts人妖高潮视频| 欧美亚洲一区二区三区| 高清av不卡| 亚洲欧美专区| 日韩精品91| 午夜视频一区二区在线观看| 日韩成人精品一区| 蜜臀久久99精品久久久画质超高清 | 国产视频网站一区二区三区| 欧美精品91| 午夜久久tv| 国产精品久久久网站| 九九精品调教| 日韩精品免费一区二区夜夜嗨| 久久午夜精品| 免费精品一区| 免费成人性网站| av高清不卡| 日韩精品视频在线看| 国产精品字幕| 欧美在线精品一区| 偷拍欧美精品| 国产精品毛片视频| 久久国产66| 国产成人免费精品| 日韩精彩视频在线观看| 91精品蜜臀一区二区三区在线| 精品在线91| 国产激情欧美| 亚洲一区二区三区四区五区午夜 | 亚洲永久字幕| 国产精品高清一区二区| 欧美日一区二区| 国产精品自在| 综合激情五月婷婷| 亚洲国产福利| 日韩av一二三| 黄色日韩在线| 波多野结衣久久精品| 久久国际精品| 在线国产日韩| 亚洲大全视频| 亚洲天堂免费电影| 国产伦理一区| 亚洲人成网站在线在线观看| 免费视频亚洲| 中文另类视频| 水蜜桃精品av一区二区| 国产精品成人国产| 日韩国产欧美三级| 久久99伊人| 99久久激情| 免费看av不卡| 日韩88av| 久久免费影院| 国产精品视频一区二区三区四蜜臂| 国产一区二区三区网| 日韩 欧美一区二区三区| 99热精品在线| 欧美成人久久| 久久精品亚洲人成影院| 中文在线免费视频| 免费一区二区三区在线视频| 777久久精品| 日韩黄色av| 日韩欧美中文字幕电影| 免费不卡在线视频| 日韩一区精品字幕| 男女激情视频一区| 欧美日韩免费观看一区=区三区| 亚洲精品看片| 亚洲一区二区毛片| 亚洲精品1区| 亚洲国产成人精品女人| 99精品视频在线观看免费播放| 日韩欧美三区| 亚洲综合婷婷| 日韩国产欧美视频| 欧美私人啪啪vps| 国产欧美一区二区色老头| 在线精品亚洲| 免费在线观看精品| 最新亚洲国产| 日韩高清电影一区| 91成人在线网站| 久久超碰99| 精品国产中文字幕第一页| 美女视频免费精品| 国产一区二区三区四区五区 | 亚州av乱码久久精品蜜桃| 在线日韩中文| 亚洲欧美日本国产专区一区| 亚洲国产日韩欧美在线| 久久一二三区| 日本在线观看不卡视频| 国产欧美三级| 国产精品啊啊啊| 精品高清久久| 欧美日韩免费观看视频| 五月天久久777| 视频一区在线播放| 在线精品观看| 国产精品久久久久久妇女| 国产精品羞羞答答在线观看| 精品中国亚洲| 日韩一区二区三区在线免费观看| 香蕉久久久久久| 午夜性色一区二区三区免费视频| 日韩欧美一区二区三区在线视频 | 麻豆精品久久久| 久久免费视频66| 日韩在线短视频| 蜜桃视频在线网站| 日韩午夜在线| 综合激情视频| 国产探花一区在线观看| 欧美1区二区| 精精国产xxxx视频在线野外 | 久久高清免费观看| 视频一区二区三区入口| 一区二区三区四区日韩| 日韩激情网站| 国产精品自拍区| sm久久捆绑调教精品一区| 久久精品国产www456c0m| 亚洲永久字幕| 国产情侣久久| 天堂中文在线播放| 亚洲综合欧美| 国产日韩中文在线中文字幕| 在线看片国产福利你懂的| 亚洲激情精品| 久久国产日韩欧美精品| sm捆绑调教国产免费网站在线观看| 亚洲精品黄色| 国产精品黄色| 精品中文一区| 青青国产精品| 国内自拍视频一区二区三区| 亚洲一级黄色| 91成人小视频| 亚洲国产专区| 日本aⅴ免费视频一区二区三区| 久久国产88| 国产精品欧美三级在线观看| 亚洲www啪成人一区二区| 狠狠色狠狠色综合日日tαg| 日韩影片在线观看| 韩日一区二区| 日韩视频久久| 欧美精品aa| 中文欧美日韩| 精品一区电影| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美影院三区|