ruoyi-vue-pro优化——让菜单支持多个参数,一键直达【经营分析】、【生产报表】、【销售报表】

1、需求痛点

随着数据大屏给管理层带来直观而有丰富的数据信息,大屏报表需求不断增加,公司高层及各部门经理都希望能将经营数据实现数据大屏监控,ruoyi-vue-pro给我们提供基于go-view的数据大屏解决方案,前期序列博文也对其进行了基础和优化,已经可以通过【数据报表->大屏设计器】菜单进入到数据大屏的设计及浏览,然而还差最后一公里------如何通过点击菜单一键直达【生产报表】、【销售报表】、【经营分析】?

2、原因分析

ruoyi-vue-pro 给我们提供了菜单管理功能,但无法配置路由参数,导致无法实现如下效果。

作为数据大屏展示我们可以配置外链菜单路径通过弹窗的方式访问具体的报表,但最为一个整体解决方案,产品组更希望提供这种内联的方式的展示:

3、解决方案

在菜单中增加路由参数字段query,提供一个json字符串配置,在路由初始化时传递给菜单路由。

4、实现步骤

1)数据库菜单表增加query字段

java 复制代码
ALTER TABLE `ruoyi-vue-pro`.`system_menu` 
ADD COLUMN `query` varchar(255) NULL AFTER `path`;

2)后端修改菜单管理

cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java

cn/iocoder/yudao/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java

中增加query字段

java 复制代码
package cn.iocoder.yudao.module.system.dal.dataobject.permission;

@EqualsAndHashCode(callSuper = true)
public class MenuDO extends BaseDO {

    /**
     * 路由地址
     *
     * 如果 path 为 http(s) 时,则它是外链
     */
    private String path;
    /**
     * 路由参数
     */
    private String query;
    /**
     * 菜单图标
     */
    private String icon;
}



package cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu;


@Data
public class MenuBaseVO {

    @Schema(description = "路由参数对象json字符串", example = "{\"id\":8}")
    @Size(max = 255, message = "路由参数对象json字符串不能超过255个字符")
    private String query;
}

3)前端菜单管理增加query字段

这里比较简单,就不列出代码了

4)后端路由菜单加载VO

cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java中的内部静态类MenuVO

java 复制代码
public static class MenuVO {

        @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post")
        private String path;

        @Schema(description = "路由参数对象json字符串", example = "{\"id\":8}")
        private String query;
}

5)前端路由参数反序列化处理

在src\store\modules\permission.js文件中找到如下函数:

function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {

}

具体修改代码如下,注意route.query处理相关的几行代码:

java 复制代码
// 处理 component 属性
    if (route.children) { // 父节点
      if (route.parentId === 0) {
        route.path = startWithSplash(route.path);
        route.component = Layout
      } else {
        route.path = removeStartSplash(route.path);
        route.component = ParentView
      }
    } else { // 根节点
      route.path = removeStartSplash(route.path);
      route.component = loadView(route.component);
    }
    if(route.query){
      try {
        route.query = JSON.parse(route.query);
      } catch (error) {
        console.error(error);
      }
    }

    // filterChildren
    if (type && route.children) {
      route.children = filterChildren(route.children)
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route, type)
      route.alwaysShow = route.alwaysShow !== undefined ? route.alwaysShow  : true
    } else {
      delete route['children']
      delete route['alwaysShow'] // 如果没有子菜单,就不需要考虑 alwaysShow 字段
    }
    // 如果子菜单都隐藏则隐藏

6)前端增加数据大屏通用组件

新建src\views\report\goview\bigscreen.vue页面,内容如下:

java 复制代码
<template>
  <div class="">
    <doc-alert v-if="0" title="大屏设计器" url="https://doc.iocoder.cn/report/screen/" />
    <i-frame v-if="url" :src="url" />
  </div>
</template>
<script>
import iFrame from "@/components/iFrame/index";
import { setTenantId, getTenantId} from "@/utils/auth";
export default {
  name: "BigScreen",
  components: { iFrame },
  props: {
    /* 数据大屏的id */
    value: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      url: undefined,
    };
  },
  mounted(){
    var reportId = this.$route.params.id || this.$route.query.id || this.value
    if(reportId){
      this.url = "http://localhost:3000/chart/preview/"+reportId+"?sso=true"
    } else {
      this.url = "http://localhost:3000/?sso=true";
    }
  }
};
</script>

7)菜单路由配置

上述三个报表的对应的路径如下:

经营分析:http://localhost:3000/chart/preview/6

生产报表:http://localhost:3000/chart/preview/7

销售报表:http://localhost:3000/chart/preview/8

内联菜单及弹窗菜单关键配置如下:

============= 相关博文 ============

ruoyi-vue-pro数据大屏------路由支持history,告别难看的hash路由

ruoyi-vue-pro数据大屏------单点登录,告别手输密码(适用于不带后端服务的情况)

ruoyi-vue-pro优化------如何将一个模块快速变成一个独立的应用进行开发,部署,管理

ruoyi-vue-pro增强------新增通用单点登录模块yudao-module-sso(下载链接在博文末尾)

ruoyi-vue-pro数据大屏优化------在yudao-module-report-app使用yudao-moudle-sso优化单点登录

ruoyi-vue-pro优化------让菜单支持多个参数,一键直达【经营分析】、【生产报表】、【销售报表】

ruoyi-vue-pro优化------模块单独打包,增量更新、部署,告别打包等待,上传等待,节省网络流量

============= 相关博文 ============

相关推荐
从文处安14 小时前
「九九八十一难」组合式函数到底有什么用?
前端·vue.js
用户114896694410515 小时前
VUE3响应式原理——从零解析
vue.js
用户830407130570115 小时前
SPA 首屏加载速度慢怎么解决?
vue.js·webpack
一枚前端小姐姐15 小时前
低代码平台表单设计系统技术分析(实战三)
前端·vue.js·低代码
SuperEugene15 小时前
从 Vue2 到 Vue3:语法差异与迁移时最容易懵的点
前端·vue.js·面试
Leon16 小时前
新手引导 intro.js 的使用
前端·javascript·vue.js
Forever7_16 小时前
仅用一个技巧,让 JavaScript 性能提速 500%!
前端·vue.js
青屿ovo18 小时前
Vue前端页面版本检测解决方案
前端·vue.js
apollo_qwe21 小时前
深入解析Vue的mixins与hooks:复用逻辑的两种核心方式
vue.js
_AaronWong21 小时前
Vue3+Element Plus 通用表格组件封装与使用实践
前端·javascript·vue.js