vue2人力资源项目10静态路由和动态路由拆分

静态路由:固定的路由

动态路由:需要根据权限访问的路由

1.拆分了静态路由和动态路由,分别放在不同的数组里

const asyncRoute = [
  departmentRouter,
  roleRouter,
  employeeRouter,
  permissionRouter,
  attendanceRouter,
  approvalRouter,
  salaryRouter,
  socialRouter
]
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },

  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: '首页', icon: 'dashboard' }
    }]
  },

  // 404 page must be placed at the end !!!
  { path: '*', redirect: '/404', hidden: true }
]

2.根据用户权限添加动态路由

user.js里返回数据

  async getUserInfo(context) {
    // 获取接口信息
    const result = await getUserInfo()
    context.commit('setUserInfo', result)
    return result// 返回数据
  },

给每一个路由模块都加一个name

eg:

筛选动态路由,再添加

 if (!store.getters.userId) {
        const { roles } = await store.dispatch('user/getUserInfo')
        //  console.log(roles.menus)//数组 不确定 可能是8个
        //  console.log(asyncRoutes)
        // 对打印出的结果进行筛选
        const filterRouters = asyncRoutes.filter(item => {
          // 筛选之后的路由
          return roles.menus.includes(item.name)
        })
        router.addRoutes(filterRouters)// 添加动态路由信息到路由表
        // router添加动态路由之后,需要转发一下
        next(to.path)
      } else {
        next() // 放过
      }
    }

一定要再最后添加404

 router.addRoutes(...filterRouters, { path: '*', redirect: '404', hidden: true })// 添加动态路由信息到路由表

根据权限渲染左侧菜单

退出登录(重置路由)

自定义指令

注:使用需要线上代码与线下的配合

1.在main.js里自定义注册指令

// 注册自定义指令,控制功能权限
// 两个参数:1.指令名称(不用写v-,它会自动补足)2.空对象
Vue.directive('permission', {
  inserted(el, binding) {
    // el是当前指令作用dom元素的对象
    // binding 是v-permission=“表达式” 表达式的信息
    const points = store.state.user.userInfo?.roles?.points || []
    // 拿到了points
    // points中是否有add-employee
    // binding.value :v-permission=“表达式” 中的表达式的值
    if (!points.includes(binding.value)) {
      // 删除或禁用
      el.remove()
      // el.disabled = true //禁用
    }
  }
})

2,绑定给按钮

 首页

1.粘贴页面结构

2.安装插件并引入,在注册组件

import CountTo from 'vue-count-to'
export default {
  components: {
    CountTo
  }
}

3.利用插件让数字从0滚到目标值

<div class="todo-item">
              <span>组织总人数</span>
              <!-- 起始值 终点值  滚动时间 -->

              <count-to
                :start-val="0"
                :end-val="228"
                :duration="1000"
              />
           
            </div>

展示首页数据

1.向外导出这四个属性


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, // 用户名称
  company: state => state.user.userInfo.company, // 公司名称
  department: state => state.user.userInfo.department// 部门名称
}
export default getters

2.引用

  computed: {
    // 把那四个属性导入到了computed中
    ...mapGetters(['name', 'avatar', 'company', 'departmentName'])
  }

3.使用,有头像显示头像,没有就显示第一个字,name后使用可选连,防止报错

 <div class="depart">{{ name }} | {{ company }}-{{ departmentName }}</div>
<img v-if="avatar" class="avatar" :src="avatar" alt="">
            <span v-else class="username">{{ name?.charAt(0) }}</span>

获取企业信息

注意:如果有三层获取,需要使用可选链,防止报错

展示表格

注意引入时要根据文档按需引入

import CountTo from 'vue-count-to'
import { mapGetters } from 'vuex'
import { getHomeData, getMessageList } from '@/api/home'
// import * as echarts from 'echarts' // 引入所有的echarts
import * as echarts from 'echarts/core' // 引入核心包
import { LineChart } from 'echarts/charts' // 引入折线图
import { GridComponent } from 'echarts/components' // 引入组件
import { CanvasRenderer } from 'echarts/renderers'
echarts.use([
  LineChart,
  GridComponent,
  CanvasRenderer
])
export default {
  components: {
    CountTo
  },
  data() {
    return {
      homeData: {},
      list: []
    }
  },
  // 计算属性
  computed: {
    // 将getters中的四个属性映射到计算属性中- 指向
    ...mapGetters(['avatar', 'name', 'company', 'departmentName'])
  },
  watch: {
    homeData() {
      console.log(this.homeData)
      // 设置图表
      this.social.setOption({
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: this.homeData.socialInsurance?.xAxis
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            data: this.homeData.socialInsurance?.yAxis,
            type: 'line',
            areaStyle: {
              color: '#04c9be' // 填充颜色
            },
            lineStyle: {
              color: '#04c9be' // 线的颜色
            }
          }
        ]
      })
      this.provident.setOption({
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: this.homeData.providentFund?.xAxis
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            data: this.homeData.providentFund?.yAxis,
            type: 'line',
            areaStyle: {
              color: '#04c9be' // 填充颜色
            },
            lineStyle: {
              color: '#04c9be' // 线的颜色
            }
          }
        ]
      })
    }
  },

  created() {
    this.getHomeData()
    this.getMessageList()
  },
  mounted() {
    // 获取展示的数据 设置给图表
    // 监听homeData的变化
    this.social = echarts.init(this.$refs.social) // 初始化echart
    // data中没有声明 不是响应式
    this.provident = echarts.init(this.$refs.provident)
  },
  methods: {
    async getHomeData() {
      this.homeData = await getHomeData()
    },
    async getMessageList() {
      this.list = await getMessageList()
    }
  }
}

更改为history 模式

之后是关于打包的内容

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值