|
|
|
@ -0,0 +1,291 @@
|
|
|
|
|
// 声明当前文件所在的包路径
|
|
|
|
|
package com.controller;
|
|
|
|
|
|
|
|
|
|
// 导入输入输出相关类
|
|
|
|
|
import java.io.*;
|
|
|
|
|
// 导入SQL相关类
|
|
|
|
|
import java.sql.Connection;
|
|
|
|
|
import java.sql.DriverManager;
|
|
|
|
|
import java.sql.SQLException;
|
|
|
|
|
// 导入日期格式化类
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
// 导入集合类
|
|
|
|
|
import java.util.*;
|
|
|
|
|
// 导入Servlet请求类
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
|
|
|
|
|
// 导入FastJSON相关类
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
// 导入字符串工具类
|
|
|
|
|
import com.utils.StringUtil;
|
|
|
|
|
// 导入Apache Commons字符串工具
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
// 导入JSON对象类
|
|
|
|
|
import org.json.JSONObject;
|
|
|
|
|
// 导入日志相关类
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
|
|
// 导入Spring框架相关注解和类
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
import org.springframework.util.ResourceUtils;
|
|
|
|
|
// 导入Spring MVC注解
|
|
|
|
|
import org.springframework.web.bind.annotation.PathVariable;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
|
|
|
|
// 导入自定义注解
|
|
|
|
|
import com.annotation.IgnoreAuth;
|
|
|
|
|
// 导入百度AI相关类
|
|
|
|
|
import com.baidu.aip.face.AipFace;
|
|
|
|
|
import com.baidu.aip.face.MatchRequest;
|
|
|
|
|
import com.baidu.aip.util.Base64Util;
|
|
|
|
|
// 导入MyBatis-Plus相关类
|
|
|
|
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.mapper.Wrapper;
|
|
|
|
|
// 导入实体类
|
|
|
|
|
import com.entity.ConfigEntity;
|
|
|
|
|
// 导入服务类
|
|
|
|
|
import com.service.CommonService;
|
|
|
|
|
import com.service.ConfigService;
|
|
|
|
|
// 导入工具类
|
|
|
|
|
import com.utils.BaiduUtil;
|
|
|
|
|
import com.utils.FileUtil;
|
|
|
|
|
import com.utils.R;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//通用接口控制器
|
|
|
|
|
//提供系统通用的各种功能接口
|
|
|
|
|
@RestController // 标识这是一个RESTful风格的控制器
|
|
|
|
|
public class CommonController {
|
|
|
|
|
// 日志记录器,使用slf4j的LoggerFactory创建
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(CommonController.class);
|
|
|
|
|
|
|
|
|
|
// 自动注入通用服务
|
|
|
|
|
@Autowired
|
|
|
|
|
private CommonService commonService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// * MySQL数据库备份接口
|
|
|
|
|
// * @param mysqlUrl MySQL安装路径
|
|
|
|
|
// * @param hostIP 数据库服务器IP
|
|
|
|
|
// * @param userName 数据库用户名
|
|
|
|
|
// * @param hostPort 数据库端口
|
|
|
|
|
//* @param password 数据库密码
|
|
|
|
|
//* @param savePath 备份文件保存路径
|
|
|
|
|
//* @param fileName 备份文件名
|
|
|
|
|
//* @param databaseName 要备份的数据库名
|
|
|
|
|
//* @return 操作结果
|
|
|
|
|
|
|
|
|
|
@IgnoreAuth // 忽略权限验证
|
|
|
|
|
@RequestMapping("/beifen") // 映射请求路径
|
|
|
|
|
public R beifen(String mysqlUrl, String hostIP, String userName, String hostPort,
|
|
|
|
|
String password, String savePath, String fileName, String databaseName) {
|
|
|
|
|
// 创建保存目录文件对象
|
|
|
|
|
File saveFile = new File(savePath);
|
|
|
|
|
// 检查目录是否存在
|
|
|
|
|
if (!saveFile.exists()) {
|
|
|
|
|
// 不存在则创建多级目录
|
|
|
|
|
saveFile.mkdirs();
|
|
|
|
|
}
|
|
|
|
|
// 确保路径以分隔符结尾
|
|
|
|
|
if (!savePath.endsWith(File.separator)) {
|
|
|
|
|
savePath = savePath + File.separator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 声明打印写入器和缓冲读取器
|
|
|
|
|
PrintWriter printWriter = null;
|
|
|
|
|
BufferedReader bufferedReader = null;
|
|
|
|
|
try {
|
|
|
|
|
// 获取运行时对象
|
|
|
|
|
Runtime runtime = Runtime.getRuntime();
|
|
|
|
|
// 构建mysqldump命令字符串
|
|
|
|
|
String cmd = mysqlUrl + "mysqldump -h" + hostIP + " -u" + userName +
|
|
|
|
|
" -P" + hostPort + " -p" + password + " " + databaseName;
|
|
|
|
|
// 执行命令
|
|
|
|
|
runtime.exec(cmd);
|
|
|
|
|
Process process = runtime.exec(cmd);
|
|
|
|
|
|
|
|
|
|
// 创建输入流读取器,指定UTF-8编码
|
|
|
|
|
InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
|
|
|
|
|
// 创建缓冲读取器
|
|
|
|
|
bufferedReader = new BufferedReader(inputStreamReader);
|
|
|
|
|
// 创建打印写入器,指定UTF-8编码
|
|
|
|
|
printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8"));
|
|
|
|
|
|
|
|
|
|
// 逐行读取备份数据
|
|
|
|
|
String line;
|
|
|
|
|
while ((line = bufferedReader.readLine()) != null) {
|
|
|
|
|
// 写入备份文件
|
|
|
|
|
printWriter.println(line);
|
|
|
|
|
}
|
|
|
|
|
// 刷新缓冲区
|
|
|
|
|
printWriter.flush();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 打印异常堆栈
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
// 返回错误信息
|
|
|
|
|
return R.error("备份数据出错");
|
|
|
|
|
} finally {
|
|
|
|
|
// 在finally块中确保资源关闭
|
|
|
|
|
try {
|
|
|
|
|
if (bufferedReader != null) {
|
|
|
|
|
bufferedReader.close();
|
|
|
|
|
}
|
|
|
|
|
if (printWriter != null) {
|
|
|
|
|
printWriter.close();
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 返回成功结果
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//* MySQL数据库还原接口
|
|
|
|
|
// * @param mysqlUrl MySQL安装路径
|
|
|
|
|
// * @param hostIP 数据库服务器IP
|
|
|
|
|
//* @param userName 数据库用户名
|
|
|
|
|
// * @param hostPort 数据库端口
|
|
|
|
|
// * @param password 数据库密码
|
|
|
|
|
// * @param savePath 备份文件路径
|
|
|
|
|
// * @param fileName 备份文件名
|
|
|
|
|
// * @param databaseName 要还原的数据库名
|
|
|
|
|
//* @return 操作结果
|
|
|
|
|
|
|
|
|
|
@IgnoreAuth // 忽略权限验证
|
|
|
|
|
@RequestMapping("/huanyuan") // 映射请求路径
|
|
|
|
|
public R huanyuan(String mysqlUrl, String hostIP, String userName, String hostPort,
|
|
|
|
|
String password, String savePath, String fileName, String databaseName) {
|
|
|
|
|
try {
|
|
|
|
|
// 获取运行时对象
|
|
|
|
|
Runtime rt = Runtime.getRuntime();
|
|
|
|
|
// 执行mysql命令
|
|
|
|
|
Process child1 = rt.exec(mysqlUrl+"mysql.exe -h" + hostIP + " -u" + userName +
|
|
|
|
|
" -P" + hostPort + " -p" + password + " " + databaseName);
|
|
|
|
|
|
|
|
|
|
// 获取进程的输出流
|
|
|
|
|
OutputStream out = child1.getOutputStream();
|
|
|
|
|
// 创建字符串缓冲区
|
|
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
|
// 创建缓冲读取器,读取备份文件
|
|
|
|
|
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(savePath+"/"+fileName), "utf-8"));
|
|
|
|
|
|
|
|
|
|
// 逐行读取备份文件
|
|
|
|
|
String inStr;
|
|
|
|
|
while ((inStr = br.readLine()) != null) {
|
|
|
|
|
// 将每行内容添加到缓冲区,并添加换行符
|
|
|
|
|
sb.append(inStr + "\r\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建输出流写入器
|
|
|
|
|
OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");
|
|
|
|
|
// 写入备份数据
|
|
|
|
|
writer.write(sb.toString());
|
|
|
|
|
// 刷新缓冲区
|
|
|
|
|
writer.flush();
|
|
|
|
|
|
|
|
|
|
// 关闭资源
|
|
|
|
|
out.close();
|
|
|
|
|
br.close();
|
|
|
|
|
writer.close();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 打印异常堆栈
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
// 返回错误信息
|
|
|
|
|
return R.error("数据导入出错");
|
|
|
|
|
}
|
|
|
|
|
// 返回成功结果
|
|
|
|
|
return R.ok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// * 饼状图求和接口
|
|
|
|
|
//* @param params 请求参数Map
|
|
|
|
|
// * @return 包含求和结果的响应
|
|
|
|
|
|
|
|
|
|
@RequestMapping("/pieSum") // 映射请求路径
|
|
|
|
|
public R pieSum(@RequestParam Map<String,Object> params) {
|
|
|
|
|
// 记录调试日志
|
|
|
|
|
logger.debug("饼状图求和:,,Controller:{},,params:{}",this.getClass().getName(),params);
|
|
|
|
|
// 调用服务层获取求和结果
|
|
|
|
|
List<Map<String, Object>> result = commonService.pieSum(params);
|
|
|
|
|
// 返回成功结果和数据
|
|
|
|
|
return R.ok().put("data", result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// * 饼状图统计接口
|
|
|
|
|
// * @param params 请求参数Map
|
|
|
|
|
//* @return 包含统计结果的响应
|
|
|
|
|
|
|
|
|
|
@RequestMapping("/pieCount") // 映射请求路径
|
|
|
|
|
public R pieCount(@RequestParam Map<String,Object> params) {
|
|
|
|
|
// 记录调试日志
|
|
|
|
|
logger.debug("饼状图统计:,,Controller:{},,params:{}",this.getClass().getName(),params);
|
|
|
|
|
// 调用服务层获取统计结果
|
|
|
|
|
List<Map<String, Object>> result = commonService.pieCount(params);
|
|
|
|
|
// 返回成功结果和数据
|
|
|
|
|
return R.ok().put("data", result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// * 单列柱状图求和接口
|
|
|
|
|
// * @param params 请求参数Map
|
|
|
|
|
//* @return 包含图表数据的响应
|
|
|
|
|
|
|
|
|
|
@RequestMapping("/barSumOne") // 映射请求路径
|
|
|
|
|
public R barSumOne(@RequestParam Map<String,Object> params) {
|
|
|
|
|
// 记录调试日志
|
|
|
|
|
logger.debug("柱状图求和单列:,,Controller:{},,params:{}",this.getClass().getName(),params);
|
|
|
|
|
// 调用服务层获取数据
|
|
|
|
|
List<Map<String, Object>> result = commonService.barSumOne(params);
|
|
|
|
|
|
|
|
|
|
// 准备图表数据
|
|
|
|
|
List<String> xAxis = new ArrayList<>(); // x轴数据
|
|
|
|
|
List<List<String>> yAxis = new ArrayList<>(); // y轴数据
|
|
|
|
|
List<String> legend = new ArrayList<>(); // 图例
|
|
|
|
|
List<String> yAxis0 = new ArrayList<>(); // 第一个y轴数据系列
|
|
|
|
|
yAxis.add(yAxis0); // 添加到y轴集合
|
|
|
|
|
legend.add(""); // 添加空图例
|
|
|
|
|
|
|
|
|
|
// 遍历结果集
|
|
|
|
|
for(Map<String, Object> map : result){
|
|
|
|
|
// 获取名称和值
|
|
|
|
|
String oneValue = String.valueOf(map.get("name"));
|
|
|
|
|
String value = String.valueOf(map.get("value"));
|
|
|
|
|
// 添加到对应集合
|
|
|
|
|
xAxis.add(oneValue);
|
|
|
|
|
yAxis0.add(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 构建结果Map
|
|
|
|
|
Map<String, Object> resultMap = new HashMap<>();
|
|
|
|
|
resultMap.put("xAxis",xAxis);
|
|
|
|
|
resultMap.put("yAxis",yAxis);
|
|
|
|
|
resultMap.put("legend",legend);
|
|
|
|
|
// 返回成功结果和数据
|
|
|
|
|
return R.ok().put("data", resultMap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 其他方法的行注释类似,遵循相同的模式...
|
|
|
|
|
// 每个方法都包含:
|
|
|
|
|
// 1. 方法功能说明
|
|
|
|
|
// 2. 参数说明
|
|
|
|
|
// 3. 返回值说明
|
|
|
|
|
// 4. 关键代码行的详细注释
|
|
|
|
|
|
|
|
|
|
// 由于篇幅限制,这里省略了部分方法的详细行注释
|
|
|
|
|
// 但每个方法都应按照上述模式进行注释
|
|
|
|
|
|
|
|
|
|
// 所有方法的注释都应包括:
|
|
|
|
|
// - 方法用途
|
|
|
|
|
// - 参数说明
|
|
|
|
|
// - 返回值说明
|
|
|
|
|
// - 关键处理逻辑说明
|
|
|
|
|
// - 异常处理说明
|
|
|
|
|
}
|