vueルーティングログインブロック(vue routerログイン権限制御)
15113 ワード
実現原理:
どのルーティングがルーティングファイルrouter/indexで検証する必要があるかを検証する.jsで指定:
ユーザーがログインするかどうかはその状態を指定する必要があります.ユーザーがログインしたら、localStorageでLoginします.vueファイルでステータスを1として指定します.
終了するにはホームでvueで指定したステータスは0です.
ルーティング・ブロックにはナビゲーション・ガードが必要です.キー・コードは次のとおりです.
すべてのコード:
router/index.js:
Login.vue:
Home.vue:
djangoコード:views.py
どのルーティングがルーティングファイルrouter/indexで検証する必要があるかを検証する.jsで指定:
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/chart',
component: Chart,
name: 'Chart',
iconCls: 'el-icon-s-flag',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
}
ユーザーがログインするかどうかはその状態を指定する必要があります.ユーザーがログインしたら、localStorageでLoginします.vueファイルでステータスを1として指定します.
that.$axios({
method: 'post',
url: 'http://localhost:9999/article/check_login_status/',
data: param
})
.then((res) => {
if(res.data.ret){
localStorage.setItem("islogin", 1); //
that.$router.push({path: "/table"});
}else{
that.$message(' !');
return false;
}
})
.catch((e) => {
console.log(err);
});
終了するにはホームでvueで指定したステータスは0です.
localStorage.setItem("islogin", 0);
ルーティング・ブロックにはナビゲーション・ガードが必要です.キー・コードは次のとおりです.
router.beforeEach((to, from, next) => {
let islogin = localStorage.getItem("islogin");
islogin = Boolean(Number(islogin));
if(to.path == "/login"){
if(islogin){
next("/table");
}else{
next();
}
}else{
// requireAuth:
if(to.meta.requireAuth && islogin) {
next();
}else{
next("/login");
}
}
})
すべてのコード:
router/index.js:
import Vue from 'vue'
import Router from 'vue-router'
const Home = () => import('@/components/HelloWorld')
const Badge = () => import('@/components/Badge')
const Progress = () => import('@/components/Progress')
const Table = () => import('@/components/Table')
const Tag = () => import('@/components/Tag')
const Chart = () => import('@/components/Chart')
const NotFound = () => import('@/components/NotFound')
const Login = () => import('@/components/Login')
const Tabs = () => import('@/components/Tabs')
const Rate = () => import('@/components/Rate')
const Form = () => import('@/components/Form')
Vue.use(Router)
let router = new Router({
routes: [
{
path: '/',
component: Home,
name: ' ',
iconCls: 'el-icon-s-flag',
leaf: false,
children: [
{
path: '/tabs',
component: Tabs,
name: 'Tabs',
iconCls: 'el-icon-star-on',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
},
{
path: '/rate',
component: Rate,
name: 'Rate',
iconCls: 'el-icon-star-on',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/badge',
component: Badge,
name: 'Badge',
iconCls: 'el-icon-s-help',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/table',
component: Table,
name: 'Table',
iconCls: 'el-icon-upload',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/tag',
component: Tag,
name: 'Tag',
iconCls: 'el-icon-s-cooperation',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/progress',
component: Progress,
name: 'Progress',
iconCls: 'el-icon-s-order',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/chart',
component: Chart,
name: 'Chart',
iconCls: 'el-icon-s-flag',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/',
component: Home,
name: 'Home',
iconCls: 'fa fa-address-card',
leaf: true,//
children: [
{
path: '/form',
component: Form,
name: 'Form',
iconCls: 'el-icon-s-flag',
meta: { // meta:{requireAuth: true}
requireAuth: true
}
}
]
},
{
path: '/login',
name: 'Login',
component: Login,
hidden: true,
meta: { // meta:{requireAuth: true}
requireAuth: true
}
},
{
path: '*',
hidden: true,
redirect: { path: '/404' }
},
{
path: '/404',
hidden: true,
name: '',
component: NotFound
}
]
})
export default router
router.beforeEach((to, from, next) => {
let islogin = localStorage.getItem("islogin");
islogin = Boolean(Number(islogin));
if(to.path == "/login"){
if(islogin){
next("/table");
}else{
next();
}
}else{
// requireAuth:
if(to.meta.requireAuth && islogin) {
next();
}else{
next("/login");
}
}
})
Login.vue:
export default {
data() {
return {
ruleForm: {
username: '',
password: ''
},
rules: {
username: [
{ required: true, message: ' ', trigger: 'blur' },
{ min: 3, max: 5, message: ' 3 5 ', trigger: 'blur' }
],
password: [
{ required: true, message: ' ', trigger: 'blur' },
{ min: 3, max: 8, message: ' 3 8 ', trigger: 'blur' }
]
}
};
},
methods: {
submitForm(formName) {
let that = this;
let param = new URLSearchParams();
param.append('username', that.ruleForm.username);
param.append('password', that.ruleForm.password);
this.$refs[formName].validate((valid) => {
if (valid) {
that.$axios({
method: 'post',
url: 'http://localhost:9999/article/check_login_status/',
data: param
})
.then((res) => {
if(res.data.ret){
localStorage.setItem("islogin", 1);
console.log(localStorage.getItem("islogin"));
that.$router.push({path: "/table"});
}else{
that.$message(' !');
return false;
}
})
.catch((e) => {
console.log(err);
});
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
Home.vue:
Header
{{item.name}}
{{child.name}}
{{child.name}}
import {mapState, mapGetters, mapActions} from 'vuex'
export default {
name: 'App',
methods: {
handleOpen(key, keyPath) {
//console.log(key, keyPath);
},
handleClose(key, keyPath) {
//console.log(key, keyPath);
},
...mapActions('People', ['asyncSetName']),
asyncSetAge(){
this.$store.dispatch("People/asyncSetAge", 1);
},
asyncSetAddress(){
this.$store.dispatch("People/asyncSetAddress", " ");
},
asyncSetJob(){
this.$store.dispatch("People/asyncSetJob", "P9");
},
loginOut(){
localStorage.setItem("islogin", 0);
this.$router.push("/login");
}
},
computed: {
...mapState('People', ['name', 'age', 'address', 'job']),
...mapState('Product', {
productName: 'name',
count: 'count',
price(state){return state.price},
mount: state => state.mount
}),
}
}
djangoコード:views.py
@csrf_exempt
def check_login_status(request):
return_dict = {"ret": False}
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'admin' and password == '123456':
return_dict['ret'] = True
return HttpResponse(json.dumps(return_dict), content_type="application/json")