使用oracle数据库做的数据上传系统前端
kongdeqiang
2026-03-23 0b269c539f53fda21dd786deb26e45882edeadd4
fix: 更新系统
5个文件已修改
125 ■■■■■ 已修改文件
index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/MainLayout.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/Excel.vue 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/Department.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
index.html
@@ -4,7 +4,7 @@
    <meta charset="UTF-8">
    <link rel="icon" type="image/svg+xml" href="/vite.svg">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据管理系统</title>
    <title>数据录入系统</title>
  </head>
  <body>
    <div id="app"></div>
src/layout/MainLayout.vue
@@ -39,10 +39,26 @@
            <el-icon><Upload /></el-icon>
            <span>数据管理</span>
          </template>
          <el-menu-item index="/data/unit-task">
            <el-icon><List /></el-icon>
            <template #title>单位上传任务</template>
          </el-menu-item>
          <el-menu-item index="/data/excel">
            <el-icon><Document /></el-icon>
            <template #title>单位数据上传</template>
          </el-menu-item>
        </el-sub-menu>
        <el-sub-menu index="statistics">
          <template #title>
            <el-icon><DataAnalysis /></el-icon>
            <span>数据统计</span>
          </template>
          <el-menu-item index="/statistics/unit">
            <el-icon><DataLine /></el-icon>
            <template #title>各单位数据统计</template>
          </el-menu-item>
        </el-sub-menu>
      </el-menu>
    </el-aside>
src/router/index.js
@@ -36,6 +36,18 @@
        name: 'Excel',
        component: () => import('@/views/data/Excel.vue'),
        meta: { title: 'Excel上传' }
      },
      {
        path: 'data/unit-task',
        name: 'UnitTask',
        component: () => import('@/views/data/UnitTask.vue'),
        meta: { title: '单位上传任务' }
      },
      {
        path: 'statistics/unit',
        name: 'UnitStatistics',
        component: () => import('@/views/statistics/UnitStatistics.vue'),
        meta: { title: '各单位数据统计' }
      }
    ]
  }
src/views/data/Excel.vue
@@ -21,8 +21,21 @@
      </template>
      <el-form :inline="true" :model="searchForm" class="search-form">
        <el-form-item label="单位名称">
          <el-input v-model="searchForm.unitName" placeholder="请输入单位名称" clearable />
        <el-form-item label="单位">
          <el-select
              v-model="searchForm.unitCode"
              placeholder="请选择单位"
              clearable
              filterable
              style="width: 250px"
          >
            <el-option
                v-for="dept in flatDepartmentList"
                :key="dept.deptCode"
                :label="`${dept.deptCode} - ${dept.deptName}`"
                :value="dept.deptCode"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="交易流水号">
          <el-input v-model="searchForm.transactionNo" placeholder="请输入交易流水号" clearable />
@@ -195,8 +208,9 @@
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import {ref, reactive, onMounted, computed} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDepartmentTree } from '@/api/department'
import { Plus, Edit, Delete, Search, Refresh, Upload, Download } from '@element-plus/icons-vue'
import { getExcelPage, createExcel, updateExcel, deleteExcel, importExcel, downloadTemplate } from '@/api/excel'
@@ -206,9 +220,11 @@
const dialogTitle = ref('')
const formRef = ref(null)
const uploadRef = ref(null)
const departmentList = ref([])
const searchForm = reactive({
  unitName: '',
  unitCode: '',
  transactionNo: '',
  accountingPeriod: ''
})
@@ -243,6 +259,60 @@
const rules = {
  unitName: [{ required: true, message: '请输入单位名称', trigger: 'blur' }],
  transactionNo: [{ required: true, message: '请输入交易流水号', trigger: 'blur' }]
}
const flatDepartmentList = computed(() => {
  const flatten = (list) => {
    let result = []
    list.forEach(item => {
      result.push(item)
      if (item.children && item.children.length > 0) {
        result = result.concat(flatten(item.children))
      }
    })
    return result
  }
  return flatten(departmentList.value)
})
const fetchDepartmentList = async () => {
  try {
    const res = await getDepartmentTree()
    departmentList.value = buildTree(res.data)
  } catch (error) {
    console.error('获取部门列表失败:', error)
  }
}
const buildTree = (list) => {
  const map = {}
  const roots = []
  list.forEach(item => {
    map[item.deptCode] = { ...item, children: [] }
  })
  list.forEach(item => {
    const parent = map[item.parentCode]
    if (parent) {
      parent.children.push(map[item.deptCode])
    } else {
      roots.push(map[item.deptCode])
    }
  })
  const cleanEmptyChildren = (nodes) => {
    nodes.forEach(node => {
      if (node.children && node.children.length === 0) {
        delete node.children
      } else {
        cleanEmptyChildren(node.children)
      }
    })
  }
  cleanEmptyChildren(roots)
  return roots
}
const formatAmount = (amount) => {
@@ -409,6 +479,7 @@
}
onMounted(() => {
  fetchDepartmentList()
  fetchData()
})
</script>
src/views/system/Department.vue
@@ -51,9 +51,8 @@
        <el-form-item label="部门名称" prop="deptName">
          <el-input v-model="form.deptName" placeholder="请输入部门名称" />
        </el-form-item>
        <el-form-item label="父级部门" prop="parentCode">
          <el-select v-model="form.parentCode" placeholder="请选择父级部门" style="width: 100%">
            <el-option label="顶级部门" value="0" />
        <el-form-item label="上级部门" prop="parentCode">
          <el-select v-model="form.parentCode" placeholder="请选择上级部门" style="width: 100%">
            <el-option
              v-for="dept in flatDepartmentList"
              :key="dept.deptCode"
@@ -84,7 +83,7 @@
</template>
<script setup>
import { ref, reactive, computed, onMounted } from 'vue'
import {ref, reactive, computed, onMounted, nextTick} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Edit, Delete } from '@element-plus/icons-vue'
import { getDepartmentTree, createDepartment, updateDepartment, deleteDepartment } from '@/api/department'
@@ -121,7 +120,16 @@
    })
    return result
  }
  return flatten(tableData.value)
  const list = flatten(tableData.value)
  // 数据扁平化后,默认选中第一个部门的 deptCode
  nextTick(() => {
    if (list.length > 0) {
      form.parentCode = list[0].deptCode
    }
  })
  return list
})
const buildTree = (list) => {