package com.wgcloud.controller; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.github.pagehelper.PageInfo; import com.wgcloud.config.CommonConfig; import com.wgcloud.entity.DbInfo; import com.wgcloud.entity.DbTable; import com.wgcloud.entity.DbTableCount; import com.wgcloud.service.*; import com.wgcloud.util.*; import com.wgcloud.util.jdbc.RDSConnection; import com.wgcloud.util.staticvar.StaticKeys; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @version v3.3 * @ClassName:DbTableController.java * @author: http://www.wgstart.com * @date: 2021年1月16日 * @Description: 数据表管理 * @Copyright: 2019-2021 wgcloud. All rights reserved. */ @Controller @RequestMapping("/dbTable") public class DbTableController { private static final Logger logger = LoggerFactory.getLogger(DbTableController.class); @Resource private DbInfoService dbInfoService; @Resource private DbTableService dbTableService; @Resource private DbTableCountService dbTableCountService; @Resource private LogInfoService logInfoService; @Autowired private TokenUtils tokenUtils; @Resource private ExcelExportService excelExportService; @Resource private DashboardService dashboardService; @Autowired CommonConfig commonConfig; /** * agent查询监控数据表列表 * * @param paramBean * @return */ @ResponseBody @RequestMapping(value = "agentList") public String agentList(@RequestBody String paramBean) { JSONObject agentJsonObject = (JSONObject) JSONUtil.parse(paramBean); if (!tokenUtils.checkAgentToken(agentJsonObject)) { logger.error(StaticKeys.TOKEN_ERROR); return ResDataUtils.resetErrorJson(StaticKeys.TOKEN_ERROR); } Map params = new HashMap(); try { params.put("active", StaticKeys.ON_STATE); if (null != agentJsonObject.get("dbInfoIds") && !StringUtils.isEmpty(agentJsonObject.get("dbInfoIds").toString())) { params.put("dbInfoIds", agentJsonObject.get("dbInfoIds").toString().split(",")); } List dbTableList = dbTableService.selectAllByParams(params); List dbTableListResult = new ArrayList<>(); //sql信息加密处理 begin for (DbTable dbTable : dbTableList) { dbTable.setWhereVal(DESUtil.encryption(dbTable.getWhereVal())); String sqlinkey = FormatUtil.haveSqlDanger(dbTable.getWhereVal(), commonConfig.getSqlInKeys()); if (!StringUtils.isEmpty(sqlinkey)) { logger.error("统计SQL语句含有sql敏感字符" + sqlinkey); continue; } dbTableListResult.add(dbTable); } //sql信息加密处理 end return ResDataUtils.resetSuccessJson(dbTableListResult); } catch (Exception e) { logger.error("agent获取监控数据表信息错误", e); logInfoService.save("agent获取监控数据表信息错误", e.toString(), StaticKeys.LOG_XTCZ); return ResDataUtils.resetErrorJson(e.toString()); } } /** * 根据条件查询列表 * * @param model * @param request * @return */ @RequestMapping(value = "list") public String dbTableList(DbTable DbTable, Model model, HttpServletRequest request) { Map params = new HashMap(); try { StringBuffer url = new StringBuffer(); String dbInfoId = null; if (!StringUtils.isEmpty(DbTable.getDbInfoId())) { dbInfoId = DbTable.getDbInfoId(); params.put("dbInfoId", dbInfoId.trim()); url.append("&dbInfoId=").append(dbInfoId); } if (!StringUtils.isEmpty(DbTable.getAccount())) { params.put("account", DbTable.getAccount()); url.append("&account=").append(DbTable.getAccount()); } if (!StringUtils.isEmpty(DbTable.getRemark())) { params.put("remark", DbTable.getRemark()); url.append("&remark=").append(DbTable.getRemark()); } if (!StringUtils.isEmpty(DbTable.getOrderBy())) { params.put("orderBy", DbTable.getOrderBy()); params.put("orderType", DbTable.getOrderType()); url.append("&orderBy=").append(DbTable.getOrderBy()); url.append("&orderType=").append(DbTable.getOrderType()); } //校验是否需要添加过滤用户查询条件 HostUtil.addAccountquery(request, params); PageInfo pageInfo = dbTableService.selectByParams(params, DbTable.getPage(), DbTable.getPageSize()); PageUtil.initPageNumber(pageInfo, model); params.clear(); //设置数据表的一些额外附加值 begin List dbInfoList = dbInfoService.selectAllByParams(params); //设置数据库logo dbInfoService.dbAddLogo(dbInfoList); for (DbTable dbTable : pageInfo.getList()) { for (DbInfo dbInfo : dbInfoList) { if (dbInfo.getId().equals(dbTable.getDbInfoId())) { //暂时借用取值的列名,来存贮下数据源名称,显示用 dbTable.setTableName(dbInfo.getAliasName()); //设置数据源logo dbTable.setImage(dbInfo.getImage()); //设置所属用户账号 begin if (StaticKeys.TRUE_VAL.equals(commonConfig.getUserInfoManage())) { dbTable.setAccount(dbInfo.getAccount()); } //设置所属用户账号 begin } } } //设置数据表的一些额外附加值 end //设置用户列表 HostUtil.addAccountListModel(model); model.addAttribute("pageUrl", "/dbTable/list?1=1" + url.toString()); model.addAttribute("page", pageInfo); model.addAttribute("dbTable", DbTable); model.addAttribute("dbInfoList", dbInfoList); } catch (Exception e) { logger.error("查询数据表信息错误", e); logInfoService.save("查询数据表信息错误", e.toString(), StaticKeys.LOG_XTCZ); } return "mysql/tableList"; } /** * 保存数据源表信息 * * @param DbTable * @param model * @param request * @return */ @RequestMapping(value = "save") public String saveDbTable(DbTable DbTable, Model model, HttpServletRequest request) { try { //检测有无sql敏感字 begin String sqlinkey = FormatUtil.haveSqlDanger(DbTable.getWhereVal(), commonConfig.getSqlInKeys()); if (!StringUtils.isEmpty(sqlinkey)) { model.addAttribute("dbTable", DbTable); List dbInfoList = dbInfoService.selectAllByParams(new HashMap<>()); model.addAttribute("dbInfoList", dbInfoList); model.addAttribute("sqlInKeys", commonConfig.getSqlInKeys()); model.addAttribute("msg", "统计SQL语句含有sql敏感字符" + sqlinkey + ",请检查"); return "mysql/addTable"; } //检测有无sql敏感字 end if (StringUtils.isEmpty(DbTable.getId())) { dbTableService.save(DbTable); dbTableService.saveLog(request, StaticKeys.LOG_ADD, DbTable); } else { dbTableService.updateById(DbTable); dbTableService.saveLog(request, StaticKeys.LOG_UPDATE, DbTable); } } catch (Exception e) { logger.error("保存数据表错误", e); logInfoService.save("保存数据表错误", e.toString(), StaticKeys.LOG_XTCZ); } return "redirect:/dbTable/list"; } /** * 查看数据源表信息 * * @param DbTable * @param model * @param request * @return */ @RequestMapping(value = "edit") public String editDbTable(DbTable DbTable, Model model, HttpServletRequest request) { try { String id = request.getParameter("id"); DbTable dbTableInfo = new DbTable(); if (!StringUtils.isEmpty(id)) { dbTableInfo = dbTableService.selectById(id); } //校验是否需要添加过滤用户查询条件 Map params = new HashMap(); HostUtil.addAccountquery(request, params); List dbInfoList = dbInfoService.selectAllByParams(params); // redis和mongodb不支持数据表 begin List dbInfoListResult = new ArrayList<>(); for (DbInfo dbInfo : dbInfoList) { if (RDSConnection.KEY_REDIS.equals(dbInfo.getDbType()) || RDSConnection.KEY_MONGODB.equals(dbInfo.getDbType())) { continue; } dbInfoListResult.add(dbInfo); } // redis和mongodb不支持数据表 end model.addAttribute("dbInfoList", dbInfoListResult); model.addAttribute("dbTable", dbTableInfo); model.addAttribute("sqlInKeys", commonConfig.getSqlInKeys()); } catch (Exception e) { logger.error("查看数据表错误", e); logInfoService.save("查看数据表错误", e.toString(), StaticKeys.LOG_XTCZ); } return "mysql/addTable"; } /** * 查看数据源表图表统计信息 * * @param DbTable * @param model * @param request * @return */ @RequestMapping(value = "viewChart") public String viewChartDbTable(DbTable DbTable, Model model, HttpServletRequest request) { try { String id = request.getParameter("id"); String startTime = request.getParameter(StaticKeys.SEARCH_START_TIME); String endTime = request.getParameter(StaticKeys.SEARCH_END_TIME); String am = request.getParameter("am"); if (!StringUtils.isEmpty(id)) { DbTable dbTableInfo = dbTableService.selectById(id); Map params = new HashMap(); dashboardService.setDateParam(am, startTime, endTime, params, model); model.addAttribute("amList", dashboardService.getAmList()); params.put("dbTableId", id); List dbTableCounts = dbTableCountService.selectAllByParams(params); model.addAttribute("dbTableCounts", JSONUtil.parseArray(dbTableCounts)); // 设置图表的副标题,数据量的最高、平均、最低值 dbTableCountService.setSubtitle(model, dbTableCounts); model.addAttribute("dbTable", dbTableInfo); } } catch (Exception e) { logger.error("查看数据表图表统计错误", e); logInfoService.save("查看数据表图表统计错误", e.toString(), StaticKeys.LOG_XTCZ); } return "mysql/tableView"; } /** * 查看该数据表统计图导出excel * * @param model * @param request * @return */ @RequestMapping(value = "chartExcel") public void chartExcel(Model model, HttpServletRequest request, HttpServletResponse response) { String errorMsg = "数据表统计图导出excel错误"; String id = request.getParameter("id"); String startTime = request.getParameter(StaticKeys.SEARCH_START_TIME); String endTime = request.getParameter(StaticKeys.SEARCH_END_TIME); String am = request.getParameter("am"); try { if (StringUtils.isEmpty(id)) { response.setContentType("text/html;charset=UTF-8"); response.getOutputStream().write(StaticKeys.EXCEL_PARAM_ERROR.getBytes()); return; } Map params = new HashMap(); dashboardService.setDateParam(am, startTime, endTime, params, model); params.put("dbTableId", id); excelExportService.exportDbTableExcel(params, response); } catch (Exception e) { logger.error(errorMsg, e); logInfoService.save(errorMsg, e.toString(), StaticKeys.LOG_XTCZ); } } /** * 删除数据源表 * * @param model * @param request * @param redirectAttributes * @return */ @RequestMapping(value = "del") public String delete(Model model, HttpServletRequest request, RedirectAttributes redirectAttributes) { String errorMsg = "删除数据表信息错误"; try { if (!StringUtils.isEmpty(request.getParameter("id"))) { String[] ids = request.getParameter("id").split(","); for (String id : ids) { DbTable dbTable = dbTableService.selectById(id); dbTableService.saveLog(request, StaticKeys.LOG_DEL, dbTable); } dbTableService.deleteById(ids); } } catch (Exception e) { logger.error(errorMsg, e); logInfoService.save(errorMsg, e.toString(), StaticKeys.LOG_XTCZ); } return "redirect:/dbTable/list"; } }