Database.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\controller\admin\system\safety;
  12. use crmeb\exceptions\UploadFailException;
  13. use crmeb\services\MysqlBackupService;
  14. use think\App;
  15. use crmeb\basic\BaseController;
  16. use think\facade\Db;
  17. use think\facade\Env;
  18. /**
  19. * 数据库备份
  20. */
  21. class Database extends BaseController
  22. {
  23. protected $service;
  24. public function __construct(App $app)
  25. {
  26. parent::__construct($app);
  27. $config = array(
  28. 'level' => 5,//数据库备份卷大小
  29. 'compress' => 1,//数据库备份文件是否启用压缩 0不压缩 1 压缩
  30. );
  31. $this->service = new MysqlBackupService($config);
  32. }
  33. /**
  34. * 获取数据列表
  35. *
  36. * 本函数用于封装服务层的数据列表获取操作,并通过JSON格式返回成功响应。
  37. * 主要用于API接口开发,提供数据列表的获取功能,响应格式化由app('json')工具类处理。
  38. *
  39. * @return \Illuminate\Http\JsonResponse 返回一个JSON格式的成功响应,包含数据列表。
  40. */
  41. public function lst()
  42. {
  43. // 调用app('json')的success方法返回数据列表的成功响应
  44. return app('json')->success($this->service->dataList());
  45. }
  46. /**
  47. * 获取文件列表信息
  48. *
  49. * 本函数通过调用服务层的方法获取文件列表,然后对这些文件信息进行加工,
  50. * 最后以特定格式返回给前端。加工过程中,文件信息被重新组织以包含更多易读的细节,
  51. * 如文件大小显示为带'B'的字符串,以及为方便后续处理,添加了'backtime'字段。
  52. *
  53. * @return \Illuminate\Http\JsonResponse 文件列表的JSON响应
  54. */
  55. public function fileList()
  56. {
  57. // 从服务层获取文件列表
  58. $files = $this->service->fileList();
  59. $data = [];
  60. // 遍历文件列表,重新组织数据格式
  61. foreach ($files as $key => $t) {
  62. $data[] = [
  63. 'filename' => $t['filename'], // 文件名
  64. 'part' => $t['part'], // 文件部分(如果适用)
  65. 'size' => $t['size'] . 'B', // 文件大小,单位为字节
  66. 'compress' => $t['compress'], // 文件压缩状态
  67. 'backtime' => $key, // 原始数组的键,用作文件的备份时间戳
  68. 'time' => $t['time'], // 文件的时间戳
  69. ];
  70. }
  71. // 返回加工后的文件列表数据
  72. // krsort($data);//根据时间降序
  73. return app('json')->success($data);
  74. }
  75. /**
  76. * 获取数据库表的列详情
  77. * 本函数通过查询information_schema.columns表,来获取指定数据库表的列信息。
  78. * 这些信息包括列名、列类型、默认值、是否可为空、额外信息(如自增标识)以及列注释。
  79. *
  80. * @param string $name 表名
  81. * @return json 返回查询结果的JSON格式
  82. */
  83. public function detail($name)
  84. {
  85. // 从环境变量中获取当前使用的数据库名称
  86. $database = Env::get("database.database");
  87. // 执行SQL查询,获取指定表的列详细信息
  88. // SQL语句中拼接了表名和数据库名,以确保查询的准确性
  89. $result = Db::query("select COLUMN_NAME,COLUMN_TYPE,COLUMN_DEFAULT,IS_NULLABLE,EXTRA,COLUMN_COMMENT from information_schema.columns where table_name = '" . $name . "' and table_schema = '" . $database . "'");
  90. // 使用JSON工具类将查询结果包装成成功响应的JSON格式返回
  91. return app('json')->success($result);
  92. }
  93. /**
  94. * 备份指定的数据库表。
  95. *
  96. * 此方法接受一个表名的数组,逐个对表进行备份。如果表名不是数组,
  97. * 则认为是一个错误的情况。对于每个表,首先检查该表是否存在,
  98. * 如果不存在,则返回错误信息。如果表存在,则尝试进行备份。
  99. * 如果备份失败,将失败的表名记录下来。最后,根据备份是否全部成功,
  100. * 返回相应的成功或失败信息。
  101. *
  102. * @param array $name 表名的数组。
  103. * @return \Illuminate\Http\JsonResponse 返回JSON格式的响应,包含备份结果的信息。
  104. */
  105. public function backups($name)
  106. {
  107. // 初始化用于存储备份失败的表名的变量
  108. $data = [];
  109. // 检查$name是否为数组,如果是,逐个处理每个表名
  110. if (is_array($name)) {
  111. foreach ($name as $item) {
  112. // 检查表是否存在,如果不存在,返回错误信息
  113. if (!$this->detail($item))
  114. return app('json')->fail('不存在的表名');
  115. // 尝试备份表,如果备份失败且不是因为已存在,则将表名添加到$data
  116. $res = $this->service->backup($item, 0);
  117. if ($res == false && $res != 0) {
  118. $data .= $item . '|';
  119. }
  120. }
  121. }
  122. // 如果$data不为空,说明有备份失败的表,返回失败信息
  123. if ($data) return app('json')->fail('备份失败' . $data);
  124. // 如果$data为空,说明所有备份都成功,返回成功信息
  125. return app('json')->success('备份成功');
  126. }
  127. /**
  128. * 执行优化操作
  129. *
  130. * 本函数旨在调用服务层的优化功能,并返回一个表示优化成功的结果消息。
  131. * 通过传递优化目标的名称,可以对特定的优化任务进行触发。
  132. *
  133. * @param string $name 优化目标的名称。这是调用优化功能所必需的参数,用于指定要执行的优化任务。
  134. * @return Json 响应优化成功的消息。使用应用的JSON工具类生成成功消息的JSON响应。
  135. */
  136. public function optimize($name)
  137. {
  138. // 调用服务层的optimize方法,传入优化目标的名称,执行具体的优化操作。
  139. $this->service->optimize($name);
  140. // 返回一个表示优化成功的结果消息,使用应用的JSON工具类构建响应。
  141. return app('json')->success('优化成功');
  142. }
  143. /**
  144. * 修复指定名称的物品
  145. *
  146. * 本函数通过遍历传入的物品名称列表,并调用service层的repair方法,逐一尝试修复这些物品。
  147. * 它的设计目的是用于处理一批物品的修复操作,而不是单个物品的修复。
  148. *
  149. * @param array $name 物品名称的数组。每个元素代表一个需要修复的物品的名称。
  150. * @return string 返回一个表示修复成功的信息。使用了app('json')->success方法来生成标准化的成功响应。
  151. */
  152. public function repair($name)
  153. {
  154. // 遍历物品名称数组,对每个物品调用service层的修复方法
  155. foreach ($name as $item) {
  156. $this->service->repair($item);
  157. }
  158. // 返回修复成功的消息
  159. return app('json')->success('修复成功');
  160. }
  161. /**
  162. * 下载文件的方法
  163. *
  164. * 本方法旨在处理文件下载请求。它通过接收请求中的参数,获取对应的文件信息,
  165. * 并触发文件下载。如果下载过程中出现错误,将捕获异常并返回错误信息。
  166. *
  167. * @return mixed 返回文件下载流或错误信息
  168. */
  169. public function downloadFile()
  170. {
  171. try {
  172. // 从请求中获取文件名参数,并转换为整型
  173. $time = intval($this->request->param('feilname'));
  174. // 通过服务层获取指定时间的文件信息
  175. $file = $this->service->getFile('time', $time);
  176. // 解析文件信息,获取文件名
  177. $fileName = $file[0];
  178. // 触发文件下载
  179. return download($fileName, $time);
  180. } catch (UploadFailException $e) {
  181. // 捕获上传失败异常,返回下载失败的响应
  182. return app('json')->fail('下载失败');
  183. }
  184. }
  185. /**
  186. * 删除文件
  187. *
  188. * 本函数用于处理文件删除请求。它首先从请求中获取文件名的参数,
  189. * 然后调用服务层的方法删除该文件。如果删除成功,它将返回一个表示成功的JSON响应。
  190. *
  191. * @return \think\Response 成功删除文件后的JSON响应
  192. */
  193. public function deleteFile()
  194. {
  195. // 将请求中的文件名参数转换为整数
  196. $feilname = intval($this->request->param('feilname'));
  197. // 调用服务层的方法删除文件
  198. $files = $this->service->delFile($feilname);
  199. // 返回一个表示删除成功的JSON响应
  200. return app('json')->success('删除成功');
  201. }
  202. }