zoukankan      html  css  js  c++  java
  • 毕业设计-8

    一、本周任务概述

        1.1 概述:本周主要实现的功能如下

    1. 将模块树、单位树、部门树、不安全因素抽离成单独的组件,并重新替换。
    2. 登录界面布局重新进行了设计,导航栏增加侧边栏折叠按钮实现折叠效果。
    3. 实现将隐患或违规数据进行导出到Excel中。
    4. ,完成承包商分析并修改了部分bug。

         1.2 效果:

     (登录界面)

     (主页样式,侧边栏未折叠)

     (侧边栏折叠)

     (承包商选择)

     (选择不安全因素就默认对比人的不安全行为和物的不安全状态)

     (选择某个更具体一点的不安全因素则会对比其下面所有可能的结果)

     (选择某一条最具体的不安全因素就会对比这项以及其他项)

     (导出违章数据)

     (导出隐患数据)

    二、问题发现与解决

        2.1 在处理井控设备缺陷这样的隐患条件(其下有11条),统计结果应该是每一条占了多少项,因此要对前端展示标题进行处理,我直接用string.split(".")进行分割,但是却报错了,然后发现括号中提示是regex(正则表达式),因此报错的原因就是‘.’是正则符号,需要转义才能解决。

         

     

        2.2在这次测试删除部门的时候,前面都是能够正常运行,这次运行就突然报错是栈溢出错误。虽然递归容易产生栈溢出错误,但是删除这个部门及其子部门不过才递归两三层。然后就跟着调试去一步步跟着走,最终发现是添加这个部门时,父部门id和该部门id弄成了一样,导致无限递归了。于是就重新修改了添加部门的逻辑,并测试了删除部门,成功解决。

     

        2.3 在抽离模块树、单位树、部门树、不安全因素时也遇到了很多问题。首先就是父组件调用子组件dialog显示与隐藏,因为这个值由一个布尔值控制,一开始我是定义在父组件里面,但是子组件去修改时就会报错(类似如下图的错误),然后我想了还是定义在子组件里,父组件传过来一个值,子组件进行监听,如果父组件传过来的值发生改变,则改变dialog的显示与隐藏。

         

    <template>
      <div>
        <el-dialog :visible.sync="showCompanyDialog" width="30%" @close="closeDialog">
          <span slot="title" class="dialog-footer">
            <span class="iconfont icon-Company" style="color:#66B1FF">&nbsp;单位选择</span>
          </span>
          <el-tree
            :data="companyTree"
            auto-expand-parent
            node-key="id"
            highlight-current
            :props="companyProps"
            ref="companyTreeRef"
          >
            <span class="custom-tree-node" slot-scope="{ node, data }">
              <span>
                <i :class="setCompanyTreeIcon(data)"></i>
                {{ node.label }}
              </span>
            </span>
          </el-tree>
    
          <!--   底部按钮区域 -->
          <span slot="footer" class="dialog-footer">
            <el-button @click="showCompanyDialog=false">取 消</el-button>
            <el-button type="primary" @click="selectCompany">确 定</el-button>
          </span>
        </el-dialog>
      </div>
    </template>
    
    <script>
    export default {
      name: '',
      data () {
        return {
          showCompanyDialog: false, // 控制dialog的显示与隐藏
          companyTree: [], // 数据
          companyProps: { // 树的配置项
            children: 'children',
            label: 'name',
            id: 'id'
          }
        }
      },
      props: {
        showDialog: {
          // 父组件必传的值
          type: Boolean,
          default: false,
          required: true
        }
      },
      created () {
        // 加载数据
        this.initData()
      },
      watch: {
        // 监视父组件传过来的值的变化
        showDialog (oldVal, newVal) {
          this.showCompanyDialog = this.showDialog
        }
      },
      methods: {
        async initData () {
          const { data: res } = await this.$http.get('company/companyTree')
          this.companyTree = res.data
        },
        setCompanyTreeIcon (data) {
          // 设置单位树的icon
          if (data.children.length === 0) {
            return 'iconfont icon-SpecWorkStaff'
          } else {
            return 'iconfont icon-Company'
          }
        },
        selectCompany () {
          // 暴露选择的节点 在父组件写selectCompany方法进行调用即可
          this.showCompanyDialog = false
          this.$emit('selectCompany', this.$refs.companyTreeRef.getCurrentNode())
        },
        closeDialog () {
          // 关闭当前dialog
          this.$emit('closeCompanyDialog', false)
        }
      }
    }
    </script>
    
    <style scoped>
    </style>

        2.4  将vue数据导出到Excel中。一开始我想的是既能导出选中行,也能导出所有数据。最终还是直接选择导出所有数据。百度了如何实现导出功能,有些差不多都写好了这种组件。我还是参考了一些博客,来完成。大致思路就是先引入xlsx、file-saver、script-loader依赖,然后引入两个JS脚本。(参考文章:https://www.cnblogs.com/myfirstboke/p/8243800.html

    async  export2Excel (type) { // 将隐患或违规数据导出
          let dataTable = []//数据表
          let tHeader = []//导出到Excel的第一行标题
          let filterVal = []//表中对应的字段
          let excelName = ''//导出的表名
          // 通过这种方式创建对象 才不是原来对象的引用 不然会修改原对象的值
          const query = JSON.parse(JSON.stringify(this.queryForm))
          query.currentPage = null
          query.pageSize = null
          if (type === 'danger') { // 查询所有隐患数据
            const { data: res } = await this.$http.post(
              'analysis/detail/danger',
              query
            )
            if (res.code === 200) {
              dataTable = res.data.queryResults
              tHeader = ['安全监督', '作业项目', '施工队伍', '隐患类型', '隐患信息', '整改情况']
              filterVal = ['safeStaffName', 'workItem', 'companyName', 'type', 'description', 'reformCase']
              excelName = '承包商隐患数据'
            }
          } else { // 导出违规数据
            const { data: res } = await this.$http.post(
              'analysis/detail/regulation',
              query
            )
            if (res.code === 200) {
              dataTable = res.data.queryResults
              tHeader = ['安全监督', '作业项目', '施工队伍', '违章类型', '违章信息', '处罚情况']
              filterVal = ['safeStaffName', 'workItem', 'companyName', 'type', 'description', 'punish']
              excelName = '承包商违章数据'
            }
          }
          require.ensure([], () => {
            const data = this.formatJson(filterVal, dataTable)
            const { exportJsonToExcel } = require('../../../views/ExportExcel/Export2Excel')
            exportJsonToExcel(tHeader, data, excelName)
          })
        },
        formatJson (filterVal, jsonData) {
          return jsonData.map(v => filterVal.map(j => v[j]))
        },

    三、下周计划

        下周开始抽取文档,并开始进行论文编写。同时对于项目中的bug进行修改。

  • 相关阅读:
    借鉴文章记录
    三方框架
    常用第三方库记录
    ios block 类型
    ios runtime部分事例方法说明
    ios url网址相关问题解说
    mysql迁移数据库函数中的坑
    mysql的事务隔离级别
    MySQL数据库的默认隔离级别为什么是可重复读
    实时查看mysql连接数
  • 原文地址:https://www.cnblogs.com/Juice-Dreamer/p/12831717.html
Copyright © 2011-2022 走看看