基于Vue+Element UI的文件管理系统-Demo

这篇具有很好参考价值的文章主要介绍了基于Vue+Element UI的文件管理系统-Demo。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录一下之前写过的一个文件管理系统demo。
功能包括文件夹的新增、删除、重命名及移动,文件的上传、删除、移动及下载功能。
相关功能的操作直接和 后端 进行请求交互。
因为该demo集成在大的系统中,懒得提取建库开源,所以算是只记录思路。

运行截图

  • 右键文件夹时显示操作目录
    vue 文件管理器,demo,vue.js,前端
  • 右键文件时显示操作目录vue 文件管理器,demo,vue.js,前端
  • 新建文件夹vue 文件管理器,demo,vue.js,前端
  • 上传文件vue 文件管理器,demo,vue.js,前端
  • 重命名文件夹vue 文件管理器,demo,vue.js,前端
  • 移动vue 文件管理器,demo,vue.js,前端

实现代码

shareSpace.vue 为页面组件
addFolder.vue 为文件上传弹窗组件
moveFolder.vue 为移动文件/文件夹弹窗组件

// shareSpace.vue
<template>
  <div class="app-container">
    <el-page-header class="pageHeader" :content="'当前所处:' + currentLocationName" @back="goBack">
    </el-page-header>
    <el-divider></el-divider>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5" style="float: right;">
        <el-button plain icon="el-icon-refresh" size="mini" @click="refreshGetList">刷新</el-button>
      </el-col>
      <el-col :span="1.5" style="float: right;">
        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="addFolder">新建文件夹</el-button>
      </el-col>
      <el-col :span="1.5" style="float: right;">
        <el-button type="success" plain icon="el-icon-upload" size="mini" @click="addFile">上传文件</el-button>
      </el-col>

    </el-row>

    <!-- 文件浏览区 -->
    <div style="overflow: hidden;">
      <el-card class="drawing_card" v-loading="cardLoading" style="height: 60vh">
        <template v-if="folderList.length === 0 && filesList.length === 0">
          <el-empty description="暂无文件,请创建一个文件夹吧" style="height:60vh"></el-empty>
        </template>
        <!-- 文件夹 -->
        <div v-for="( item, index ) in  folderList ">
          <div class="folderContainer">
            <div class="folderWrapper" @dblclick="doubleClickFolder(index, item)"
              @contextmenu.prevent.stop="rightClickFolder(index, item, $event)">
              <img src="@/assets/images/folder/folder.png" style="width: 100px;height: 90px;margin-top: -13px"
                @contextmenu.prevent.stop="rightClickFolder(index, item, $event)" />
              <div class="folderName">
                <span>{{
                  item.folderName.length > 10 ? item.folderName.substring(0, 6) + '...' : item.folderName
                }}</span>
              </div>

            </div>

          </div>
        </div>
        <!-- 文件 -->
        <div v-for="( item, index ) in  filesList ">
          <div class="folderContainer">
            <div class="folderWrapper" @dblclick="down(item.fileUrl)">
              <img src="@/assets/images/folder/fileImg.png" style="width: 100px;height: 90px;margin-top: -13px"
                @contextmenu.prevent.stop="rightClickfile(index, item, $event)" />
              <div class="folderName">
                <span>{{
                  item.fileName.length > 10 ? item.fileName.substring(0, 6) + '...' : item.fileName
                }}</span>
              </div>

            </div>
          </div>
        </div>
      </el-card>
    </div>


    <!-- 文件夹【右键菜单】 -->
    <div class="add-folder-9" :style="folderStyle" v-show="folderShow">
      <div class="add-folder-1">
        <div class="add-folder-2" @click="openFolder">
          打开文件夹
        </div>
        <div style="border: 2px solid rgba(18,17,42,.07)"></div>
        <div class="add-folder-2" @click="moveFolder">
          移动
        </div>
        <div style="border: 2px solid rgba(18,17,42,.07)"></div>
        <div class="add-folder-2" @click="updateFloder">
          重命名
        </div>
        <div style="border: 2px solid rgba(18,17,42,.07)"></div>
        <div class="add-folder-6" @click="deleteFolder">
          删 除
        </div>
      </div>
    </div>
    <!-- 文件【右键菜单】 -->
    <div class="add-folder-9" :style="fileStyle" v-show="fileShow">
      <div class="add-folder-1">

        <div class="add-folder-2">
          <a :href="clickFilePath" download="1">下载文件</a>

        </div>
        <div style="border: 2px solid rgba(18,17,42,.07)"></div>
        <!-- <div class="add-folder-2" @click="updateFloder">
          重命名
        </div>
         <div style="border: 2px solid rgba(18,17,42,.07)"></div> -->
        <div class="add-folder-2" @click="moveFolder">
          移动
        </div>
        <div style="border: 2px solid rgba(18,17,42,.07)"></div>
        <div class="add-folder-6" @click="deleteFileFun">
          删 除
        </div>
      </div>
    </div>
    <!-- 上传文件 弹窗 -->
    <addFolder ref="addFolder1" :currentLocationId="currentLocationId" />
    <moveFolder ref="moveFolder1" :moveData="moveData"></moveFolder>
  </div>
</template>

<script>

import addFolder from '../components/addFolder.vue'
import moveFolder from '../components/moveFolder.vue'
import { qeryFolderList, createPublicFolder, renameFolder, deleteFolder, deleteFile } from '@/api/folder/folder'


export default {
  name: 'shareSpace',
  components: { addFolder, moveFolder },
  data() {
    return {
      historyFolderId: 0,//历史文件夹id,用于【返回上一级】
      historyFolderName: '',//历史文件夹name,用于【返回上一级】

      currentLocationId: 0,//当前所处位置(文件夹)id,0为根目录
      currentLocationName: '共享空间',//当前所处位置(文件夹)名

      //移动文件(夹)时需要的参数
      moveData: {
        typeofFolder: 0,//所选对象的类型(1:文件夹;2:文件)
        clickFolderId: -1,//被右键的文件夹id
      },

      cardLoading: false,
      folderList: [],//文件夹列表
      filesList: [],//文件列表
      // 文件夹 右键菜单栏
      folderStyle: {
        left: '0px',
        top: '0px'
      },
      folderShow: false,
      clickFolderId: -1,//被右键的文件夹id
      clickFolderName: '',//被右键的文件夹名
      // 文件 右键菜单栏
      fileStyle: {
        left: '0px',
        top: '0px'
      },
      fileShow: false,
      clickFileId: -1,//被右键的文件id
      clickFileName: '',//被右键的文件名
      clickFilePath: '',//被右键的文件路径-已加上下载的路径网站前端


      queryParams: {  //查询参数
        folderId: 0 //目标文件(夹)id,值为0则查询根目录文件(夹)
      }
    }
  },
  methods: {
    a() {
      window.open(`这里填服务器储存文件的地址啦~` + this.clickFileName);
    },

    //返回上一级
    goBack() {
      if (this.currentLocationId == 0) {
        this.$message({
          message: '已经不能再往后退啦!',
          type: 'warning'
        });
      } else {
        this.queryParams.folderId = this.historyFolderId;
        this.currentLocationId = this.historyFolderId;
        this.currentLocationName = this.historyFolderName == null ? '文件管理空间' : this.historyFolderName;
        this.historyFolderId = this.currentLocationId;
        this.historyFolderName = this.currentLocationName;
        this.getList();
      }

    },
    // 获取列表数据
    getList() {
      this.loading = true
      qeryFolderList(this.queryParams).then(response => {
        console.log(response)
        this.folderList = response.data.folders
        this.filesList = response.data.sysFiles

        this.historyFolderId = response.data.sysFolder == null ? 0 : response.data.sysFolder.parentId;
        this.historyFolderName = response.data.sysFolder == null ? '文件管理空间' : response.data.sysFolder.parentName;

      })
    },
    // 刷新当前列表
    refreshGetList() {
      this.queryParams.folderId = this.currentLocationId;
      this.getList()
      this.$message({
        message: '已经成功获取最新数据啦!',
        type: 'success'
      });
      this.initClickId()
    },

    //上传文件
    addFile() {
      this.$refs.addFolder1.open();
    },

    //创建文件夹
    addFolder() {

      this.$prompt('请输入新文件夹名称', '创建文件夹', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
      }).then(({ value }) => {
        let sysFolder = {
          folderName: value,
          parentId: this.currentLocationId
        }
        createPublicFolder(sysFolder).then(res => {
          if (res.code == 200) {
            this.$message({
              type: 'success',
              message: '创建成功 '
            });
            const that = this;
            setTimeout(function () {
              that.refreshGetList();  // 刷新当前页面
            }, 500);

          } else {
            this.$message({
              type: 'error',
              message: '创建失败 '
            });
          }
        })

      }).catch(() => {
      });
    },
    // 重命名文件夹
    updateFloder() {
      this.folderShow = false;
      this.$prompt('请输入文件夹的新名称', '重命名', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputValue: this.clickFolderName,
        inputErrorMessage: '输入不能为空',
        inputValidator: (value) => {       // 点击按钮时,对文本框里面的值进行验证
          if (!value) {
            return '输入不能为空';
          }
        },
      }).then(({ value }) => {
        let sysFolder = {
          folderName: value,
          folderId: this.clickFolderId //默认为0
        }
        renameFolder(sysFolder).then(res => {
          if (res.code == 200) {
            this.$message({
              type: 'success',
              message: '修改成功 '
            });
            let that = this;
            setTimeout(function () {
              that.refreshGetList();  // 刷新当前页面
            }, 500);

          } else {
            this.$message({
              type: 'error',
              message: '修改失败 '
            });
          }
        })

      })

    },
    //删除文件夹
    deleteFolder() {
      this.folderShow = false;
      this.$confirm('此操作将永久删除该文件夹,包括文件夹内的所有内容,是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteFolder(this.clickFolderId).then(res => {
          if (res.code == 200) {
            this.$message({
              type: 'success',
              message: '删除成功 '
            });
            let that = this;
            setTimeout(function () {
              that.refreshGetList();  // 刷新当前页面
            }, 1000);

          } else {
            this.$message({
              type: 'error',
              message: '删除失败! '
            });
          }
        })

      })
    },
    //打开文件夹
    openFolder() {
      this.folderShow = false;
      this.queryParams.folderId = this.clickFolderId;

      this.currentLocationId = this.clickFolderId;
      this.currentLocationName = this.clickFolderName;
      this.getList();


    },
    //鼠标双击文件夹
    doubleClickFolder(index, item) {

      this.clickFolderId = item.folderId;
      this.clickFolderName = item.folderName;
      this.openFolder();
    },

    //文件夹右键
    rightClickFolder(index, item, e) {

      this.initClickId()

      this.clickFolderId = item.folderId
      this.clickFolderName = item.folderName
      this.folderStyle.left = e.pageX - 140 + 'px'
      this.folderStyle.top = e.pageY - 70 + 'px'
      this.folderShow = true

      this.moveData.typeofFolder = 1


    },
    //文件 右键
    rightClickfile(index, item, e) {
      this.initClickId()

      this.clickFileId = item.fileId
      this.clickFileName = item.fileName
      this.clickFilePath = "https://huang-pu.oss-cn-guangzhou.aliyuncs.com/" + item.filePath
      this.fileStyle.left = e.pageX - 140 + 'px'
      this.fileStyle.top = e.pageY - 70 + 'px'
      this.fileShow = true


      this.moveData.typeofFolder = 2
    },
    //删除文件
    deleteFileFun() {
      this.fileShow = false;
      this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteFile(this.clickFileId).then(res => {
          if (res.code == 200) {
            this.$message({
              type: 'success',
              message: '删除成功 '
            });
            let that = this;
            setTimeout(function () {
              that.refreshGetList();  // 刷新当前页面
            }, 1000);

          } else {
            this.$message({
              type: 'error',
              message: '删除失败! '
            });
          }
        })

      })

    },

    //移动文件(夹)
    moveFolder() {
      this.fileShow = false

      //通过判断文件/文件夹被右键选择而进行参数存储
      if (this.clickFolderId != -1) {
        this.moveData.clickFolderId = this.clickFolderId;
      } else {
        this.moveData.clickFolderId = this.clickFileId;
      }

      this.$refs.moveFolder1.open();
    },

    //初始化右键选择相关参数
    initClickId() {
      this.clickFileId = -1;
      this.clickFolderId = -1;
      this.fileShow = false;
      this.folderShow = false;
    }

  },
  mounted() {
    //监听鼠标点击事件
    document.addEventListener("click", (e) => {
      if (!this.folderShow && !this.fileShow) return; // 如果右键菜单不显示,则不处理点击事件
      let target = e.target;
      while (target && target.parentNode) {
        if (target.parentNode.class === "folderContainer") {
          return;
        }
        target = target.parentNode;
      }
      this.folderShow = false;
      this.fileShow = false; // 如果点击的是其他区域,则隐藏
      this.clickFolderId = -1;
      this.clickFileId = -1;
    });
  },

  created() {
    this.getList()
  }
}
</script>


<style lang="scss">
.pageHeader {
  .el-page-header__content {
    font-size: 16px !important;
  }
}
</style>


<style scoped lang="scss">
.drawing_card {
  width: 100%;
  height: 100%;
  float: left;
  margin-top: 15px;
  overflow: auto;
  box-shadow: 0 5px 5px rgb(0 0 0 /10%);
  transition: all 0.9s;
  border-radius: 10px;
}

.folderContainer {
  width: 150px;
  float: left;
  display: block;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  margin-bottom: 20px;
  margin-left: 30px;
}



.folder {
  width: 110px;
  height: 80px;
  perspective: 600px;
  transform-style: preserve-3d;
  cursor: pointer;
}

.folderWrapper {
  width: 140px;
  height: 130px;
  padding: 20px 20px 10px 20px;
  position: relative;
  transition: all .2s ease;
  border-radius: 6px;
  cursor: pointer;
}

.folderWrapper:hover {
  background-color: aliceblue;
}


.folderName {
  margin-top: 5px;
  font-size: 14px;
  line-height: 20px;
  text-align: center;
  width: 100px;
}


.add-folder-9 {
  position: absolute;
  display: flex;
  justify-content: center;
  padding: 2px;
  align-items: center;
  width: 130px;
  background-color: rgba(6, 13, 20, .18);
  border-radius: 12px;
  box-shadow: 0px 8px 24px rgba(25, 25, 26, .06), 0px 4px 16px rgba(25, 25, 26, .04), 0px 0px 4px rgba(25, 25, 26, .04);
}

.add-folder-1 {
  overflow: hidden;
  width: 97%;
  height: 96%;
  background-color: #fff;
  border-radius: 10px;
}

.add-folder-2 {
  color: #19191a;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 36px;
  // margin-top: 5px;
  // margin-bottom: 5px
}

.add-folder-2:hover {
  background-color: rgba(6, 13, 20, .18);
  // border-radius: 10px;
  cursor: pointer;
}

.add-folder-6 {
  color: #19191a;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 36px;
  // margin-top: 5px;
}

.add-folder-6:hover {
  background-color: red;
  // border-radius: 10px;
  cursor: pointer;
}
</style>

移动操作时,当点击移动后,需要先获取整个系统的树型目录,将该文件(夹)所属的父文件夹id更改为 树型目录中所选的文件夹id 。

//moveFolder.vue
<template>
    <el-dialog v-if="dialogVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="移动"
        :visible.sync="dialogVisible" :show-close="false" width="400px" class="moveFolderDialog">
        <el-alert title="请选择要将当前文件(夹)移动到:" type="info" show-icon>
        </el-alert>
        <el-tree accordion :data="data" node-key="id" ref="tree" highlight-current @node-click="handleNodeClick">
        </el-tree>
        <div style="margin-top: 20px">
            <el-button type="success" @click="submit">确定</el-button>
            <el-button @click="close">取消</el-button>
        </div>
    </el-dialog>
</template>
<script>
import { getTreeDirectory, moveFolder, moveFile } from "@/api/folder/folder";
export default {
    name: 'moveFolder',
    props: ['moveData'],
    // moveDate对象中有两个参数: typeofFolder: 0,//所选对象的类型(1:文件夹;2:文件)
    //                          clickFolderId: -1,//所选对象的id
    data() {
        return {
            dialogVisible: false,
            data: [],//树型目录
            defaultProps: {
                children: 'children',
                label: 'label'
            },
            clickDirectoryId: -1,//所选择的移动目标文件夹id

        }
    },
    methods: {
        open() {
            this.dialogVisible = true,
                getTreeDirectory().then(res => {
                    console.log(res)
                    this.data = res.data
                })
        },
        close() {
            this.dialogVisible = false

        },
        submit() {
            if (this.moveData.typeofFolder == 1 && this.moveData.clickFolderId == this.clickDirectoryId) {
                this.$message({
                    type: 'error',
                    message: '移动失败!请勿把文件夹移动到它本身中! '
                });
            } else {
                if (this.moveData.typeofFolder == 1) {
                    this.moveFolderFun()
                } else if (this.moveData.typeofFolder == 2) {
                    this.moveFileFun()
                }
            }


        },
        //移动 文件夹
        moveFolderFun() {
            let dataObj = {
                folderId: this.moveData.clickFolderId,
                parentId: this.clickDirectoryId
            }
            moveFolder(dataObj).then(res => {
                if (res.code == 200) {
                    this.$message({
                        type: 'success',
                        message: '修改成功 '
                    });
                    let that = this;
                    this.dialogVisible = false
                    setTimeout(function () {
                        that.$parent.refreshGetList();  // 刷新当前页面
                    }, 500);

                } else {
                    this.$message({
                        type: 'error',
                        message: '修改失败 '
                    });
                }
            })

        },
        //移动 文件
        moveFileFun() {
            let dataObj = {
                fileId: this.moveData.clickFolderId,
                folderId: this.clickDirectoryId
            }
            moveFile(dataObj).then(res => {
                if (res.code == 200) {
                    this.$message({
                        type: 'success',
                        message: '修改成功 '
                    });
                    let that = this;
                    this.dialogVisible = false
                    setTimeout(function () {
                        that.$parent.refreshGetList();  // 刷新当前页面
                    }, 500);

                } else {
                    this.$message({
                        type: 'error',
                        message: '修改失败 '
                    });
                }
            })
        },

        //树型目录被选择时
        handleNodeClick(DirectoryId) {
            this.clickDirectoryId = DirectoryId.id
        }
    }

}
</script>
<style lang="scss">
.moveFolderDialog {
    .el-dialog__body {
        padding-top: 0 !important;
    }

    .el-alert {
        margin-bottom: 20px;
    }
}
</style>

文件上传时,后端同学需要对文件信息做进一步处理,即先执行自定义policy()方法获取服务器存储的key加入文件信息再存入数据库。
不必要,可根据个人需求直接修改返回文件信息即可。

//addFolder.vue
<template>
    <el-dialog v-if="dialogVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="上传文件"
        :visible.sync="dialogVisible" :show-close="false" width="400px">
        <el-upload ref="upload" :data="dataObj" action="这里填写文件上传到的服务器地址" class="upload-demo"
            drag :limit="1" :on-success="uploadSuccess" :on-error="uploadError" :on-exceed="handleExceed"
            :before-upload="beforeUpload" :auto-upload="false">
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">将文件拖到此处,或<em>点击上传,当前目录只允许上传1个文件</em></div>
        </el-upload>
        <div style="margin-top: 20px">
            <el-button icon="el-icon-upload2" type="success" @click="submit">提交</el-button>
            <el-button @click="close">取消</el-button>
        </div>
    </el-dialog>
</template>
<script>

import { policy, addFile } from "@/api/folder/folder";
import { getUUID } from "../../../utils/index"
export default {
    name: 'addFolder',
    props: ['currentLocationId'], //当前所处文件夹id
    data() {
        return {

            // oss资源
            dataObj: {},

            dialogVisible: false,

            // 文件信息 - 存于后端数据库
            fileInfo: {
                fileName: '',
                filePath: '',
                fileSize: 0,//单位为kb
                folderId: 0
            }
        }
    },
    methods: {
        open() {
            this.dialogVisible = true
        },
        close() {
            this.dialogVisible = false
            this.$parent.refreshGetList();
        },
        //文件改变调用
        handleExceed() {
            this.$message.error('当前目录只能上传一个文件!');
        },
        //上传成功
        uploadSuccess(res) {
         
            this.dialogVisible = false
            this.$parent.refreshGetList();
        },
        //上传失败
        uploadError() {
            this.$message.error('服务器异常请重试!');
        },
        //上传文件
        submit() {
            this.$refs.upload.submit();


        },
        // 资源上传前
        beforeUpload(files) {
            return new Promise((resolve, reject) => {
                policy().then(response => {
                //数据处理因为业务需求写入的,不必要。
                    //存储服务器数据处理
                    this.dataObj.policy = response.data.policy
                    this.dataObj.signature = response.data.signature
                    this.dataObj.ossaccessKeyId = response.data.accessid
                    this.dataObj.dir = response.data.dir
                    this.dataObj.host = response.data.host
                    this.dataObj.key = response.data.dir + getUUID() + files.name
                    console.log(this.dataObj)
                    //后端数据库数据处理
                    this.fileInfo.fileName = files.name;
                    this.fileInfo.filePath = this.dataObj.key;
                    this.fileInfo.fileSize = parseInt(files.size / 2024);//file.size的单位为字节,转换成kb
                    console.log(this.fileInfo)
                    resolve(true)

                    this.fileInfo.folderId = this.currentLocationId;//确定该文件所处的文件夹id 

                    //上传到后端数据库
                    addFile(this.fileInfo).then(res => {
                        if (res.code == 200) {
                            this.$message({
                                type: 'success',
                                message: '上传成功 '
                            });
                        } else {
                            this.$message({
                                type: 'error',
                                message: '上传失败 '
                            });
                        }
                    })
                })
            })
        },
    }
}
</script>
<style scoped lang="scss"></style>

api不知道需要不需要,一并丢上来好了。
该系统是集成在基于ruoyi框架的系统中。

//folder.js
import request from '@/utils/request'

//查询文件夹及文件列表
export function qeryFolderList(query) {
  return request({
    url: '/system/folder/listFolderAndFile/' + query.folderId,
    method: 'get',
    params: query
  })
}

//移动 前置请求-获取所有目录结构
export function getTreeDirectory() {
  return request({
    url: '/system/folder/listFolderids',
    method: 'get'
  })
}

//===================文件夹=====================

//新建公共文件夹
export function createPublicFolder(data) {
  return request({
    url: '/system/folder',
    method: 'post',
    data: data
  })
}
//重命名文件夹
export function renameFolder(data) {
  return request({
    url: '/system/folder',
    method: 'put',
    data: data
  })
}
//删除文件夹
export function deleteFolder(folderId) {
  return request({
    url: '/system/folder/' + folderId,
    method: 'delete'
  })
}
//移动文件夹
export function moveFolder(data) {
  return request({
    url: '/system/folder',
    method: 'put',
    data: data
  })
}

//===================文件=====================
// oss资源上传 - 后端服务器
export function policy() {
  return request({
    url: '/system/ziyuan/oss/policy',
    method: 'get'
  })
}
//上传文件-后端数据库
export function addFile(data) {
  return request({
    url: '/system/file',
    method: 'post',
    data: data
  })
}

//删除文件
export function deleteFile(fileId) {
  return request({
    url: '/system/file/' + fileId,
    method: 'delete'
  })
}

//移动文件夹
export function moveFile(data) {
  return request({
    url: '/system/file',
    method: 'put',
    data: data
  })
}

TODO:

没有制作分页查询操作。
有点乱(磕头,有空再整理。文章来源地址https://www.toymoban.com/news/detail-837300.html

到了这里,关于基于Vue+Element UI的文件管理系统-Demo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Vue2+element-ui后台管理系统(静态页面)

    node:https://nodejs.org/en/ git:https://git-scm.com/ vue:https://v2.cn.vuejs.org/v2/guide/installation.html element-ui:https://element.eleme.cn/#/zh-CN/component/installation 项目所需:https://pan.baidu.com/s/1ua0jp9YCtPH6slE49HDUBw 提取码:kkkk 在node和vue都调试、配置好的情况下使用vscode 在终端中输入命令 npm i -g @vue

    2024年02月06日
    浏览(58)
  • Vue + Element-ui实现后台管理系统---项目搭建 + ⾸⻚布局实现

    目录:导读 项目搭建 + ⾸⻚布局实现 一、项目搭建 1、环境搭建 2、项目初期搭建 二、Main.vue 三、左侧栏部分(CommonAside.vue) 四、header部分(CommonHeader.vue) 五、Home.vue 写在最后 这篇主要讲解 项目搭建 + 后台⾸⻚布局实现 : 整体效果 后台首页按布局一共包含3个部分: 1、左侧栏

    2024年02月02日
    浏览(52)
  • Vue + Element UI 实现权限管理系统 前端篇(四):优化登录流程

    1. 丰富登录界面 1.1 从 Element 指南中选择组件模板丰富登录界面,放置一个登录界面表单,包含账号密码输入框和登录重置按钮。 1.2 稍微调整一下界面样式 1.3 添加页面组件显示规则和操作响应,其中登录成功后,把登录用户信息存储到本地会话,用于配置路由跳转目标。

    2024年02月09日
    浏览(44)
  • Vue+Element UI 生鲜管理系统简介及项目搭建,页面布局(一)

    自从入了这家公司,就没分配过前端的工作了,在上一家还能前后端都写写,现在真是对vue的代码真是望尘莫及哇,前几天跟前端朋友交流前端知识的时候,发现自己脑子里面的前端代码好像被偷了一样,赶紧找个项目练练,虽然现在是java,以后还是想要做全栈呢( ▽ )(哈哈

    2024年02月11日
    浏览(43)
  • Spring Boot + Vue + Element UI的网上商城后台管理之订单管理系统

    以下是订单管理系统的思维导图,展示了系统的主要功能和模块之间的关系。 根节点 订单列表 查看订单列表 搜索订单 排序订单 导出订单列表 订单详情 查看订单详情 修改订单信息 修改商品信息 修改价格 修改收货地址 取消订单 处理订单 处理订单操作 确认订单 拒绝订单

    2024年02月03日
    浏览(49)
  • Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现菜

    菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作。 提供一个菜单查询接口,查询整颗菜单树形结构。 http/modules/menu.js 添加 findMenuTree 接口。 菜单管理界面 菜单管理界面是使用封装的表格树组件显示菜单结构,并提供增删改查的功能。 Menu.vue 其中对表格树组件进

    2024年02月10日
    浏览(44)
  • Vue3 + Element-UI 搭建一个后台管理系统框架模板

    本文将介绍如何基于Vue3和element-ui搭建一个后台管理系统框架模板。我们将详细讲解代码流程,并提供详细的说明。 Vue3 Element-ui Axios 本文假设读者已经熟悉Vue3和Element-ui的基本使用方法,并且对Axios有一定的了解。 步骤1:创建Vue3项目 我们可以使用Vue CLI来创建一个Vue3项目,

    2023年04月26日
    浏览(122)
  • 【前端】Vue+Element UI案例:通用后台管理系统-面包屑、tag栏

    参考视频: VUE项目,VUE项目实战,vue后台管理系统,前端面试,前端面试项目 案例 链接 【前端】Vue+Element UI案例:通用后台管理系统-导航栏(视频p1-16) https://blog.csdn.net/karshey/article/details/127640658 【前端】Vue+Element UI案例:通用后台管理系统-Header+导航栏折叠(p17-19) http

    2024年02月09日
    浏览(67)
  • Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统

    最近在做项目,花了一周的时间搭建了一个十分完备的汽车租赁后端管理系统。页面采用 纯Vue2+Element-ui搭建 ,后端采用 Springboot+Mybatis 搭建,数据库采用 Mysql 。包括了登录验证,根据不同权限进入不同界面、数据增删改查、表格分页、表格excel导出等等功能。已开源至git,在

    2024年02月09日
    浏览(47)
  • 黑马程序员课程Vue实战项目_Element-ui——电商后台管理系统-商品管理(商品列表)

    目录 商品列表 一.创建一个子分支 二.创建组件 三.绘制商品列表的页面基本结构 1.面包屑导航  2.卡片视图区域 四.功能 1.搜索  2.删除  3.添加 五.提交代码 git branch——查看当前所在分支 git checkout -b goods_list——创建新的子分支goods_list git branch——查看当前所在分支 git pus

    2024年02月08日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包