springboot+vue 显示动态列的结果集

该项目通过动态表单实现按项目组汇总的报表生成。采购申请时,用户需选择自定义配置的项目组。代码实现包括XML查询、Mapper接口和Vue前端展示。XML查询通过动态列生成按项目组汇总的报表,支持按年份、月份、部门和费用项目进行分组统计。Mapper接口定义查询方法,接受列分组和查询条件参数。Vue前端使用表格组件展示数据,并支持列自定义和单元格操作。整体实现灵活,适用于动态报表生成需求。

需求

以项目组报表(动态表单)为例:

  1. 项目组为用户自定义配置,采购申请时必选项目组
  2. 生成按项目组汇总的报表
    在这里插入图片描述

代码实现

代码参考

xml
<select id="selectProjectTeamList" parameterType="projectTeamReportQueryVo" resultType="java.util.HashMap">
        SELECT a.apply_year,a.apply_month,a.dept_name,a.expense_item,SUM(a.apply_amount) total_apply_amount,
            <foreach item="item" collection="columnGroup"  separator=","  index="index">
                MAX(CASE a.project_team_name WHEN #{item} THEN a.apply_amount ELSE 0 END) AS #{item}
            </foreach>
        FROM (
                 SELECT
                     YEAR(apply_time) AS apply_year, MONTH(apply_time) AS apply_month,dept_name,expense_item,project_team_name,IFNULL(SUM(apply_amount),0) AS apply_amount
                 FROM biz_purchase
                 WHERE approval_status='4'
<!--                     <if test="projectTeamReportQueryVo.deptId != null and projectTeamReportQueryVo.deptId != ''">-->
<!--                         AND dept_id = #{projectTeamReportQueryVo.deptId}-->
<!--                     </if>-->
<!--                     <if test="projectTeamReportQueryVo.deptName != null and projectTeamReportQueryVo.deptName != ''">-->
<!--                         AND dept_name = #{projectTeamReportQueryVo.deptName}-->
<!--                     </if>-->
                     <if test="projectTeamReportQueryVo.expenseItem != null and projectTeamReportQueryVo.expenseItem != ''">
                         AND expense_item = #{projectTeamReportQueryVo.expenseItem}
                     </if>
                     <if test="projectTeamReportQueryVo.startDate != null and projectTeamReportQueryVo.startDate != ''">
                         AND apply_time &gt;= #{projectTeamReportQueryVo.startDate}
                     </if>
                     <if test="projectTeamReportQueryVo.endDate != null and projectTeamReportQueryVo.endDate != ''">
                         AND apply_time &lt;= #{projectTeamReportQueryVo.endDate}
                     </if>
                    <if test="projectTeamReportQueryVo.deptIds != null and projectTeamReportQueryVo.deptIds.size() > 0">
                        AND dept_id IN
                        <foreach item="item" collection="projectTeamReportQueryVo.deptIds" open="(" separator="," close=")" index="index">
                            #{item}
                        </foreach>
                    </if>
                 GROUP BY YEAR(apply_time),MONTH(apply_time),dept_name,expense_item,project_team_name
             ) a
        GROUP BY a.apply_year,a.apply_month,a.dept_name,a.expense_item
    </select>
mapper
/**
 * 查询项目团队
 * 参考:<a href="https://www.cnblogs.com/Cloong/p/17268281.html">存储动态列的结果集</a>
 *
 * @param columnGroup              列分组
 * @param projectTeamReportQueryVo 项目团队查询条件
 * @return 项目团队集合
 */
@SuppressWarnings("MybatisXMapperMethodInspection")
List<Map<String, Object>> selectProjectTeamList(@Param("columnGroup") Set<String> columnGroup, @Param("projectTeamReportQueryVo") ProjectTeamReportQueryVo projectTeamReportQueryVo);

vue
 <el-table v-loading="loading" :data="projectTeamList" border show-summary :summary-method="getSummaries">
      <!--      <el-table-column label="序号" type="index" width="220"/>-->
      <el-table-column
          v-for="col in tableColumnList"
          :prop="col.prop"
          :label="col.label"
          :key="col.prop"
          min-width="150"
      >
        <template #default="scope">
          {{ columnFormatter(scope.row, scope.column) }}
          <el-button v-if="col.showCellView && (scope.row[col.prop] != 0)" link type="primary" icon="View"
                     @click="handleCellView(scope.row, scope.column)"/>
        </template>
      </el-table-column>
    </el-table>
### 数据可视化方案概述 为了实现在Spring BootVue项目中两张表的数据可视化,可以遵循以下架构和技术栈的选择。Spring Boot负责后端逻辑处理以及与数据库的交互,而前端部分由Vue.js完成用户界面渲染和数据展示。 #### 后端Spring Boot 设计 在`controller`层定义RESTful API接口用于向前端传输所需的数据[^1]。对于涉及多张表格的操作,通常会涉及到联合查询或者嵌套对象的形式返回JSON结构给客户端。例如: ```java @RestController @RequestMapping("/api/data") public class DataController { @Autowired private DataService dataService; @GetMapping("/combinedData") public ResponseEntity<List<CombinedEntity>> getCombinedData() { List<CombinedEntity> combinedEntities = dataService.fetchCombinedData(); return new ResponseEntity<>(combinedEntities, HttpStatus.OK); } } ``` 这里假设有一个名为 `DataService` 的service组件实现了具体的业务逻辑和服务调用,并最终从DAO层获取到融合后的数据。 #### 前端:Vue.js 可视化页面构建 利用Element UI或其他UI库来快速搭建美观易用的图表组件。安装依赖之后可以在.vue文件内引入这些组件并绑定动态数据源。下面给出一段简单的例子说明如何接收来自服务器响应的数据并将其呈现出来: ```html <!-- template --> <div id="app"> <el-table :data="tableData" style="width: 100%"> <!-- 表格列定义省略... --> </el-table> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <script> new Vue({ el: '#app', data() { return { tableData: [] }; }, created() { this.fetchData(); }, methods: { fetchData() { axios.get('/api/data/combinedData') .then(response => (this.tableData = response.data)); } } }); </script> ``` 这段代码展示了如何初始化一个Vue实例并在其生命周期钩子`created()`中发起HTTP请求加载远程API提供的数据[^2]。当接收到成功的回复时更新本地状态变量`tableData`,从而触发视图自动刷新显示最新的内容。 #### 图形化展示工具成 除了基本的表格形式外,还可以考虑加入ECharts这样的图形库来进行更加生动形象的数据表达。比如柱状图、折线图等形式都可以帮助更好地理解复杂的关系模式。只需要按照官方文档指导添加相应脚本标签即可轻松上手使用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值