wangting
2024-12-19 acecd2af0d71d980c741936637f29f008adaf88f
首页配置,业务模块展示不同首页
已修改9个文件
已添加3个文件
699 ■■■■■ 文件已修改
Source/plt-web/plt-web-ui/src/page/index/logo.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/page/index/tags.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/router/page/index.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/router/views/index.js 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/adminIndex.vue 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/components/UndoTaskPortlet.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/components/taskPortlet.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/components/test.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/homeConfig.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/index.vue 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/wel/workIndex.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/page/index/logo.vue
@@ -9,9 +9,9 @@
    </transition>
    <transition-group name="fade">
      <template v-if="!keyCollapse">
<span>
            <img class="imgSpan" :src=imgurl>
          </span>
        <span>
          <img class="imgSpan" :src=imgurl>
        </span>
        <span class="avue-logo_title"
              key="1">
          <span>
Source/plt-web/plt-web-ui/src/page/index/tags.vue
@@ -1,19 +1,12 @@
<template>
  <div v-if="showTag"
       class="avue-tags">
    <!-- tag盒子 -->
  <div v-if="showTag" class="avue-tags">
    <!-- å³é”® -->
    <div v-if="contextmenuFlag"
         :style="{left:contentmenuX+'px',top:contentmenuY+'px'}"
         class="avue-tags__contentmenu">
      <div class="item"
           @click="clearCacheTags">{{ $t('tagsView.clearCache') }}
      </div>
      <div class="item"
           @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}
      </div>
      <div class="item"
           @click="closeAllTags">{{ $t('tagsView.closeAll') }}
      </div>
      <div class="item"  @click="clearCacheTags">{{ $t('tagsView.clearCache') }}</div>
      <div class="item"  @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}</div>
      <div class="item"  @click="closeAllTags">{{ $t('tagsView.closeAll') }}</div>
    </div>
    <div :class="{'avue-tags__box--close':!website.isFirstPage}"
         class="avue-tags__box">
Source/plt-web/plt-web-ui/src/router/page/index.js
@@ -78,30 +78,6 @@
    redirect: '/404'
  },
  {
    path: '/dynamic-form',
    name: '动态表格页面',
    component: Layout,
    children: [
      {
        path: '', // ç©ºè·¯å¾„表示访问 '/dynamic-form' æ—¶åŠ è½½ Layout ç»„ä»¶
        component: () => import('@/components/dynamic-components/dynamic-form'),
        props: true
      }
    ]
  },
  {
    path: '/UIContentViewer',
    name: 'UI上下文展示',
    component: Layout,
    children: [
      {
        path: '', // ç©ºè·¯å¾„表示访问 '/UIContentViewer' æ—¶åŠ è½½ Layout ç»„ä»¶
        component: () => import('@/views/base/UIContentViewer'),
        props: true
      }
    ]
  },
  {
    path: '/referIndex',
    name: '参照示例',
    component: Layout,
@@ -112,22 +88,5 @@
        props: true
      }
    ]
  },
  {
    path: '/UIDefineShow/:uiDefineOid',
    name: 'UI定义详情',
    component: Layout,
    children: [
      {
        path: '', // ç©ºè·¯å¾„表示访问 '/referIndex' æ—¶åŠ è½½ Layout ç»„ä»¶
        component: () => import('@/views/modelingMenu/ui/uiDefine/rightRegion/plShow'),
        props: true
      }
    ],
    meta:{
      keepAlive: true,
      isTab: true,
      isAuth: true
    }
  }
]
Source/plt-web/plt-web-ui/src/router/views/index.js
@@ -12,6 +12,14 @@
    },
    component: () =>
      import( /* webpackChunkName: "views" */ '@/views/wel/index')
  },{
    path: 'workIndex',
    name: '工作台',
    meta: {
      i18n: 'work'
    },
    component: () =>
      import( /* webpackChunkName: "views" */ '@/views/wel/workIndex')
  }, {
    path: 'dashboard',
    name: '控制台',
@@ -104,16 +112,56 @@
      import( /* webpackChunkName: "views" */ '@/views/work/process/leave/detail')
  }]
},{
  path: '/base',
  component: Layout,
  redirect: '/viewTab',
  children: [{
    path: 'viewTab',
    name: '查看详情',
    meta: {
      i18n: 'viewTab'
    },
    component: () =>
      import('@/views/base/ViewTab')
  }]
} ]
    path: '/UIContentViewer',
    name: 'UI上下文展示',
    component: Layout,
    children: [
      {
        path: '', // ç©ºè·¯å¾„表示访问 '/UIContentViewer' æ—¶åŠ è½½ Layout ç»„ä»¶
        component: () => import('@/views/base/UIContentViewer'),
        props: true
      }
    ]
  },
  {
    path: '/dynamic-form',
    name: '动态表单页面',
    component: Layout,
    children: [
      {
        path: '', // ç©ºè·¯å¾„表示访问 '/dynamic-form' æ—¶åŠ è½½ Layout ç»„ä»¶
        component: () => import('@/components/dynamic-components/dynamic-form'),
        props: true
      }
    ]
  },
  {
    path: '/UIDefineShow/:uiDefineOid',
    name: 'UI定义详情',
    component: Layout,
    children: [
      {
        path: '', // ç©ºè·¯å¾„表示访问 '/referIndex' æ—¶åŠ è½½ Layout ç»„ä»¶
        component: () => import('@/views/modelingMenu/ui/uiDefine/rightRegion/plShow'),
        props: true
      }
    ],
    meta:{
      keepAlive: true,
      isTab: true,
      isAuth: true
    }
  }, {
    path: '/base',
    component: Layout,
    redirect: '/viewTab',
    children: [{
      path: 'viewTab',
      name: '查看详情',
      meta: {
        i18n: 'viewTab'
      },
      component: () =>
        import('@/views/base/ViewTab')
    }]
  } ]
Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue
@@ -98,7 +98,6 @@
      checkedTypes:[],
      searchText:'',
      activeName:'',
      iconValue:'iconoir2:adobe-illustrator',
      allIconList:[],
      iconList:[],
      visible: false,
Source/plt-web/plt-web-ui/src/views/wel/adminIndex.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,233 @@
<template>
  <div>
    <el-row>
      <el-col :span="24">
        <basic-container v-loading="loading">
          <avue-data-tabs :option="topOption"></avue-data-tabs>
        </basic-container>
      </el-col>
    </el-row>
    <el-row>
      <el-col :span="16" style="height: 560px">
        <basic-container>
          <el-collapse v-model="activeNames">
            <el-collapse-item name="1" title="欢迎使用PLT-WEB平台">
              <div>
                1、北京宏博远达科技有限公司(以下简称“宏博远达”)长期专注于制造业信息化建设,为客户提供企业信息化整体解决方案及相关软件研发、咨询及实施服务。宏博远达客户群体涵盖航空、航天、船舶、兵器、汽车、通用机械、电子等制造行业,通过与客户深度合作,承担了多项国家级软件研发与技术服务项目,拥有多项具有自主知识产权的软件产品。
              </div>
              <div>
                2、为了给客户提供更多的技术创新能力及相应的企业级管理支撑平台,宏博远达研发了具有自主知识产权的企业级信息化整体解决方案,同时针对客户的特定需求,提供了高度可定制的专业应用。为了进一步提升技术服务能力,宏博远达投入专门力量在前沿技术方面进行探索,在企业私有云计算和大数据等领域不断取得突破。随着新一代业务与管理技术平台的推出,更增强了公司为客户提供高质量、全方位、深层次服务的技术能力。
              </div>
              <div>
                3、宏博远达一直秉承“用智慧为客户创造价值”的宗旨,愿以“诚信负责”的态度和专业化的服务,在企业信息化发展的道路上,与客户一起成长,共同见证成功!
              </div>
            </el-collapse-item>
            <el-collapse-item name="2" title="服务计划制定">
              <div>
                1、根据客户实际需求,宏博远达将与客户共同制定年度服务计划,商定具体的服务对象、服务内容、定期维护的服务时间、技术交流的主题、具体的维护人员安排等服务细节。
              </div>
              <div>
                2、客户可通过电话、电子邮件、函件等方式取得系统技术支持。对于系统以外的问题,我们会尽力协助客户找到解决途径。
              </div>
              <div>
                3、对于远程无法解决的故障(问题),宏博远达工程师将在合同规定的时间内到达客户现场进行故障诊断及处理,做好相应的记录。必要时需要重新收集系统信息,并归档。对于非系统的原因而引起的故障(问题),宏博远达将关心和协助客户解决故障(问题)。
              </div>
              <div>
                4、在其他情形下,宏博远达也可提供必要的现场服务。如为客户获得的合法操作系统进行升级服务、为客户安装必要的软件等的服务、配合客户做主机系统方面的测试、为客户的应用调整提供系统方面的支持等等。
              </div>
              <div>
                5、宏博远达还将为客户提供定期的系统性能评估与优化服务。通过对系统运行数据的深入分析,我们将识别潜在的性能瓶颈,提出针对性的优化建议,并协助客户实施优化措施。这包括但不限于硬件资源的合理配置、软件参数的调优、数据库性能的提升等,旨在确保系统能够持续稳定、高效地运行,满足客户的业务发展需求。同时,我们也将根据系统评估结果,为客户提供未来的系统升级和扩展规划建议,帮助客户提前布局,应对未来的业务增长和技术变革。
              </div>
            </el-collapse-item>
          </el-collapse>
        </basic-container>
      </el-col>
      <el-col :span="8" style="height: 560px">
        <el-row>
          <basic-container>
            <div class="el-font-size">
              <span>产品名称</span>
              <el-divider direction="vertical"/>
              <span><el-tag>PLT-WEB平台</el-tag></span>
              <el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
              <span>当前用户</span>
              <el-divider direction="vertical"/>
              <span><el-tag type="success">{{ userInfo.userName }}</el-tag></span>
              <el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
              <span>说明文档</span>
              <el-divider direction="vertical"/>
              <span>
                <el-link href="https://bladex.vip" target="_blank"
                         type="primary">https://bladex.vip
                </el-link>
              </span>
              <el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
            </div>
          </basic-container>
          <basic-container>
            <div style="height: 309px">
              <v-chart id="chart" :auto-resize="true" :options="chartOptions"></v-chart>
            </div>
          </basic-container>
        </el-row>
      </el-col>
    </el-row>
  </div>
</template>
<script>
import {mapGetters} from "vuex";
import {getLogListByContion} from "@/api/system/log/logBasic";
import 'echarts'
import 'echarts/lib/chart/pie' // å¯¼å…¥æŸ±çŠ¶å›¾ç»„ä»¶
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/legend'
import func from "@/util/func";
export default {
  name: "adminIndex",
  data() {
    return {
      loading: false,
      activeNames: ['1', '2', '3', '5'],
      logActiveNames: ['28'],
      topOption: {
        data: []
      },
      chartOptions: {
        title: {
          text: '',
        },
        tooltip: {
          trigger: 'item'
        },
        legend: {
          top: '5%',
          left: 'center'
        },
        series: [
          {
            name: '日志统计',
            type: 'pie',
            radius: ['45%', '70%'],
            avoidLabelOverlap: false,
            padAngle: 5,
            itemStyle: {
              borderRadius: 10,
              normal: {
                color: function (colors) {
                  const colorList = ['rgb(230, 71, 88)', 'rgb(178, 159, 255)', 'rgb(27, 201, 142)'];
                  return colorList[colors.dataIndex];
                }
              }
            },
            label: {
              show: false,
              position: 'center'
            },
            emphasis: {
              label: {
                show: true,
                fontSize: 14,
                fontWeight: 'bold'
              }
            },
            labelLine: {
              show: false
            },
            data: []
          }
        ]
      }
    };
  },
  computed: {
    ...mapGetters(["userInfo"]),
  },
  created() {
    this.getLogHandler();
  },
  methods: {
    getLogHandler() {
      this.loading = true;
      // æ—¥å¿—请求和展示的相关的配置
      const logConfig = [
        {
          logType: "1",
          logName: "登录日志统计",
          text: "当前登录日志总记录数",
          color: 'rgb(230, 71, 88)',
          router: '/LogInfoMain?logType=1&roleType=2'
        },
        {
          logType: "3",
          logName: "授权日志统计",
          text: "当前授权日志总记录数",
          color: 'rgb(178, 159, 255)',
          router: '/LogAuthorizeMain?logType=3&roleType=2'
        },
        {
          logType: "4",
          logName: "操作日志统计",
          text: "当前操作日志总记录数",
          color: 'rgb(27, 201, 142)',
          router: '/LogOperateMain?logType=4&roleType=2'
        },
      ];
      const roleType = "2";
      const requests = logConfig.map(config => getLogListByContion(1, -1, {logType: config.logType, roleType}));
      Promise.all(requests).then(responses => {
        // è®¡ç®—三个日志的总和
        const totalCount = responses.reduce((sum, res) => sum + (res.data.total || 0), 0);
        this.topOption.data = responses.map((res, index) => ({
          title: logConfig[index].logName,
          text: logConfig[index].text,
          color: logConfig[index].color,
          subtitle: '实时',
          count: res.data.total,
          allcount: `日志总数:${totalCount}`,
          key: '日志',
          click: () => this.$router.push({path: logConfig[index].router}),
        }));
        const chartData = responses.map((res, index) => ({
          name: logConfig[index].logName,
          value: res.data.total,
        }));
        this.$set(this.chartOptions.series[0], 'data', chartData);
        this.loading = false;
      }).catch(error => {
        this.$message.error(error);
        this.loading = false;
      });
    }
  },
};
</script>
<style>
.el-font-size {
  font-size: 14px;
}
.avue-text-ellipsis__text {
  font-size: 14px !important;
}
#chart {
  width: 100%;
  height: 309px;
}
</style>
Source/plt-web/plt-web-ui/src/views/wel/components/UndoTaskPortlet.vue
@@ -1,5 +1,5 @@
<template>
  <basic-container title="待办流程任务">
  <basic-container title="待办流程任务" :style="'height:'+height+'px' ">
    <avue-crud ref="crud" :data="todoData" :option="todoOption" :page.sync="page"
               :table-loading="loading"
               @on-load="onLoad"
@@ -18,6 +18,17 @@
<script>
export default {
  name: "UndoTaskPortlet",
  props:{
    height:  {
      type: Number
    },
    title:  {
      type: String
    },
    icon:  {
      type: String
    }
  },
  data(){
    return {
      loading: false,
@@ -30,7 +41,7 @@
      todoData: [],
      // ä»£åŠžæµç¨‹ä»»åŠ¡option
      todoOption: {
        height: 500,
        height: 'auto',
        addBtn: false,
        header: false,
        align: 'center',
@@ -86,12 +97,12 @@
  },
  methods: {
    onLoad(page, params = {}) {
      this.loading = true;
      //this.loading = true;
      const query = {
        ...this.query,
        category: (params.category) ? flowCategory(params.category) : null
      };
      todoList(page.currentPage, page.pageSize, Object.assign(params, query)).then(res => {
      /*todoList(page.currentPage, page.pageSize, Object.assign(params, query)).then(res => {
        const data = res.data.data;
        this.page.total = data.total;
        this.todoData = data.records;
@@ -100,6 +111,8 @@
        this.$message.error(error);
        this.loading = false;
      })
       */
    },
    cellHandle(row, column, cell, event) {
      if (column.property == 'taskName') {
Source/plt-web/plt-web-ui/src/views/wel/components/taskPortlet.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<template>
  <basic-container title="待办事项" :style="'height:'+height+'px' ">
    å¾…办
  </basic-container>
</template>
<script>
export default {
  name: "taskPortlet",
  props:{
    height:  {
      type: Number
    },
    title:  {
      type: String
    },
    icon:  {
      type: String
    }
  },
}
</script>
<style scoped>
</style>
Source/plt-web/plt-web-ui/src/views/wel/components/test.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<template>
  <basic-container title="首页组件" :style="'height:'+height+'px' ">
    é¦–页组件
  </basic-container>
</template>
<script>
export default {
  name: "test",
  props:{
    height:  {
      type: Number
    },
    title:  {
      type: String
    },
    icon:  {
      type: String
    }
  },
}
</script>
<style scoped>
</style>
Source/plt-web/plt-web-ui/src/views/wel/homeConfig.vue
@@ -1,4 +1,5 @@
<template>
  <!-- ä¸šåŠ¡ç®¡ç† é¦–页配置 -->
  <basic-container>
    <avue-crud
      ref="crud"
@@ -53,8 +54,8 @@
          </el-col>
          <el-col :span="24">
            <el-form-item label="图标:" prop="icon">
              <avue-input-icon v-model="form.icon" :icon-list="iconList" placeholder="请选择图标">
              </avue-input-icon>
              <input-icon v-model="form.icon" placeholder="请选择图标">
              </input-icon>
            </el-form-item>
          </el-col>
          <el-col :span="24">
Source/plt-web/plt-web-ui/src/views/wel/index.vue
@@ -1,217 +1,45 @@
<template>
  <div>
    <el-row>
      <el-col :span="24">
        <basic-container v-loading="loading">
          <avue-data-tabs :option="topOption"></avue-data-tabs>
        </basic-container>
      </el-col>
    </el-row>
    <el-row>
      <el-col :span="16" style="height: 560px">
        <basic-container>
          <el-collapse v-model="activeNames">
            <el-collapse-item name="1" title="欢迎使用PLT-WEB平台">
              <div>
                1、北京宏博远达科技有限公司(以下简称“宏博远达”)长期专注于制造业信息化建设,为客户提供企业信息化整体解决方案及相关软件研发、咨询及实施服务。宏博远达客户群体涵盖航空、航天、船舶、兵器、汽车、通用机械、电子等制造行业,通过与客户深度合作,承担了多项国家级软件研发与技术服务项目,拥有多项具有自主知识产权的软件产品。
              </div>
              <div>
                2、为了给客户提供更多的技术创新能力及相应的企业级管理支撑平台,宏博远达研发了具有自主知识产权的企业级信息化整体解决方案,同时针对客户的特定需求,提供了高度可定制的专业应用。为了进一步提升技术服务能力,宏博远达投入专门力量在前沿技术方面进行探索,在企业私有云计算和大数据等领域不断取得突破。随着新一代业务与管理技术平台的推出,更增强了公司为客户提供高质量、全方位、深层次服务的技术能力。
              </div>
              <div>
                3、宏博远达一直秉承“用智慧为客户创造价值”的宗旨,愿以“诚信负责”的态度和专业化的服务,在企业信息化发展的道路上,与客户一起成长,共同见证成功!
              </div>
            </el-collapse-item>
            <el-collapse-item name="2" title="服务计划制定">
              <div>
                1、根据客户实际需求,宏博远达将与客户共同制定年度服务计划,商定具体的服务对象、服务内容、定期维护的服务时间、技术交流的主题、具体的维护人员安排等服务细节。
              </div>
              <div>
                2、客户可通过电话、电子邮件、函件等方式取得系统技术支持。对于系统以外的问题,我们会尽力协助客户找到解决途径。
              </div>
              <div>
                3、对于远程无法解决的故障(问题),宏博远达工程师将在合同规定的时间内到达客户现场进行故障诊断及处理,做好相应的记录。必要时需要重新收集系统信息,并归档。对于非系统的原因而引起的故障(问题),宏博远达将关心和协助客户解决故障(问题)。
              </div>
              <div>
                4、在其他情形下,宏博远达也可提供必要的现场服务。如为客户获得的合法操作系统进行升级服务、为客户安装必要的软件等的服务、配合客户做主机系统方面的测试、为客户的应用调整提供系统方面的支持等等。
              </div>
              <div>
                5、宏博远达还将为客户提供定期的系统性能评估与优化服务。通过对系统运行数据的深入分析,我们将识别潜在的性能瓶颈,提出针对性的优化建议,并协助客户实施优化措施。这包括但不限于硬件资源的合理配置、软件参数的调优、数据库性能的提升等,旨在确保系统能够持续稳定、高效地运行,满足客户的业务发展需求。同时,我们也将根据系统评估结果,为客户提供未来的系统升级和扩展规划建议,帮助客户提前布局,应对未来的业务增长和技术变革。
              </div>
            </el-collapse-item>
          </el-collapse>
        </basic-container>
      </el-col>
      <el-col :span="8" style="height: 560px">
        <el-row>
          <basic-container>
            <div class="el-font-size">
              <span>产品名称</span>
              <el-divider direction="vertical"/>
              <span><el-tag>PLT-WEB平台</el-tag></span>
              <el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
              <span>当前用户</span>
              <el-divider direction="vertical"/>
              <span><el-tag type="success">{{ userInfo.userName }}</el-tag></span>
              <el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
              <span>说明文档</span>
              <el-divider direction="vertical"/>
              <span>
                <el-link href="https://bladex.vip" target="_blank"
                         type="primary">https://bladex.vip
                </el-link>
              </span>
              <el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
            </div>
          </basic-container>
          <basic-container>
            <div style="height: 309px">
              <v-chart id="chart" :auto-resize="true" :options="chartOptions"></v-chart>
            </div>
          </basic-container>
        </el-row>
      </el-col>
    </el-row>
    <component :is="showComponent"></component>
  </div>
</template>
<script>
import {mapGetters} from "vuex";
import {getLogListByContion} from "@/api/system/log/logBasic";
import 'echarts'
import 'echarts/lib/chart/pie' // å¯¼å…¥æŸ±çŠ¶å›¾ç»„ä»¶
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/legend'
import func from "@/util/func";
import adminIndex from './adminIndex.vue';
import workIndex from './workIndex.vue';
export default {
  name: "wel",
  components:{adminIndex,workIndex},
  data() {
    return {
      loading: false,
      activeNames: ['1', '2', '3', '5'],
      logActiveNames: ['28'],
      topOption: {
        data: []
      },
      chartOptions: {
        title: {
          text: '',
        },
        tooltip: {
          trigger: 'item'
        },
        legend: {
          top: '5%',
          left: 'center'
        },
        series: [
          {
            name: '日志统计',
            type: 'pie',
            radius: ['45%', '70%'],
            avoidLabelOverlap: false,
            padAngle: 5,
            itemStyle: {
              borderRadius: 10,
              normal: {
                color: function (colors) {
                  const colorList = ['rgb(230, 71, 88)', 'rgb(178, 159, 255)', 'rgb(27, 201, 142)'];
                  return colorList[colors.dataIndex];
                }
              }
            },
            label: {
              show: false,
              position: 'center'
            },
            emphasis: {
              label: {
                show: true,
                fontSize: 14,
                fontWeight: 'bold'
              }
            },
            labelLine: {
              show: false
            },
            data: []
          }
        ]
      }
      showComponent: null, // åˆå§‹ä¸æ˜¾ç¤ºä»»ä½•组件
    };
  },
  computed: {
    ...mapGetters(["userInfo"]),
  },
  watch: {
    'userInfo.userId'() {
      //是管理员进入管理员首页
      if(this.userInfo.userId.includes('admin')){
        this.showComponent=adminIndex;
      }else {
        this.showComponent=workIndex;
      }
    }
  },
  created() {
    this.getLogHandler();
    //是管理员进入管理员首页
    if(this.userInfo.userId.includes('admin')){
      this.showComponent=adminIndex;
    }else {
      this.showComponent=workIndex;
    }
  },
  methods: {
    getLogHandler() {
      this.loading = true;
      // æ—¥å¿—请求和展示的相关的配置
      const logConfig = [
        {
          logType: "1",
          logName: "登录日志统计",
          text: "当前登录日志总记录数",
          color: 'rgb(230, 71, 88)',
          router: '/LogInfoMain?logType=1&roleType=2'
        },
        {
          logType: "3",
          logName: "授权日志统计",
          text: "当前授权日志总记录数",
          color: 'rgb(178, 159, 255)',
          router: '/LogAuthorizeMain?logType=3&roleType=2'
        },
        {
          logType: "4",
          logName: "操作日志统计",
          text: "当前操作日志总记录数",
          color: 'rgb(27, 201, 142)',
          router: '/LogOperateMain?logType=4&roleType=2'
        },
      ];
      const roleType = "2";
      const requests = logConfig.map(config => getLogListByContion(1, -1, {logType: config.logType, roleType}));
      Promise.all(requests).then(responses => {
        // è®¡ç®—三个日志的总和
        const totalCount = responses.reduce((sum, res) => sum + (res.data.total || 0), 0);
        this.topOption.data = responses.map((res, index) => ({
          title: logConfig[index].logName,
          text: logConfig[index].text,
          color: logConfig[index].color,
          subtitle: '实时',
          count: res.data.total,
          allcount: `日志总数:${totalCount}`,
          key: '日志',
          click: () => this.$router.push({path: logConfig[index].router}),
        }));
        const chartData = responses.map((res, index) => ({
          name: logConfig[index].logName,
          value: res.data.total,
        }));
        this.$set(this.chartOptions.series[0], 'data', chartData);
        this.loading = false;
      }).catch(error => {
        this.$message.error(error);
        this.loading = false;
      });
    }
  },
};
</script>
Source/plt-web/plt-web-ui/src/views/wel/workIndex.vue
@@ -1,22 +1,35 @@
<template>
  <div>
    <el-row>
      <el-col v-for="item in homeData" :span="item.span">
        <component :is="item.currentComponent" :key="item.component"></component>
      <el-col v-for="item in homeData" :span="item.span" :xs="24">
        <component :height="height*item.height" :is="item.component" :key="item.component" :title="item.title" :icon="item.icon"></component>
      </el-col>
    </el-row>
  </div>
</template>
<script>
import UndoTaskPortlet from './components/UndoTaskPortlet.vue';
import taskPortlet from './components/taskPortlet.vue';
import test from './components/test.vue';
export default {
  name: "workIndex",
  components:{},
  components:{UndoTaskPortlet,taskPortlet,test},
  data(){
    return {
      height:document.body.clientHeight-115,
      homeData:[{
        component:'UndoTaskPortlet',
        span:24
        height:0.4,
        span:16
      },{
        component:'taskPortlet',
        height:0.3,
        span:5
      },{
        component:'test',
        height:0.6,
        span:12
      }]
    }
  },
@@ -25,20 +38,6 @@
  },
  methods:{
    initData() {
      this.homeData.map(item => {
        this.loadCompoent(item);
        return item;
      })
    },
    loadCompoent(item){
      // åŠ¨æ€å¯¼å…¥ç»„ä»¶
      import(`@/views/wel/components/${item.component}.vue`).then((module) => {
        // æˆåŠŸå¯¼å…¥åŽï¼Œå°†ç»„ä»¶æ³¨å†Œåˆ°Vue实例中
        item.currentComponent = module.default;
      }).catch((error) => {
        // å¤„理导入失败的情况
        console.log('组件加载失败:', error);
      });
    },
  }
}