vue实现图书管理系统

yizhihongxing

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日

相关文章

  • vue+element的表格实现批量删除功能示例代码

    下面是 “vue+element的表格实现批量删除功能示例代码” 的完整攻略: 1. 安装 Element UI 和 Axios 在开始之前,你需要先安装 Element UI 和 Axios,可以使用 npm 来安装: npm install element-ui axios –save 同时在文件中引入: import Vue from ‘vue’ i…

    Vue 2023年5月28日
    00
  • vue项目中$t()的意思是什么

    $t() 是 Vue 项目中用于实现多语言国际化的方法。它的作用是将被翻译的文本和当前语言转换成对应的文本。 1. 安装和配置 i18n 库 使用 $t() 的前提是,你需要在 Vue 项目中安装和配置好 i18n 库。下面是安装和配置 i18n 库的示例代码: import Vue from ‘vue’; import VueI18n from ‘vue-…

    Vue 2023年5月27日
    00
  • vue3日历控件的具体实现

    下面我将为你详细讲解“Vue3日历控件的具体实现”的完整攻略。 1. 前置知识 在开始具体实现前,需要了解的前置知识有: 基本的Vue3语法和Vue3的生命周期 Vue3的响应式数据和计算属性的使用方式 Date对象以及常用的时间处理库如moment.js 2. 实现思路 2.1 整体结构 我们需要实现一个日历控件组件,那么它的整体结构应该如下: <t…

    Vue 2023年5月28日
    00
  • vue style width a href动态拼接问题的解决

    来讲一下“vue style width a href动态拼接问题的解决”的完整攻略。 问题描述 在使用Vue开发过程中经常会遇到需要动态拼接URL的情况,比如在a标签中需要拼接参数、在img标签中需要拼接图片名称等。但是动态拼接的URL中可能需要包含Vue中的变量,而Vue模版字符串中不能直接嵌入JS代码。 解决方案 要解决这个问题,我们可以使用绑定属性和…

    Vue 2023年5月27日
    00
  • vue组件间通信全面讲解

    下面我将详细讲解Vue组件间通信的完整攻略。 1. 父子组件通信 父子组件通信是Vue中最常见的通信方式,我们可以通过props和$emit两个属性来实现。 1.1 通过props向子组件传递数据 我们可以通过在父组件中使用props来向子组件中传递数据。子组件中使用prop来接受数据。 <!– 父组件 –> <template>…

    Vue 2023年5月27日
    00
  • React中Portals与错误边界处理实现

    当React应用程序遇到问题或出现错误时,错误边界(error boundaries)特别有用。错误边界是React组件,它会在渲染期间捕获并打印任何在树的子组件中抛出的JavaScript错误,并且,相当于错误被“停留”在边界内,防止应用程序崩溃。下面就让我们来详细讲解React中的错误边界处理以及Portals的使用。 错误边界(Error Bounda…

    Vue 2023年5月28日
    00
  • webpack + vue 打包生成公共配置文件(域名) 方便动态修改

    要实现“webpack + vue 打包生成公共配置文件(域名) 方便动态修改”,可以参照以下步骤: 创建配置文件在项目根目录下创建一个config.js文件,用于存放公共配置信息,例如域名、API地址等。在文件中定义一个对象,包含需要的配置信息。示例代码如下: “`javascript// config.js module.exports = { dom…

    Vue 2023年5月28日
    00
  • Vue filter介绍及详细使用

    Vue filter介绍及详细使用攻略 1. 什么是Vue filter Vue filter是Vue的一个功能,在Vue组件模板中使用{{ someData | filterName }}的方式,可以对一些字符串、数字、日期等进行处理,返回新的字符串、数字、日期等内容。可以用于格式化展示数据、处理一些业务逻辑等。 2. 如何定义Vue filter 在Vu…

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