当前位置: 首页 > article >正文

Vue 3 30天精进之旅:Day 14 - 项目实践

在前面的学习中,我们已经掌握了Vue 3的基础知识,包括其核心概念、Vue Router、Vuex,以及异步操作等。今天是一个重要的里程碑:我们将把这些知识整合到一个实际的项目中。通过项目实践,你将能够深入理解所学知识,提升实际开发技能。

一、项目目标

今天我们将构建一个用户管理系统,具备以下功能:

  1. 用户注册和登录。
  2. 显示用户列表,包含用户信息。
  3. 增加、编辑和删除用户。
  4. 访问受保护的管理员页面。
  5. 使用Vue Router进行页面导航。
  6. 使用Vuex管理全局状态。

二、项目结构

在开始项目前,我们先确定项目结构。接下来是一个基本的文件结构示例:

txt

user-management-app/
├── src/
│   ├── assets/           // 存放静态资源
│   ├── components/       // 公共组件
│   ├── views/            // 页面视图组件
│   ├── store/            // Vuex store
│   ├── router/           // Vue Router
│   ├── App.vue           // 主应用组件
│   ├── main.js           // 应用入口文件
│   └── ...
├── public/               // 公共文件
└── package.json          // 项目配置文件

三、项目准备

1. 创建Vue项目

首先,使用Vue CLI创建一个新的Vue 3项目:

vue create user-management-app

选择适合本项目的配置,确保选中了Router和Vuex。

2. 安装Axios

我们将使用Axios来进行HTTP请求。在项目目录中,安装Axios:

npm install axios

四、实现功能

1. 设置Vue Router

在 src/router/index.js 中,根据我们的需求设置路由。

javascript

import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Login from '../views/Login.vue';
import Register from '../views/Register.vue';
import UserList from '../views/UserList.vue';
import Admin from '../views/Admin.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/login', component: Login },
  { path: '/register', component: Register },
  { path: '/users', component: UserList, meta: { requiresAuth: true } },
  { path: '/admin', component: Admin, meta: { requiresAuth: true, roles: ['admin'] } },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

2. 设置Vuex Store

在 src/store/index.js 中,设置Vuex以管理用户状态。

javascript

import { createStore } from 'vuex';
import axios from 'axios';

const store = createStore({
  state() {
    return {
      users: [],
      isAuthenticated: false,
      userRole: null,
      error: null,
    };
  },
  mutations: {
    setUsers(state, users) {
      state.users = users;
    },
    setAuthenticated(state, payload) {
      state.isAuthenticated = payload.isAuthenticated;
      state.userRole = payload.role;
    },
    setError(state, error) {
      state.error = error;
    },
  },
  actions: {
    async fetchUsers({ commit }) {
      try {
        const response = await axios.get('https://jsonplaceholder.typicode.com/users');
        commit('setUsers', response.data);
      } catch (error) {
        commit('setError', error.message);
      }
    },
    async login({ commit }, credentials) {
      // 模拟登录
      const fakeAuthResponse = { isAuthenticated: true, role: 'admin' }; // 假数据
      commit('setAuthenticated', fakeAuthResponse);
    },
  },
});

export default store;

3. 创建视图组件

在 src/views 目录下创建以下组件:

  • Home.vue
  • Login.vue
  • Register.vue
  • UserList.vue
  • Admin.vue
示例:创建 Login.vue

vue

<template>
  <div>
    <h2>Login</h2>
    <form @submit.prevent="handleLogin">
      <input v-model="email" placeholder="Email" required />
      <input v-model="password" type="password" placeholder="Password" required />
      <button type="submit">Login</button>
      <p v-if="error">{
  
  { error }}</p>
    </form>
  </div>
</template>

<script>
import { ref } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();
    const email = ref('');
    const password = ref('');
    const error = ref('');

    const handleLogin = async () => {
      try {
        await store.dispatch('login', { email: email.value, password: password.value });
        // 跳转到用户列表页面
      } catch (e) {
        error.value = e.message;
      }
    };

    return { email, password, error, handleLogin };
  },
};
</script>
示例:创建 UserList.vue

vue

<template>
  <div>
    <h2>User List</h2>
    <ul>
      <li v-for="user in users" :key="user.id">{
  
  { user.name }} - {
  
  { user.email }}</li>
    </ul>
    <button @click="fetchUsers">Refresh User List</button>
  </div>
</template>

<script>
import { computed } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();
    
    const users = computed(() => store.state.users);
    
    const fetchUsers = () => {
      store.dispatch('fetchUsers');
    };

    return { users, fetchUsers };
  },
  mounted() {
    this.fetchUsers();
  },
};
</script>

4. 保护路由

使用路由守卫来保护路由,确保只有经过身份认证的用户能访问用户列表和管理员页面。在 src/router/index.js 中添加以下代码:

javascript

router.beforeEach((to, from, next) => {
  const isAuthenticated = store.state.isAuthenticated;
  if (to.meta.requiresAuth && !isAuthenticated) {
    next({ path: '/login' });
  } else {
    next();
  }
});

5. 用户注册功能(可选)

在 Register.vue 中实现用户注册的基本逻辑,模拟用户注册并更新状态。

vue

<template>
  <div>
    <h2>Register</h2>
    <form @submit.prevent="handleRegister">
      <input v-model="email" placeholder="Email" required />
      <input v-model="password" type="password" placeholder="Password" required />
      <button type="submit">Register</button>
    </form>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const email = ref('');
    const password = ref('');

    const handleRegister = () => {
      // 模拟注册逻辑
      console.log(`Registered with ${email.value} and ${password.value}`);
    };

    return { email, password, handleRegister };
  },
};
</script>

6. 管理员页面(Admin.vue)

vue

<template>
  <div>
    <h2>Admin Page</h2>
    <p>This is a protected page only for admins.</p>
  </div>
</template>

<script>
export default {
  mounted() {
    // 管理员页面逻辑
  },
};
</script>

五、运行项目

在项目目录中,通过以下命令启动你的Vue应用:

npm run serve

你的用户管理系统现在应该可以运行。你可以进行注册、登录、查看用户列表以及访问受保护的页面。

六、总结与反思

在今天的项目实践中,我们将前面所学的知识应用到一个具体的项目中,涉及路由配置、状态管理、异步请求等内容。通过实践,你可以体会到如何在实际开发中运用Vue的强大功能。

练习

  1. 用户编辑:实现一个功能,允许用户点击列表中的某个用户后编辑该用户的信息。
  2. 更新状态:在用户注册、登录后,将状态更新到Vuex并刷新用户列表。
  3. 添加样式:使用CSS或UI框架(如Bootstrap、Tailwind CSS)来美化项目。

通过这些练习,你将能进一步巩固所学知识,并提升你的开发技能。明天我们将深入探索 Vue 3的动画与过渡,持续提升我们的项目开发能力!


http://www.kler.cn/a/532018.html

相关文章:

  • 【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用
  • SpringAI 人工智能
  • k8s二进制集群之ETCD集群证书生成
  • html中的表格属性以及合并操作
  • 3.5.7 基于横盘结构的分析体系——缠论(背驰/背离)
  • 基于深度学习的输电线路缺陷检测算法研究(论文+源码)
  • 【图片识别分类】批量按图片水印文字识别后根据内容分类并移至不同文件夹,基于Python和腾讯API的解决方案
  • 雷赛LC2000
  • 『 C++ 』中不可重写虚函数的实用案例
  • JVM监控和管理工具
  • 与本地Deepseek R1:14b的第一次交流
  • Dest1ny攻防实战:SpringBoot 脱敏属性***明文获取
  • FORTRAN语言的云计算
  • 蓝桥杯例题七
  • RocketMQ面试题:进阶部分
  • 给AI用工具的能力——Agent
  • Redis基础(二)——通用命令与五大基本数据类型
  • 排序算法--基数排序
  • Alibaba开发规范_MySQL索引规约:最佳实践与常见陷阱
  • 一篇关于高等数理统计结合机器学习论文的撰写(如何撰写?)
  • 响应式编程_01基本概念:前世今生
  • 防火墙安全策略实验
  • [vue.draggable.next]-Vue3中后台管理系统实现拖拽排序功能
  • Python面向对象编程:用对象思维构建数字世界
  • Linux:文件系统(软硬链接)
  • InfluxDB 2.0 到 3.0 技术架构演进与性能分析