1 Star 1 Fork 0

uni超 / 基于Vue2 + ElementUI 的用户增删改查案例

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

案例介绍

为了熟悉 Vue2 框架 的使用,现采用 Vue2的基础知识、Router路由、Vuex 管理仓库来实现一个可对用户进行增删改查的小案例。数据存储在浏览器的 localStorage 本地缓存中,方便模拟从后端获取数据,不过这里仅有前端部分,没有涉及 axios 请求相关的内容。 技术栈:Vue2 + ElementUI + Vue Router + Vuex 【注:本案例只是作为初学者的分享,里面的设计思路不一定适合特定场景,可能存在许多不足,仅供参考】

案例地址:https://gitee.com/ccuni/vue-easy-user-crud

一、相关知识


1.1 Vue

Vue 是国人大牛【尤雨溪】开发的一套用于构建用户界面的开源的渐进式框架,支持 MVVM架构,具有易用、灵活和高效的特点,是前端领域比较火热的框架,不过目前最流行的前端框架还是 React,React框架在国外使用量最多,这里简单提一下。 目前 Vue2 是大多数使用企业中的主流版本(据说),而 Vue3 带来了更高性能,增加了一些新特性,在这里我以Vue 2 为主,先掌握 Vue2 的使用,之后有时间再继续学习 Vue3。

1.2 Vue-Router

Vue-Router 是 Vue官方提供的路由插件。 使用 Vue 开发的 Web 项目支持 SPA 页面的渲染,即 Single Page Web Application,单页面的web应用。 单页面可以提升页面切换速度,每次切换都是局部加载页面,提升网站的响应速度,减少服务器压力,支持组件化构建。 而 Vue-Router 简单来说就是支持我们定义不同的 URL 请求地址,跳转到不同的路由组件,在本次案例中,我没有使用到路由守卫、元数据等内容,只是简单的配置了一下页面和路由组件的映射,适合初学者入门。

1.3 Vuex

Vuex 也是 Vue官方提供的插件,采用集中式存储管理应用的所有组件的状态,主要分为三层,分别是 action 响应层,mutations 数据处理层,store 存储层。 对于这三层,我们可以类比 MVC架构里的 Controller、Service和 DAO, 但是这里是有区别的,可以从 mutations 直接到 store,而不经过 action。 在本次案例中,我使用 Vuex 来保存处理用户信息的所有业务代码,这样其他的所有路由组件都可以调用,可有效的降低代码耦合度,而用户的信息也存储在了 Vuex 的 store 层,方便任意组件获取数据。 在这里插入图片描述

1.4 VueCLI

Vue CLI 又称脚手架,是搭建 Vue项目的工具,在我们做 Vue 项目的开发时,不可能每次都从零开始创建项目文件,这样效率是比较低的,而官方提供的基于 Node.js 的脚手架可以很好的解决这个问题,我本次的案例是基于脚手架开发的,其中有许多文件都是默认生成的,不用自己手动去配置,降低了开发难度。

1.5 Element-UI

Element 是国内【饿了么】开发团队为开发者、设计师和产品经历准备的基于 Vue 的开源的桌面端组件库,有支持 Vue2的版本,同时也有支持 Vue3 的对应版本,用了这个神奇的框架,我们可以快速搭建前端页面,实现想要的效果,除此之外,该框架提供了一系列基于 Vue 实现的功能,大大降低了开发难度。

二、页面展示


2.1 注册页面

因为没有连接后端,故目前没有写注册功能

在这里插入图片描述

2.2 登录页面

在这里插入图片描述

2.3 管理页面

在这里插入图片描述

2.4 查看用户详情

在这里插入图片描述

2.5 编辑指定的用户

在这里插入图片描述

2.6 批量删除用户

在这里插入图片描述

2.7 退出登录

在这里插入图片描述

2.8 条件查询+分页

在这里插入图片描述

2.9 添加用户

在这里插入图片描述

三、思路整理


3.1 项目结构

本案例使用 Vue-CLI 脚手架进行创建,其中有一些是默认创建的文件

案例项目的整体结构 在这里插入图片描述

父项目各个组件的分配 在这里插入图片描述

用户路由组件包括它的子组件 在这里插入图片描述

理清项目结构后,接下来就是关键功能实现的描述,稍微记录一下,将来可以做个优化。

3.2 自动登录

自动登录功能的实现是在 Vue各个生命周期钩子函数中的 mounted() ,即已挂载函数里执行。

在 Vue2 中,当页面渲染完毕则会执行这个函数,此时我们就可以在这个方法里执行自动登录。

自动登录的实现方式有很多,以前学到的就是读取浏览器中的cookie,然后用cookie里的用户信息向服务端发送登录的请求,这是比较传统的方式了,后来听说有了 token 凭证的方法,在 JavaWeb应用中称为 JWT,即 JSON Web Token,本质上就是一种字符串,规定好格式的字符串,它相比cookie安全很多,因为其中用到了加密算法,加密的密钥是由服务端设置的,在这里暂时不做深入,了解有这么一个技术即可。

在本次案例中我使用的是 localStorage 本地缓存,因为我们的浏览器中也是有数据库存在的,存储 Cookie、缓存这类信息,这里我就将用户登录的信息存储到本地缓存,然后在自动登录时读取这个缓存,因为没有后端,得到信息后就直接执行登录的方法,判断是否登录成功即可,整体来说逻辑还是比较简单的。

mounted(){
  // 读取本地缓存中的 userInfo,并转为 Object 对象
  let userInfo = JSON.parse(localStorage.getItem('userInfo'))
  // 如果对象存在则执行登录的逻辑
  if(userInfo) this.autoLogin(userInfo)
},

自动登录则先向 Vuex 中的 actions 层的 login 方法发送请求,同时传入需要登录的用户信息,由于 action层方法是不会返回指定的参数的,所以我采取使用 Vuex 中 state 层的一个变量来记录是否登录成功,然后在当前登录组件中,只需要用 计算属性 就能获取并同步与 state 层用户登录状态了

computed:{
  loginState(){
    return this.$store.state.user.loginState | false
  }
},

Vuex 中登录的方法实现如下:

// actions 响应层
actions: {
  login(context, user){
  // 模拟获取正确的用户信息
  let u = { username: 'admin', password: 'admin'}
  if(user.username === u.username && user.password === u.password){
    context.commit('login', user)
  }
  else
    context.commit('logout')
  }
},
// mutations 数据处理层
mutations: {
  login(state, user){
    state.userInfo = user
    state.loginState = true
  },  
},
// state 数据存储层
state: {
  loginState: false,
  // 当前登录用户的信息(每次都默认读缓存,如果缓存不存在则指定为测试的账号和密码)
  userInfo: 
    JSON.parse(localStorage.getItem('userInfo'))
      || {
            username: 'admin',
            password: 'admin',
            isLogin: false
         },  
}

登录组件自动登录的方法实现如下:

autoLogin(userInfo){
  this.$store.dispatch('user/login', userInfo)
  if(this.loginState){
    this.$notify({
      title: '温馨提示',
      type: 'success',
      message: '欢迎访问~',
      showClose: false,
      duration: 1500
    });
    this.$router.push('/admin/user')
  }else {
    message.error('自动登录失败')
  }
},

这里用到了 Element-UI 提供的提示窗,只需要调用 this.$notify() 这个方法,就会出现相应的页面效果了。

3.3 分页显示

关于分页显示,前端页面直接使用 Element-UI 提供的组件就行,在这里比较复杂就是当切换页面时,数据的变换以及浏览器 URL的变化,这就设计了 vue-router 路由的相关知识,不过其实也只是用到了路由传参。 关于路由传参,当我们点击下一页时,则采用动态的编程路由,指定跳转到下一页的 URL,当然这不会导致页面刷新,因为是 SPA 单页面开发,但为了给用户带来较好的视觉体验,所以需要实现路由组件的刷新,点击下一页过后,有一个刷新效果,而且在刷新过程中也可以发送 axios 请求获取真实的数据(为之后的开发做准备)。 在这里插入图片描述

切换页面或切换页面尺寸执行的方法:

// 切换页面尺寸(尺寸修改后, 页面固定为第一页)
handleSizeChange(value){
  this.$router.push({
    path: '/admin/user',
    query: {
      size: value,
      p: 1
    }
  })
  this.reloadRouterView()
},
  // 切换页面
  handleCurrentChange(value){
    this.$router.push({
      path: '/admin/user',
      query: {
        size: this.pageInfo.size,
        p: value,
      }
    })
    this.reloadRouterView()
  }

这里直接采取动态路由的方式修改当前的路由组件,我们先来看看关于刷新路由组件的实现逻辑: 引入组件的HTML部分:

<router-view v-if="routerViewVisible" :reloadRouterView="reloadRouterView"></router-view>

实现刷新的 JS部分

// 刷新视图
reloadRouterView(){
  this.routerViewVisible = false
  this.$nextTick(function() {
    this.routerViewVisible = true
  })
}

这个方法并不在用户列表的组件里,而是在引入了用户列表组件的父组件,在调用时通过标签属性直接传参即可,如:

<UserList :reloadRouterView="reloadRouterView"/>

然后在 UserList 子组件里通过 props 属性接收参数,如:

props: ['reloadRouterView']

这样一来,用户列表组件就可以直接自身,来实现加载效果了。

路由的关键配置如下:

{
  path: '/admin',
  component: () => import('@/pages/admin/admin'),
    children:[
      {
        path: 'user',
        component: () => import('@/pages/admin/user'),
      },
    ]
}

如此一来,我们的用户列表组件便收到了当前的分页参数,那么如何显示对应的数据呢?答案是可通过计算属性,由于没有后端,所以关于用户的信息都存储在 Vuex 的 store 层,这里使用简单的几行语句就可以实现了。

computed:{
  pageInfo(){
    return {
      p: parseInt(this.$route.query.p) || 1,
      size: parseInt(this.$route.query.size) || 5
    }
  },
    userList(){
      console.log(this.pageInfo)
      let L = (this.pageInfo.p - 1) * this.pageInfo.size
      let R = L + this.pageInfo.size
      return this.$store.state.user.userList.slice(L, R)
    },
},
木兰宽松许可证, 第2版 木兰宽松许可证, 第2版 2020年1月 http://license.coscl.org.cn/MulanPSL2 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 6. 语言 “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 条款结束 如何将木兰宽松许可证,第2版,应用到您的软件 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. Mulan Permissive Software License,Version 2 Mulan Permissive Software License,Version 2 (Mulan PSL v2) January 2020 http://license.coscl.org.cn/MulanPSL2 Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: 0. Definition Software means the program and related documents which are licensed under this License and comprise all Contribution(s). Contribution means the copyrightable work licensed by a particular Contributor under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 6. Language THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. END OF THE TERMS AND CONDITIONS How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details.

简介

作为初学者基于 Vue2 实现的用户增删改查案例,相关技术 Router、Vuex、animate.style、ElementUI,不包含后端。 展开 收起
Vue 等 3 种语言
MulanPSL-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/ccuni/vue-easy-user-crud.git
git@gitee.com:ccuni/vue-easy-user-crud.git
ccuni
vue-easy-user-crud
基于Vue2 + ElementUI 的用户增删改查案例
master

搜索帮助