vuex进阶实战-用户登录及权限控制

项目文件结构 ▼

复制代码
├── src                         # 源代码
│   ├── router                  # 路由
│   │   ├── index.js            
│   ├── store                   # 全局 store管理
│   │   ├── index.js            
│   │   ├── state.js            # 数据仓库(数据的唯一来源)
│   │   ├── mutations.js        # 修改数据
│   ├── views                   # views 所有页面
│   │   ├── Login.vue             # 登录
│   │   ├── Home.vue              # 首页
│   ├── App.vue                 # 入口页面
│   ├── main.js                 # 入口文件 加载组件 初始化等
复制代码

 

src/router/index.js ▼

复制代码
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
const router = new VueRouter({
  mode: "hash",
  base: "/",
  routes: [
  {
    path: "/",
    name: "Home",
    component: () => import("../views/Home.vue")
  },
  {
    path: "/login",
    name: "Login",
    component: () => import("../views/Login.vue")
  }
  ]
});
export default router;
复制代码

 

src/store/index.js ▼

复制代码
import Vue from "vue";
  import Vuex from "vuex";
  import state from "./state";
  import mutations from "./mutations";
  Vue.use(Vuex);
  export default new Vuex.Store({
    state, // 数据仓库(数据的唯一来源)
    getters: {}, // 用来获取数据(计算属性)
    mutations, // 用来修改数据的(相当于function,同步)
    actions: {}, // 用来提交mutation(异步)
    modules: {} // 模块化
  });

复制代码

 

src/store/state.js ▼

export default {
    // 个人信息
    userInfos: undefined
  };

 

src/store/mutations.js ▼

export default {
    login(state, data) {
      state.userInfos = data;
    }
  };
 

src/views/Login.vue

复制代码
<template>
  <div>
    <form>
      用户名:
      <input type="text" name="username" v-model="form.username" />
      密码
      <input type="password" name="password" v-model="form.password" />
      <input @click="onSubmit" value="登录" />
    </form>
  </div>
<template>

<script>
export default {
  name: "Login",
  data() {
    return {
      form: {
        username: undefined,
        password: undefined
      },
    }
  },
  methods: {
    onSubmit() {
      this.$store.commit("login","落花看风雪"); // 此处存入用户信息
this.$router.push("./"); // 跳转到首页
} } }
</script>
复制代码
 
src/main.js ▼
复制代码
import Vue from "vue";
import App from "./App.vue";
import router from "./router"; // 路由
import store from "./store"; // 引用vuex

// VueRouter导航守卫 无登陆信息直接跳转到登陆页面
router.beforeEach((to, from, next) => {
  if (store.state.userInfo || to.path("/login")) {
    next();
  } else {
    next({
      path: "/login"
    });
  }
});
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");
复制代码

src/App.vue▼

复制代码
<template>
    <div id="app">
      <router-view />
    </div>
  </template>
  
  <script>
  export default {
    name: "app"
  };
  </script>
复制代码

 

src/views/Home.vue▼

复制代码
<template>
  <div>欢迎来到首页</div>
</template>

<script>
export default {
  name: "Home"
};
</script>
复制代码

 

posted @   落花看风雪  阅读(584)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示