vue实现图书管理系统

Vue实现图书管理系统的完整攻略

1. 项目搭建

  • 安装 Vue CLI 脚手架工具
npm install -g @vue/cli
  • 创建 Vue 项目
vue create book-manager
  • 安装项目所需的依赖
cd book-manager
npm install axios bootstrap-vue vue-router vuex --save

2. 添加路由

  • /src 目录下新建一个 router 目录,创建 index.js 文件
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '../views/Home.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home,
  },
  {
    path: '/books',
    name: 'books',
    component: () => import(/* webpackChunkName: "Books" */ '../views/Books.vue'),
  },
];

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes,
});

export default router;
  • /src/views 目录下创建 Home.vueBooks.vue 文件

3. 添加页面

  • Home.vue 文件中添加一个 “首页” 的欢迎语
<template>
  <div class="home">
    <h1>欢迎使用图书管理系统</h1>
  </div>
</template>
  • Books.vue 文件中添加一个图书表格
<template>
  <div class="books">
    <b-table striped hover :items="books" :fields="fields"></b-table>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  name: 'Books',
  data() {
    return {
      books: [],
      fields: [
        {
          key: 'title',
          sortable: true,
        },
        {
          key: 'author',
          sortable: true,
        },
        {
          key: 'isbn',
          sortable: true,
        },
        {
          key: 'status',
          sortable: true,
        },
      ],
    };
  },
  created() {
    axios.get('/api/books').then(response => (this.books = response.data));
  },
};
</script>

4. 添加数据

  • /src 目录下新建一个 api 目录,创建 books.js 文件
const mock = [
  {
    title: 'book1',
    author: 'author1',
    isbn: '1234567890',
    status: 'available',
  },
  {
    title: 'book2',
    author: 'author2',
    isbn: '0987654321',
    status: 'borrowed',
  },
];

export default {
  get() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(mock);
      }, 1000);
    });
  },
};
  • /src/main.js 文件中添加 mock 数据的接口地址
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import './registerServiceWorker';
import './assets/scss/app.scss';

import api from './api/books';

Vue.config.productionTip = false;

Vue.prototype.$api = api;

new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app');

5. 数据处理

  • /src 目录下新建一个 store 目录,分别创建 index.jsmodules/books.js 文件
// index.js
import Vue from 'vue';
import Vuex from 'vuex';
import books from './modules/books';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    books,
  },
});
// modules/books.js
import api from '../../api/books';

const state = {
  books: [],
};

const mutations = {
  SET_BOOKS(state, books) {
    state.books = books;
  },
};

const actions = {
  async fetchBooks({ commit }) {
    const books = await api.get();
    commit('SET_BOOKS', books);
  },
};

const getters = {};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters,
};
  • /src/views/Books.vue 文件中使用 vuex 获取数据
<script>
import { mapActions, mapGetters } from 'vuex';

export default {
  name: 'Books',
  computed: {
    ...mapGetters('books', ['books']),
  },
  methods: {
    ...mapActions('books', ['fetchBooks']),
  },
  created() {
    this.fetchBooks();
  },
};
</script>

示例

这里提供两个示例:

  1. 添加图书

/src/components 目录下创建 AddBook.vue 组件

<template>
  <div>
    <b-form @submit.prevent="onSubmit">
      <b-form-group
        label="Title"
        description="Add the title of the book"
      >
        <b-form-input
          v-model="title"
        />
      </b-form-group>
      <b-form-group
        label="Author"
        description="Add the author of the book"
      >
        <b-form-input
          v-model="author"
        />
      </b-form-group>
      <b-form-group
        label="ISBN"
        description="Add the ISBN of the book"
      >
        <b-form-input
          v-model="isbn"
        />
      </b-form-group>
      <b-button type="submit" variant="primary">Add</b-button>
    </b-form>
  </div>
</template>

<script>
export default {
  name: 'AddBook',
  data() {
    return {
      title: '',
      author: '',
      isbn: '',
    };
  },
  methods: {
    onSubmit() {
      // Todo: add book api request
      this.$router.push({ name: 'books' });
    },
  },
};
</script>

Books.vue 文件中添加一个按钮,点击后可以跳转到添加图书的界面

<template>
  <div class="books">
    <div class="mb-3">
      <b-button variant="primary" to="/add_book">Add Book</b-button>
    </div>
    <b-table striped hover :items="books" :fields="fields"></b-table>
  </div>
</template>
  1. 修改图书状态

Books.vue 文件中添加一个状态列的 slot,并添加一个提交按钮,可以将图书状态修改为 “available” 或者 “borrowed”

<template>
  <div class="books">
    <b-table striped hover :items="books" :fields="fields">
      <template slot="status" slot-scope="data">
        <b-form-select
          v-model="data.item.status"
          :options="statusOptions"
          @change="onChangeStatus(data.item)"
        />
      </template>
    </b-table>
  </div>
</template>

<script>
import { mapActions, mapGetters } from 'vuex';

export default {
  name: 'Books',
  computed: {
    ...mapGetters('books', ['books']),
  },
  methods: {
    ...mapActions('books', ['fetchBooks', 'updateBookStatus']),
    onChangeStatus(book) {
      this.updateBookStatus(book);
    },
  },
  created() {
    this.fetchBooks();
  },
  data() {
    return {
      statusOptions: [
        { value: 'available', text: 'Available' },
        { value: 'borrowed', text: 'Borrowed' },
      ],
    };
  },
};
</script>

books.js 中添加 updateBookStatus 方法

// modules/books.js
// ...

const actions = {
  // ...
  async updateBookStatus({ commit }, book) {
    // Todo: api request
    commit('SET_BOOK_STATUS', book);
  },
};

const mutations = {
  // ...
  SET_BOOK_STATUS(state, book) {
    const index = state.books.findIndex(item => item.isbn === book.isbn);
    state.books.splice(index, 1, book);
  },
};

// ...

api/books.js 中添加 updateStatus 方法

const mock = [
  {
    title: 'book1',
    author: 'author1',
    isbn: '1234567890',
    status: 'available',
  },
  {
    title: 'book2',
    author: 'author2',
    isbn: '0987654321',
    status: 'borrowed',
  },
];

export default {
  get() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(mock);
      }, 1000);
    });
  },
  updateStatus(isbn, status) {
    return new Promise(resolve => {
      setTimeout(() => {
        mock.forEach(book => {
          if (book.isbn === isbn) {
            book.status = status;
            resolve(book);
          }
        });
      }, 1000);
    });
  },
};

使用 axios 实现真正的 ajax 请求

// api/books.js
import axios from 'axios';

export default {
  async get() {
    return new Promise(resolve => {
      axios.get('/api/books').then(response => {
        resolve(response.data);
      });
    });
  },
  async updateStatus(isbn, status) {
    return new Promise(resolve => {
      axios.put(`/api/books/${isbn}`, { status }).then(response => {
        resolve(response.data);
      });
    });
  },
};

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现图书管理系统 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 京东 Vue3 组件库支持小程序开发的详细流程

    以下是详细讲解“京东 Vue3 组件库支持小程序开发的详细流程”的完整攻略: 1. 准备工作 在开始开发之前,需要先准备好以下工作: 首先安装 Node.js (大于v10.13)和 yarn。 新建一个 Vue3 项目,使用 Vue CLI 搭建,并且安装好小程序开发的相关依赖。 2. 下载并安装组件库 京东 Vue3 组件库已经支持小程序开发,我们可以直…

    Vue 2023年5月27日
    00
  • vuejs中使用mixin局部混入/全局混入的方法详解

    下面我详细讲解下“vuejs中使用mixin局部混入/全局混入的方法详解”。 什么是Mixin? 在VueJS中,Mixin是一种可以将多个组件中重复的代码封装成可复用的功能的方法。你可以将一些常见的代码部分提取出来形成一个Mixin对象,然后将它应用到多个组件中去。 全局混入 全局混入是指将Mixin全局应用于所有的Vue实例中去。这样做的好处是可以避免重…

    Vue 2023年5月28日
    00
  • cdn模式下vue的基本用法详解

    CDN模式下Vue的基本用法详解 本文将会详细介绍如何在CDN模式下使用Vue.js,并且通过两个示例说明其基本用法。 什么是CDN模式 CDN即Content Delivery Network,翻译为内容分发网络。在Web开发中,我们往往需要引用第三方库,例如jQuery、Vue等。CDN模式是指我们将这些库放在一个分布式的服务器群集中,用户在访问我们的网…

    Vue 2023年5月27日
    00
  • vue组件生命周期钩子使用示例详解

    Vue组件生命周期钩子使用示例详解 在Vue组件的生命周期中,每个实例会从创建、挂载、更新、销毁四个不同的阶段。在这些不同的阶段中,我们可以通过使用生命周期钩子函数来控制组件的行为。本文将详细讲解Vue组件生命周期钩子函数的使用方法,并通过示例代码介绍其具体应用。 Vue组件生命周期钩子函数 Vue组件生命周期可以分为8个阶段,每个阶段都有对应的生命周期钩子…

    Vue 2023年5月27日
    00
  • Vue执行方法,方法获取data值,设置data值,方法传值操作

    Vue是一个现代化的JavaScript框架,Vue提供了许多易用的方法和 变量来加快我们前端应用的开发速度。本文将详细讲解Vue执行方法,方法获取data值,设置data值以及方法传值操作。 Vue执行方法 在Vue中,我们可以使用方法来执行一些操作,例如当我们点击一个按钮时,就需要执行方法来处理交互事件。定义Vue方法的方式如下所示: <templ…

    Vue 2023年5月28日
    00
  • js如何操作localstorage

    操作LocalStorage是通过Javascript提供的API来进行的。LocalStorage提供了一些非常有用的方法,可以帮助我们完成一些复杂的任务。下面我来详细讲解一下如何通过JS操作Localstorage。 什么是LocalStorage? LocalStorage是HTML5标准提供的一种本地存储机制,提供了类似cookie的API,但是比C…

    Vue 2023年5月28日
    00
  • 使用Vue实现简单日历效果

    下面就是使用Vue实现简单日历效果的完整攻略: 1. 创建Vue项目 首先需要通过Vue CLI工具创建一个Vue项目,具体步骤在这里就不详细阐述了,如果不熟悉Vue CLI的使用,可以参考Vue CLI文档。 2. 安装依赖 在创建好Vue项目之后,需要安装一些依赖,在项目根目录下运行以下命令: npm install moment –save 这里我们…

    Vue 2023年5月29日
    00
  • Vue3之 Vue CLI多环境配置

    下面是关于Vue CLI多环境配置的完整攻略。 环境变量 在实际开发中,一个项目可能需要在不同的环境中运行,例如开发环境、测试环境和生产环境等。为了方便统一管理和运用环境变量,Vue CLI提供了一种简单的方式来管理环境变量和配置。它使用.env.*(如.env.development、.env.production等)文件作为环境变量文件,可以在运行开发或…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部