Vhr项目分析(三) 菜单初始化 和员工资料查看

Vhr项目分析(三) 菜单初始化 和员工资料查看菜单和员工资料检查权限初始化菜单 connect 函数检查权限全局守卫 每次跳转页面 全局守卫逻辑开启 检验权限 to meta requireAuth 如若够权限 初始化菜单 如果去 chat 页面 执行 store 的 uodateMsgLis 函数 初始化菜单 get 请求 config sysmenu 若返回 status 为 200 表示成功 将响应消息格式化 加入 router rou

vhr项目地址: https://github.com/lenve/vhr
项目作者: https://blog.csdn.net/u0

检查权限

全局守卫:
每次跳转页面,全局守卫逻辑开启。检验权限(to.meta.requireAuth),如若够权限,初始化菜单。如果去chat页面,执行store的updateMsgList函数。

router.beforeEach((to, from, next)=> { 
      if (to.name == 'Login') { 
      next(); return; } var name = store.state.user.name; if (name == '未登录') { 
      if (to.meta.requireAuth || to.name == null) { 
      next({ 
     path: '/', query: { 
     redirect: to.path}}) } else { 
      next(); } } else { 
      initMenu(router, store); if(to.path=='/chat') store.commit("updateMsgList", []); next(); } } ) 

初始化菜单

  • get请求“ /config/sysmenu ”,若返回status为200,表示成功,将响应消息格式化,加入router ( router.addRoutes(…) )和store的routes中。最后调用store的connect。

格式化数据

  • let { … }=router 是解析赋值。
  • require([ … ],resolve) 表示导入组件。
export const formatRoutes = (routes)=> { 
      let fmRoutes = []; routes.forEach(router=> { 
      let { 
      path, component, name, meta, iconCls, children } = router; if (children && children instanceof Array) { 
      //此时递归格式化子菜单内容 children = formatRoutes(children); } let fmRouter = { 
      path: path, component(resolve){ 
      if (component.startsWith("Home")) { 
      //用本来字符串形式的component名字,导入真正的组件 require(['../components/' + component + '.vue'], resolve) } else if (component.startsWith("Emp")) { 
      require(['../components/emp/' + component + '.vue'], resolve) } else if (component.startsWith("Per")) { 
      require(['../components/personnel/' + component + '.vue'], resolve) } else if (component.startsWith("Sal")) { 
      require(['../components/salary/' + component + '.vue'], resolve) } else if (component.startsWith("Sta")) { 
      require(['../components/statistics/' + component + '.vue'], resolve) } else if (component.startsWith("Sys")) { 
      require(['../components/system/' + component + '.vue'], resolve) } }, name: name, iconCls: iconCls, meta: meta, children: children }; fmRoutes.push(fmRouter); }) return fmRoutes; } 
  • 设置路由及其包含的子路由
  • 用组件名字引入组件

员工资料显示

EmpBasic.vue中,有员工的基本资料。

总体架构

<template> <div> <el-container> <el-header> 上方栏目  
       el-header> <el-main> 主体区域  
        el-main>  
         el-container> <el-form> 
          el-form>  
           div>  
            template> 

上方栏目布局

el-header标签内的布局。

<el-header> <div> <el-input> 
       el-input> <el-button>搜索 
        el-button> <el-button><i> 
         i>高级搜索 
          el-button>  
           div> <div> <el-upload> <el-button><i> 
            i>{ 
          {fileUploadBtnText}} 
             el-button>  
              el-upload> <el-button><i> 
               i>导出数据 
                el-button> <el-button>添加员工 
                 el-button>  
                  div>  
                   el-header> 

我的测试代码:

 <el-header style="display: flex;align-content: center"> <div style="display: inline"> <el-input placeholder="搜索在这里o" clearable style="width: 300px" size="mini" prefix-icon="el-icon-search" v-model="inputInfo" > 
       el-input> <el-button type="primary" size="mini">搜索 
        el-button> <el-button type="primary" size="mini">高级搜索 
         el-button>  
          div> <div> <el-upload> <el-button type="primary" size="mini">导入数据 
           el-button>  
            el-upload> <el-button type="primary" size="mini">导出数据 
             el-button> <el-button type="primary" size="mini">添加员工 
              el-button>  
               div>  
                el-header> 

效果如下:
在这里插入图片描述

  • el-input标签:
属性 作用
clearable 是否可清空
disabled 禁用
change 仅在输入框失去焦点、用户按下回车时触发
keyup.enter.native 使用回车触发函数
prefix-icon 输入框头部图标
v-model
  • el-upload标签
属性 作用
show-file-list 是否显示已经上传的文件列表
accept 接受的上传文件类型
action 上传的地址
on-success 上传成功时候调用
on-error 上传出错
before-upload 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
  • 上传文件accept=“application/vnd.ms-excel”,表示只接受excel文件。
  • 上传文件标签action=”/employee/basic/importEmp”,对应后端
@RequestMapping(value = "/importEmp", method = RequestMethod.POST) public RespBean importEmp(MultipartFile file) { 
      List<Employee> emps = PoiUtils.importEmp2List(file, empService.getAllNations(), empService.getAllPolitics(), departmentService.getAllDeps(), positionService.getAllPos(), jobLevelService.getAllJobLevels()); if (empService.addEmps(emps) == emps.size()) { 
      return RespBean.ok("导入成功!"); } return RespBean.error("导入失败!"); } 

  • 响应输入框的函数: change装配函数keywordsChange(val) ,如果val为空,那么调用loadEmps(),使用get请求” /employee/basic/emp?page= “+this.currentPage + “&size=10 ” + “&keywords=” + …
    查询所有员工信息。如果响应status为200,放入页面的变量里面。 如果在搜索框没有输入信息,那么就显示所有成员资料。

  • “搜索”按钮: 类似前者。
  • “导入数据”按钮: 由upload标签处理逻辑。成功则运行fileUploadSuccess;失败运行fileUploadError;上传前运行beforeFileUpload。
函数 作用
beforeFileUpload
fileUploadSuccess 像是消息,从服务器查所有员工
fileUploadError 显示消息
  • 导出数据按钮: exportEmps()执行,windows.open(…)。
  • 添加员工按钮: showAddEmpView()执行,请求maxWorkID,并设置workID。





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228544.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:46
下一篇 2026年3月16日 下午6:47


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号