基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

这篇具有很好参考价值的文章主要介绍了基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本图书管理系统是基于Vue、Ajax、Node.js等技术的管理系统,笔者给其命名为阳光图书管理系统,意味着我们这个年纪应该活得洒脱像阳光一样,应充满活力与信心。再此感谢老师朋友的悉心指导,由于此系统是笔者初次完成的一个小型管理系统,必定有许多纰漏,如有不足请指正。


基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】


阳光图书馆设计与实现

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

1、绪论

1.1 选题背景

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

1.2 研究的目的及意义

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

1.3 论文组织结构

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

2、相关技术

2.1 Ajax异步加载

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

AJAX 是开发者的梦想,因为您能够:
	不刷新页面更新网页
	在页面加载后从服务器请求数据
	在页面加载后从服务器接收数据
	在后台向服务器发送数据

2.2 Axios

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

2.3 Vue

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

2.4 Node.js

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
jsonServer
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

3、系统需求分析

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

3.1 可行性设计

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

3.2 系统功能分析

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

3.3 系统非功能设计

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

4、系统设计

4.1 系统功能模块详细设计

下图是该实验的模块设计图
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
请求方式具体表现:
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

4.2 系统功能流程分析

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

5、系统实现

系统的具体实现过程,在此不再赘述,可以评论区留言将项目发送到您的邮箱。

5.1 管理员验证身份功能实现

(1)用户登录页面以及可以伸缩页面兼容性测试【响应式布局】

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(2)用户登录失败与成功给出的不同提示

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(3)用户注册页面与功能的实现

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(4)用户找回密码

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(5)用户注销账号

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

5.2 图书增删改查

(1)新增前、新增后

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(2)删除前、删除后

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(3)修改前、修改后

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(4)查重机制

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

6、测试

系统开发完成之后,上线使用之前系统测试是必须的,因为只有对系统进行一个全面的测试,我们才可能发现系统中可能存在的问题,这些问题可能是技术缺陷,功能不全,业务需求达不到预先的效果等。新开发出来的系统没有十全十美的,所以这些缺陷有可能在测试中发现并得到解决,系统测试方法有很多,并且各个所占时间都不同,功能测试在整个系统测试的过程中占据的比例较大,功能测试也叫黑盒测试,黑盒测试不需要测试软件内部结构,目的是测试系统的功能。只要测试人员搭建好系统测试环境 。对各个函数接口进行测试即可。

6.1 测试环境

硬件环境:笔记本或台式电脑
操作系统:Windows 10
软件环境: 谷歌浏览器、Microsoft Edge浏览器

6.2 测试用例

只有严格按照完整的测试用例来对系统进行测试,才能使得系统不管是功能还是性能方面的质量都有所保证,没有十全十美的软件系统,但是我们可以通过测试减少很多不必要的错误,下面即是该系统的部分测试用例。

(1)图书管理测试用例

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

(2)管理员登录操作用例

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

结束语

本次实验的设计与开发,是对本学期学习的一种很好的总结,在本学期的实验中,本次实验很具有挑战性,因此我选择了这个项目作为我的实验项目,在完成了实验的时候,我也遇到了许多困难与错误,在需求不明确的时候盲目的开发造成错误百出,某些知识点的掌握还不够,也有一些地方与预期不相符,我不得不查询各种资料,在一次次探讨之中,我慢慢的掌握的许多知识,在这些知识的认识之下,完成了该实验的设计与开发,技术与业务能力也有所提高,这对以后的事业发展有一定的积极影响作用

参考文献

基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

致谢

本次实验的开发与设计是在郭德先老师的指导下完成的,老师的建议和谆谆教诲使得实验在一点点的完善,在这一学期的学习中,正是老师的责任心引导着我们完成一次又一次的实验,每次遇到解决不了的问题时,都会向老师咨询,老师总是能给出合理的建议并不断鼓励我完成实验,再次由衷的感谢老师。


源码

项目目录结构

大家根据这个项目的目录结构搭建即可,如有疑问评论区私聊博主。想要搭建好的项目评论区留言邮箱。
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

主页【index.html】

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" />
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>

    <link rel="stylesheet" href="../css/index.css" />
    <title>阳光图书馆</title>
  </head>
  <body>
    <div id="logn" style="text-align: center">
      <el-dialog
        :visible.sync="dialogVisible"
        style="width: 70%; text-align: center; position: absolute; left: 15%; top: 20%"
      >
        账号:<input type="text" v-model="temp_node.id" /> <br /><br />
        密码:<input type="password" v-model="temp_node.name" /> <br /><br />
        <!-- 年龄:<input type="text" v-model="temp_node.age" /> <br /><br /> -->
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false;dialogs();">确 定</el-button>
      </el-dialog>
      <el-dialog
      :visible.sync="dialogVisible1"
      style="width: 70%; text-align: center; position: absolute; left: 15%; top: 20%"
    >
      账号:<input type="text" v-model="temp_node.id" /> <br /><br />
      <!-- 密码:<input type="password" v-model="temp_node.name" /> <br /><br /> -->
      年龄:<input type="text" v-model="temp_node.age" /> <br /><br />
      <el-button @click="dialogVisible1 = false">取 消</el-button>
      <el-button type="primary" @click="dialogVisible1 = false;losepasswd();">确 定</el-button>
    </el-dialog>
    </div>
    <div class="back1" style="position: absolute">
      <div class="namebgc">
        <div class="head1"></div>
        <div class="headfont">
          <div></div>
          <div></div>
          <div></div>
          <div></div>
          <div></div>
          <div></div>
        </div>
      </div>
      <div class="headtext">
        <a href="#" class="button" onclick="vmadd()"> 登录 </a>
        <a href="resiger.html" class="button"> 注册 </a>
        <a href="#" class="button" onclick="vmlook()"> 找回密码 </a>
        <a href="#" class="button" onclick="vmdel()"> 注销账号 </a>
      </div>
    </div>
    <script>
      function vmadd() {
        vm.$data.dialogVisible = true
        vm.$data.logordel = true
      }
      function vmdel() {
        vm.$data.dialogVisible = true
        vm.$data.logordel = false
      }
      function vmlook() {
        vm.$data.dialogVisible1 = true
        vm.$data.logordel = 3
      }
      let vm = new Vue({
        el: '#logn',
        data: {
          userList: [],
          dialogVisible: false,
          dialogVisible1: false,
          textvalue: '',
          index: '',
          temp_node: {
            id: '',
            age: '',
            name: '',
          },
          logordel:0,
        },
        methods: {
          //代码还是有点复杂:我们程序员还要手动完成数据组装
          search() {
            axios({
              url: 'http://localhost:3000/users',
            })
              .then(function (response) {
                vm.$data.userList = response.data
              })
              .catch(function (error) {
                //失败
                console.log(error)
                console.log('===请求失败了===')
              })
          },
          dialogs() {
            if (this.$data.logordel) {
              this.mlogin()
            } else {
              this.deluser()
            }
            this.resetTempNode();
          },
          // 登录函数
          mlogin() {
            for (let i = 0; i < this.userList.length; i++) {
              if (this.userList[i].id == this.temp_node.id && this.userList[i].name == this.temp_node.name) {
                alert('登录成功!')
                // 前端小练习\阳光图书馆\html\opbook.html
                // location.replace('D:/goStudy/前端大作业/前端小练习/opedata.html')
                location.replace('opbook.html')
                return
              }
            }
            alert('未找到此用户!')
          },
          // 删除函数
          deluser() {
            for (let i = 0; i < this.userList.length; i++) {
              if (this.userList[i].id == this.temp_node.id && this.userList[i].name == this.temp_node.name) {
                axios({
                  method: 'DELETE', //删除
                  url: 'http://localhost:3000/users/' + this.temp_node.id, //id为"hello"
                }).then(function (response) {
                  console.log(response.data)
                })
                alert('注销成功!')
                this.search()
                return
              }
            }
            alert('未找到此用户!')
          },
          losepasswd(){
            for (let i = 0; i < this.userList.length; i++) {
              if (this.userList[i].id == this.temp_node.id && this.userList[i].age == this.temp_node.age) {
                // console.log(this.userList[i].name)
                alert("您的密码是:"+this.userList[i].name);
                this.resetTempNode();
                return
              }
            }
            alert('您的信息有误!')
            this.resetTempNode();
          },
          resetTempNode(){
            this.temp_node.id = ''
            this.temp_node.name = ''
            this.temp_node.age = ''
          }
        },
        created: function () {
          this.search()
        },
      })
    </script>
  </body>
</html>

图书的增删改查【opbook.html】

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" />
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <title>操作图书</title>
  </head>
  <!-- style="background-image: url(../imgs/image.png); background-repeat: no-repeat; background-size: cover;" -->
  <body>
    <div id="app">
      <el-container>
        <el-header>
          <el-menu class="el-menu-demo" mode="horizontal">
            <el-menu-item index="1">处理中心</el-menu-item>
            <el-submenu index="2">
              <temp_nodelate slot="title">我的工作台</temp_nodelate>
              <el-menu-item index="2-1">选项1</el-menu-item>
              <el-menu-item index="2-2">选项2</el-menu-item>
              <el-menu-item index="2-3">选项3</el-menu-item>
              <el-submenu index="2-4">
                <temp_nodelate slot="title">选项4</temp_nodelate>
                <el-menu-item index="2-4-1">选项1</el-menu-item>
                <el-menu-item index="2-4-2">选项2</el-menu-item>
                <el-menu-item index="2-4-3">选项3</el-menu-item>
              </el-submenu>
            </el-submenu>
            <el-menu-item index="3" disabled>消息中心</el-menu-item>
            <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item>
            <el-menu-item index="4" style="position: absolute; right: 10%; background-color: aqua; color: black; border-radius: 40%">
              <a href="index.html" style="text-decoration: none">退出登录</a>
            </el-menu-item>
          </el-menu>
        </el-header>

        <el-main >
        <!-- 信息录入框 -->
          <el-dialog
            title="请输入您的信息!"
            :visible.sync="dialogVisible"
            style="width: 70%; text-align: center; position: absolute; left: 15%"
          >
            id:<input type="text" v-model="temp_node.id" /> <br /><br />
            书名:<input type="text" v-model="temp_node.name" /> <br /><br />
            作者:<input type="text" v-model="temp_node.author" /> <br /><br />
            价格:<input type="text" v-model="temp_node.price" /> <br /><br />
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="dialogVisible = false;add_or_amend();">确 定</el-button>
          </el-dialog>
          <div id="app" class="mylist">
          	<!-- 卡片的样式进行展示 -->
            <el-card class="box-card" >
            <!-- 信息展示 -->
              <el-table :data="bookList" style="width: 100%;">
                <el-table-column prop="id" label="编号" width="%20"></el-table-column>
                <el-table-column prop="name" label="书名" width="%20"></el-table-column>
                <el-table-column prop="author" label="作者" width="%20"></el-table-column>
                <el-table-column prop="price" label="价格(元)" width="%20"></el-table-column>
                <el-table-column label="操作" width="%20">
                  <temp_nodelate slot-scope="scope">
                    <el-button
                      type="warning"
                      style="width: 30%"
                      v-on:click="addoramend=false;dialogVisible=true;index=scope.$index;"
                      >修改</el-button
                    >
                    <el-button type="danger" style="width: 30%" v-on:click="index=scope.$index;del();">删除</el-button>
                  </temp_nodelate>
                </el-table-column>
              </el-table>

              <!-- 新增按钮 -->
              <div style="text-align: center">
                <el-button style="width: 15%; margin-top: 1%" v-on:click="addoramend=true;dialogVisible=true"
                  >+</el-button
                >
              </div>
            </el-card>
          </div>
        </el-main>

        <el-footer style="position: absolute; bottom: 20px; width: 100%">
          <el-card>
            <div style="text-align: center">
              <el-link href="https://element.eleme.io" target="_blank">默认链接</el-link>
              <el-link type="primary">主要链接</el-link>
              <el-link type="success">成功链接</el-link>
              <el-link type="warning">警告链接</el-link>
              <el-link type="danger">危险链接</el-link>
              <el-link type="info">信息链接</el-link>
            </div>
          </el-card>
        </el-footer>
      </el-container>
    </div>
    <script>
      // 创建一个vue对象
      let vm = new Vue({
        // 将这个vue对象与id为app的标签进行绑定
        el: '#app',
        // vue对象的数据库
        data: {
          // 存储所有书的列表
          bookList: [],
          dialogVisible: false,
          textvalue: '',
          sorttype: 0,
          index: '',
          temp_node: {
            id: '',
            name: '',
            author: '',
            price: '',
          },
          addoramend: true,
        },
        // vue对象的方法域
        methods: {
          //代码还是有点复杂:我们程序员还要手动完成数据组装
          search() {
            axios({
              url: 'http://localhost:3000/book',
            })
              .then(function (response) {
                vm.$data.bookList = response.data
              })
              .catch(function (error) {
                //失败
                console.log(error)
                console.log('===请求失败了===')
              })
          },
          // 删除
          del() {
            let aaa = this.bookList[this.index]
            var mindex = this.index
            let bbb = this.bookList.indexOf(aaa)
            this.bookList.splice(bbb, 1)
            axios({
              method: 'DELETE', //删除
              url: 'http://localhost:3000/book/' + aaa.id,
            }).then(function (response) {
              console.log(mindex)
            })
          },
          // 修改
          amend() {
            let aaa = this.bookList[this.index]
            let str = aaa.id
            let bbb = this.bookList.indexOf(aaa)
            for (let i = 0; i < this.bookList.length; i++) {
              if (this.bookList[i].id == this.temp_node.id && i != bbb) {
                alert('操作失败')
                return
              }
            }
            // 将新的属性给这个节点
            this.bookList[bbb].id = this.temp_node.id
            this.bookList[bbb].name = this.temp_node.name
            this.bookList[bbb].author = this.temp_node.author
            this.bookList[bbb].price = this.temp_node.price
            // 先进行删除
            axios({
              method: 'DELETE', //删除
              url: 'http://localhost:3000/book/' + str,
            }).then(function (response) {
              console.log(response.data)
            })
						// 再进行添加
            axios({
              method: 'POST', //增加
              url: 'http://localhost:3000/book',
              data: this.temp_node,
            })
          },
          // 增加
          add() {
            // 判断一下表单是否为空
            if (this.temp_node.id != '' && this.temp_node.age != '') {
              let ma = { id: '', name: '', author: '', price: '' }
              ma.id = this.temp_node.id
              ma.name = this.temp_node.name
              ma.author = this.temp_node.author
              ma.price = this.temp_node.price
              for (let i = 0; i < this.bookList.length; i++) {
                if (this.bookList[i].id == ma.id) {
                  alert('该id已经存在!')
                  return
                }
              }
              // 将新的节点加入页面
              this.bookList.push(ma)
              // 将新的节点添加到数据库
              axios({
                method: 'POST', //增加
                url: 'http://localhost:3000/book',
                data: ma,
              })
                .then(function (response) {})
                .catch((err) => {
                  alert('操作失败')
                })
            }
          },
          // 判断是修改还是增加
          add_or_amend() {
            if (this.addoramend) {
              this.add()
            } else {
              this.amend()
            }
             // 操作完后将表单数据置空
            this.temp_node.id = ''
            this.temp_node.author = ''
            this.temp_node.name = ''
            this.temp_node.price = ''
          },
        },
        // 一个实例被创建之后执行的代码
        created: function () {
          this.search()
        },
      })
    </script>
  </body>
</html>

注册页面【resger.html】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <link rel="stylesheet" href="../css/resiger.css">
    <title>注册</title>
</head>
<body>   
    <div class="nav">
        <form action="python">
            <div style="color: steelblue;">
                I&nbsp&nbsp&nbsp&nbspD: <input type="text" id="userid" class="texta"><br>
                密&nbsp&nbsp&nbsp&nbsp码: <input type="password" id="userpasd" class="texta"><br>
                年&nbsp&nbsp&nbsp&nbsp龄: <input type="text" id="userage" class="texta"><br>
                <a type="button" class="mbuttom" href="#" onclick="resetvalue()">清空</a>
                <a type="button" class="mbuttom" href="#" onclick="submitvalue()">提交</a>
                <a type="button" class="mbuttom" href="index.html" style="width: 110px;">返回主菜单</a>
            </div>
        </form>
    </div>

    <script>
      // 将临时节点的数据恢复初始值
        function resetvalue(){
            document.getElementById("userid").value="";
            document.getElementById("userpasd").value="";
            document.getElementById("userage").value=""
        }
        // 获取各个文本框的数据
        function submitvalue(){
            vm.$data.temp_node.id=document.getElementById("userid").value
            vm.$data.temp_node.name=document.getElementById("userpasd").value
            vm.$data.temp_node.age=document.getElementById("userage").value
            vm.add()
        } 
       let vm = new Vue({
          el: '#app',
          data: {
            userList: [],
            temp_node: {
              id: '',
              age: '',
              name: '',
            },
          },
          methods: {
            search() {
              axios({
                url: 'http://localhost:3000/users',
              })
                .then(function (response) {
                  vm.$data.userList = response.data
                })
                .catch(function (error) {
                  //失败
                  console.log(error)
                  console.log('===请求失败了===')
                })
            },
            // 增加
            add(){
                    if(this.temp_node.id!=''&&this.temp_node.age!=''){
                              let ma={id:'',age:'',name:''};
                              ma.id=this.temp_node.id;
                              ma.age=this.temp_node.age;
                              ma.name=this.temp_node.name;
                              // 遍历用户列表进行查重
                              for(let i=0;i<this.userList.length;i++){
                                  if(this.userList[i].id==ma.id){
                                      alert('该id已经存在!请重新输入');
                                      resetvalue();
                                      return;
                                  }
                              }
                              // 没有重复将数据插入列表内
                              this.userList.push(ma);
                              alert("注册成功!点击确定去登录")
                              resetvalue();
                              axios({
                                  method:"POST",//增加
                                  url:"http://localhost:3000/users",
                                  data:ma,
                              }).then(function(response){
                              }).catch((err)=>{
                                  alert('操作失败');
                              })
                            location.replace('index.html')
                          }
                      },
          },
          // 一个实例被创建之后执行的代码
          created: function () {
            this.search()
          },
        })
      </script>
</body>
</html>

主页css样式【index.css】

/* 第一页背景 */
div {
  display: inline-block;
}
a {
  text-decoration: none;
}
/* body{        
            width: 100%;
        } */
.back1 {
  position: relative;
  /* display: inline-block; */
  width: 100%;
  height: 1200px;
  background: url('../imgs/image.png') no-repeat;
  background-size: 100% 100%;
}
/* 网站简介 */
.namebgc {
  position: absolute;
  top: -20%;
  width: 44%;
  height: 16%;
  background-color: transparent;
  transform: translate(70%, 180%);
}
.head1 {
  position: absolute;
  margin-top: 23px;
  margin-left: 39px;
  width: 15.3%;
  height: 65%;
  background: url('../imgs/head1.png') no-repeat;
  background-size: 100% 100%;
  background-color: transparent;
  /* transform: translate(10%,10%); */
  transition: all 1s;
}
.head1:hover {
  transform: rotate(360deg);
}
.headfont {
  background-color: transparent;
  width: 70%;
  text-align: center;
  margin-top: 20px;
  margin-left: 20px;
  position: absolute;
  left: 180px;
  font-size: 80px;
  font-weight: 700;
  transition: all 0.6s;
  /* font-family: '幼圆'; */
}
/* 当鼠标经过图标时,有一定的动画效果 */
.headfont div:nth-child(1) {
  transition: all 0.3s;
  color: blueviolet;
}
.headfont div:nth-child(1):hover {
  transform: translateY(-5px);
}
.headfont div:nth-child(2) {
  transition: all 0.3s;
  color: aqua;
}
.headfont div:nth-child(2):hover {
  transform: translateY(-5px);
}
.headfont div:nth-child(3) {
  transition: all 0.3s;
  color: cornflowerblue;
}
.headfont div:nth-child(3):hover {
  transform: translateY(-5px);
}
.headfont div:nth-child(4) {
  transition: all 0.3s;
  color: gold;
}
.headfont div:nth-child(4):hover {
  transform: translateY(-5px);
}
.headfont div:nth-child(5) {
  transition: all 0.3s;
  color: tomato;
}
.headfont div:nth-child(5):hover {
  transform: translateY(-5px);
}
/* 简介 1388*232 */
/* 放置登录、注册几个按钮的盒子 */
.headtext {
  background-color: transparent;
  position: absolute;
  width: 40%;
  height: 40%;
  transform: translate(80%, 60%);
  text-align: center;
  font-size: 26px;
}
.headtext .button {
  margin-left: 30%;
  margin-top: 1%;
  width: 40%;
  height: 100px;
  display: block;
  border-radius: 30%;
  border: cornflowerblue 5px solid;
  font-size: 40px;
  line-height: 100px;
  color: lightblue;
  transition: all 0.4s;
}
.headtext .button:hover {
  transform-origin: center;
  border-color: chartreuse;
  color: chartreuse;
  transform: scale(110%, 110%);
}

注册css样式【resiger.css】

.nav{
    display: inline-block;
    width: 100%;
    height: 780px;
    text-align: center;
    padding-top: 200px;
    line-height: 30px;
    background: url("../imgs/image.png") no-repeat;
    background-size: 100% 100%;
    font-size: 20px;
    font-weight: 700;
}
.texta{
    display: inline-block;
    width: 400px;
    height: 20px;
    margin-top: 20px;
}
.mbuttom{
   display: inline-block;
   width: 60px; 
   height: 30px; 
   border-radius: 15px;
   background-color: darkgray;
   margin-left: 20px;
   margin-right: 20px;
   margin-top: 25px;
   text-decoration: none;
   color: rgb(85,39,140);
}

root CSS【root.css】

*{
    margin: 0;
    padding: 0;
}

图片素材

本项目使用的是相对路径建好项目目录后直接将图片放在相应的目录即可
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】
基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】

环境安装包

node.js

http://nodejs.cn/

element-ui

https://element.eleme.io/#/zh-CN

vue.js文章来源地址https://www.toymoban.com/news/detail-491976.html

https://cn.vuejs.org/index.html

到了这里,关于基于Vue、Axios、Node.js的图书管理系统【网页前端高级编程】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于VUE的图书借阅管理系统的设计与实现

    目录 一、摘要 二、技术描述 三、部分截图 四、获取方式         随着我国经济的高速发展,人们对图书的需求也愈发旺盛,而传统图书管理模式存在以下弊端:信息存储和分类操作不够高效,导致查找书籍困难;借还书流程繁琐,工作量大;图书统计和更新困难,无法

    2024年02月07日
    浏览(63)
  • 基于Spring、SpringMVC、MyBatisPlus+Vue的图书管理系统

    🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关

    2024年02月08日
    浏览(59)
  • axios 实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台

    书接上回,上一篇文章介绍了一个基于 Vue3 和 ElementPlus 的联系人列表管理后台小 demo (Vue3 + ElementPlus实战学习——模拟简单的联系人列表管理后台),在有了上一篇文章的基础上,我们试着用 axios 来获取数据,而不是用写死的数据,然后用 Node.js + Vue3 + ElementPlus 来实现联系

    2024年02月10日
    浏览(56)
  • axios实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台

    书接上回,上一篇文章介绍了一个基于 Vue3 和 ElementPlus 的联系人列表管理后台小 demo (Vue3 + ElementPlus实战学习——模拟简单的联系人列表管理后台),在有了上一篇文章的基础上,我们试着用 axios 来获取数据,而不是用写死的数据,然后用 Node.js + Vue3 + ElementPlus 来实现联系

    2024年02月09日
    浏览(78)
  • axios 实战进阶练习( axios 封装篇)——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台的 axios 封装实战

    在之前的文章 axios 实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 中,我们完成了这个 基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 的项目,其中项目的后端接口是用 Node.js 编写的,通过 axios 来获取接口,所以这篇文章我们来对这个 axi

    2024年02月11日
    浏览(91)
  • 基于Java+SpringBoot+Vue前后端分离图书管理系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 2022-2024年

    2024年02月10日
    浏览(134)
  • node.js+vue企业人事管理系统q731f

    中小企业人事管理系统的主要开发目标如下: (1)实现管理系统信息关系的系统化、规范化和自动化; (2)减少维护人员的工作量以及实现员工对信息的控制和管理。 (3)方便查询信息及管理信息等; (4)通过网络操作,改善处理问题的效率,提高操作人员利用率; (

    2024年02月10日
    浏览(46)
  • 基于Node.js的后台管理系统的数据表格导出下载

    今天在工作的时候接触到一个需求,就是现在有一个简单的后台管理系统是基于node.js来实现的,现在需要将其中的一个表格数据下载下来。乍一听还以为这个是一个简单的需求,以为只要简单的一个小时就能完成,没有想到直接花了我将近两个半小时并且还是在他人的帮助下

    2024年02月13日
    浏览(53)
  • 基于Java的图书借阅网站, java+springboot+vue开发的图书借阅管理系统 - 毕业设计 - 课程设计

    本程序实现图书的智能化、信息化和简单化;实现图书信息的增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时数据库的提交和更改和对普通用户的增、删、改、查;提高图书管理员工作信息报送及反馈的工作效率,减轻管理员的劳动负担;提高信息的及时性和

    2024年04月28日
    浏览(67)
  • 前后端分离项目-基于springboot+vue的图书馆管理系统的设计与实现(内含代码+文档+报告)

    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅 由于篇幅限制,想要获取完整文章或者源码,或者代做,拉到文章底部即可看到个人VX。 🍅 2023年

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包