vue2人力资源项目3主页

2024-05-03 23:36

本文主要是介绍vue2人力资源项目3主页,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主页权限验证

前置守卫开启进度条,后置守卫关闭进度条

import router from '@/router'
import nProgress from 'nprogress'// 导入进度条(模板自带)
import 'nprogress/nprogress.css'// 导入进度条样式(模板自带)
// 前置守卫
// 到哪里,去哪里,做什么
router.beforeEach((to, from, next) => {// 开启进度条nProgress.start()
})// 后置守卫
router.afterEach(() => {// 关闭进度条nProgress.done()
})

如果有token,如果跳转登录页面情况

// 前置守卫
// 到哪里,去哪里,做什么
router.beforeEach((to, from, next) => {// 开启进度条nProgress.start()if (// 存在tokenstore.getters.token) {if (to.path === '/login') {// 跳转首页next('/')} else {next()// 到其他页面,放行}} else {// 没有tokennext()}
})

没有token

声明白名单

// 声明白名单
const whiteList = ['/login', '404']
// 到哪里,去哪里,做什么
router.beforeEach((to, from, next) => {// 开启进度条nProgress.start()if (// 存在tokenstore.getters.token) {if (to.path === '/login') {// 跳转到主页next('/') // 中转到主页// next(地址)并没有执行后置守卫nProgress.done()} else {next()// 到其他页面,放行}} else {// 没有tokenif (whiteList.includes(to.path)) {next()} else {next('/login') // 中转到登录页nProgress.done()}}
})

总结

登录后获取用户资料

index.vue里有token的前提下调用action异步方法

  created() {// 调用actionthis.$store.dispatch('user/getUserInfo')}
}

store/user.js里存放action

1.先导入接口,并声明一个对象来存储用户基本资料状态

import { login,getUserInfo } from '@/api/user'
// 用来存放数据
const state = {token: getToken(),// 调用加括号,从缓存中读取初始值userInfo:{}//声明一个对象来存储用户基本资料状态
}

2.利用mutations修改userInfo的值

// 用来修改数据,要修改state里的数据,必须通过mutations
const mutations = {setToken(state, token) {state.token = token// 同步到缓存setToken(token)},removeToken() {// 删除vuex的tokenstate.token = nullremoveToken()},setUserInfo(state,userInfo){state.userInfo = userInfo}
}

3.actions调用接口,获取数据并通过context提交给mutation

const actions = {// context上下文,传入参数async login(context, data) {console.log(data)// 点击调用登录接口,成功执行await后的内容const token = await login(data)// 提交mutations里的数据,调用context里的默认方法context.commit('setToken', token)},// actionasync getUserInfo(context) {// 获取接口信息const result = await getUserInfo()context.commit('setUserInfo', result)}
}

api/user.js里封装接口

export function getUserInfo() {return request({url: '/sys/profile'})
}

调整action位置

getter.js里封装userId

const getters = {sidebar: state => state.app.sidebar,device: state => state.app.device,token: state => state.user.token,userId: state => state.user.userInfo.userId,avatar: state => state.user.avatar,name: state => state.user.name
}
export default getters

permission.js

   if (!store.getters.userId) { await store.dispatch('user/getUserInfo') }next()// 到其他页面,放行}} else {// 没有tokenif (whiteList.includes(to.path)) {next()} else {next('/login') // 中转到登录页nProgress.done()}}

显示用户头像、名称

根据传过来的数据显示头像和名称

1.通过getters向外暴露用户头像和信息

const getters = {sidebar: state => state.app.sidebar,device: state => state.app.device,token: state => state.user.token,userId: state => state.user.userInfo.userId,avatar: state => state.user.userInfo.avatar, // 用户头像name: state => state.user.userInfo.name// 用户名称
}
export default getters

2.找组件

先引入

import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'export default {computed: {...mapGetters(['sidebar','avatar','name'])}

使用

    <!--头像--><img :src="avatar" class="user-avatar"><!--用户名称--><span>{{ name }}</span>

调整样式

 .avatar-wrapper {margin-top: 5px;position: relative;display: flex;align-items: center;.name{
margin-right: 10px;
font-size: 16px;}.el-icon-setting{
font-size: 20px;}

处理用户头像为空

1.v-if 和v-else

2.设置样式

 .username{width: 30px;height: 30px;line-height: 30px;align-items: center;background-color: aqua;color: #fff;border-radius: 50%;margin-right: 4px;}

3.当用户姓名为空时,使用可选链(需要升级版本)

处理token失效

store/user.js声明一个提出登录的actions

logout(context) {context.commit('removeToken')// 调用setUserInfo,传进去空对象,以清除用户信息context.commit('setUserInfo', {})}

request.js跳转

if (error.response.status === '401') {Message({ type: 'warning', message: 'token超时' })store.dispatch('user/logout')// 调用action退出登录// 主动跳转到登录页router.push('/login')return Promise.reject(error)}Message({ type: 'error', message: error.message })return Promise.reject(error)

退出登录

async logout() {this.$store.dispatch('user/logout')this.$router.push('/login')}

显示修改密码弹层

 <!--放置dialog--><!--.sync,可以接收子组件传过来的事情和值--><el-dialog width="500px" title="修改密码" :visible.sync="showDialog"><el-form /></el-dialog>

表单结构

   <el-dialog width="500px" title="修改密码" :visible.sync="showDialog"><!--放置表单--><el-form label-width="120px"><el-from-item label="旧密码"><el-input show-password size="small" /></el-from-item><el-from-item label="新密码"><el-input show-password size="small" /></el-from-item><el-from-item label="重置密码"><el-input show-password size="small" /></el-from-item><el-form-item><el-button type="primary" size="mini">确认</el-button><el-button size="mini">取消</el-button></el-form-item></el-form></el-dialog>

表单校验(prop与rules有关,v-model与数据绑定有关)

   <el-dialog width="500px" title="修改密码" :visible.sync="showDialog"><!--放置表单--><el-form ref="passForm" label-width="120px" :rules="rules" :model="passForm"><el-from-item label="旧密码" prop="oldPassword"><el-input v-model="passForm.oldPassword" show-password size="small" /></el-from-item><el-from-item label="新密码" prop="newPassword"><el-input v-model="passForm.newPassword" show-password size="small" /></el-from-item><el-from-item label="重置密码" prop="confirmPassword"><el-input v-model="passForm.confirmPassword" show-password size="small" /></el-from-item><el-form-item><el-button type="primary" size="mini">确认</el-button><el-button size="mini">取消</el-button></el-form-item></el-form></el-dialog>

变量准备(rules在data里)

data() {return {showDialog: false,passForm: {oldPassword: '',newPassword: '',confirmPassword: ''},rules: {oldPassword: [],newPassword: [],confirmPassword: []}}},

校验规则

判断两次密码是否相同:用了自定义校验,注:必须使用箭头函数,否则this不能指向组件实例

rules: {oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }], // 旧密码newPassword: [{ required: true, message: '新密码不能为空', trigger: 'blur' }, {trigger: 'blur',min: 6,max: 16,message: '新密码的长度为6-16位之间'}], // 新密码confirmPassword: [{ required: true, message: '重复密码不能为空', trigger: 'blur' }, {trigger: 'blur',validator: (rule, value, callback) => {// valueif (this.passForm.newPassword === value) {callback()} else {callback(new Error('重复密码和新密码输入不一致'))}}}] // 确认密码字段}}},

总结

确认按钮

先绑定事件,之后调用接口(传参时就多不就少,注意async)

 btnOk() {this.$refs.passForm.validator(async(isOk) => {if (isOk) {// 调用接口// 传收集来的值await updatePassword(this.passForm)// 成功后执行重置表单,不成功不用管this.$refs.passForm.resetFields()// 关闭弹层this.showDialog = false}})}

优化:

this.$refs.passForm.resetFields()

      // 关闭弹层

      this.showDialog = false

这两句代码与关闭按钮的一致,所以直接调用关闭按钮

btnOk() {this.$refs.passForm.validator(async(isOk) => {if (isOk) {// 调用接口// 传收集来的值await updatePassword(this.passForm)// 成功后执行重置表单,不成功不用管this.$refs.passForm.resetFields()// 关闭弹层// this.showDialog = false// this.$message.success('修改成功')this.btnCancel()}})}

总结

这篇关于vue2人力资源项目3主页的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957900

相关文章

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于