DatabaseLogic.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | saiadmin [ saiadmin快速开发框架 ]
  4. // +----------------------------------------------------------------------
  5. // | Author: sai <1430792918@qq.com>
  6. // +----------------------------------------------------------------------
  7. namespace plugin\saiadmin\app\logic\system;
  8. use plugin\saiadmin\basic\think\BaseLogic;
  9. use plugin\saiadmin\exception\ApiException;
  10. use support\think\Db;
  11. /**
  12. * 数据表维护逻辑层
  13. */
  14. class DatabaseLogic extends BaseLogic
  15. {
  16. /**
  17. * 获取数据源
  18. * @return array
  19. */
  20. public function getDbSource(): array
  21. {
  22. $data = config('think-orm.connections');
  23. $list = [];
  24. foreach ($data as $k => $v) {
  25. $list[] = $k;
  26. }
  27. return $list;
  28. }
  29. /**
  30. * 数据列表
  31. * @param $query
  32. * @return mixed
  33. */
  34. public function getList($query): mixed
  35. {
  36. $request = request();
  37. $page = $request ? ($request->input('page') ?: 1) : 1;
  38. $limit = $request ? ($request->input('limit') ?: 10) : 10;
  39. return self::getTableList($query, $page, $limit);
  40. }
  41. /**
  42. * 获取数据库表数据
  43. */
  44. public function getTableList($query, $current_page = 1, $per_page = 10): array
  45. {
  46. if (!empty($query['source'])) {
  47. if (!empty($query['name'])) {
  48. $sql = 'show table status where name=:name ';
  49. $list = Db::connect($query['source'])->query($sql, ['name' => $query['name']]);
  50. } else {
  51. $list = Db::connect($query['source'])->query('show table status');
  52. }
  53. } else {
  54. if (!empty($query['name'])) {
  55. $sql = 'show table status where name=:name ';
  56. $list = Db::query($sql, ['name' => $query['name']]);
  57. } else {
  58. $list = Db::query('show table status');
  59. }
  60. }
  61. $data = [];
  62. foreach ($list as $item) {
  63. $data[] = [
  64. 'name' => $item['Name'],
  65. 'engine' => $item['Engine'],
  66. 'rows' => $item['Rows'],
  67. 'data_free' => $item['Data_free'],
  68. 'data_length' => $item['Data_length'],
  69. 'index_length' => $item['Index_length'],
  70. 'collation' => $item['Collation'],
  71. 'create_time' => $item['Create_time'],
  72. 'update_time' => $item['Update_time'],
  73. 'comment' => $item['Comment'],
  74. ];
  75. }
  76. $total = count($data);
  77. $last_page = ceil($total / $per_page);
  78. $startIndex = ($current_page - 1) * $per_page;
  79. $pageData = array_slice($data, $startIndex, $per_page);
  80. return [
  81. 'data' => $pageData,
  82. 'total' => $total,
  83. 'current_page' => $current_page,
  84. 'per_page' => $per_page,
  85. 'last_page' => $last_page,
  86. ];
  87. }
  88. /**
  89. * 获取列信息
  90. */
  91. public function getColumnList($table, $source): array
  92. {
  93. $columnList = [];
  94. if (preg_match("/^[a-zA-Z0-9_]+$/", $table)) {
  95. if (!empty($source)) {
  96. $list = Db::connect($source)->query('SHOW FULL COLUMNS FROM `' . $table . '`');
  97. } else {
  98. $list = Db::query('SHOW FULL COLUMNS FROM `' . $table . '`');
  99. }
  100. foreach ($list as $column) {
  101. preg_match('/^\w+/', $column['Type'], $matches);
  102. $columnList[] = [
  103. 'column_key' => $column['Key'],
  104. 'column_name' => $column['Field'],
  105. 'column_type' => $matches[0],
  106. 'column_comment' => trim(preg_replace("/\([^()]*\)/", "", $column['Comment'])),
  107. 'extra' => $column['Extra'],
  108. 'default_value' => $column['Default'],
  109. 'is_nullable' => $column['Null'],
  110. ];
  111. }
  112. }
  113. return $columnList;
  114. }
  115. /**
  116. * 优化表
  117. */
  118. public function optimizeTable($tables)
  119. {
  120. foreach ($tables as $table) {
  121. if (preg_match("/^[a-zA-Z0-9_]+$/", $table)) {
  122. Db::execute('ANALYZE TABLE `' . $table . '`');
  123. }
  124. }
  125. }
  126. /**
  127. * 清理表碎片
  128. */
  129. public function fragmentTable($tables)
  130. {
  131. foreach ($tables as $table) {
  132. if (preg_match("/^[a-zA-Z0-9_]+$/", $table)) {
  133. Db::execute('OPTIMIZE TABLE `' . $table . '`');
  134. }
  135. }
  136. }
  137. /**
  138. * 获取回收站数据
  139. */
  140. public function recycleData($table)
  141. {
  142. if (preg_match("/^[a-zA-Z0-9_]+$/", $table)) {
  143. // 查询表字段
  144. $sql = 'SHOW COLUMNS FROM `' . $table . '` where Field = "delete_time"';
  145. $columns = Db::query($sql);
  146. $isDeleteTime = false;
  147. if (count($columns) > 0) {
  148. $isDeleteTime = true;
  149. }
  150. if (!$isDeleteTime) {
  151. throw new ApiException('当前表不支持回收站功能');
  152. }
  153. // 查询软删除数据
  154. $request = request();
  155. $limit = $request ? ($request->input('limit') ?: 10) : 10;
  156. return Db::table($table)->whereNotNull('delete_time')
  157. ->order('delete_time', 'desc')
  158. ->paginate($limit)
  159. ->toArray();
  160. } else {
  161. return [];
  162. }
  163. }
  164. /**
  165. * 删除数据
  166. * @param $table
  167. * @param $ids
  168. * @return bool
  169. */
  170. public function delete($table, $ids)
  171. {
  172. if (preg_match("/^[a-zA-Z0-9_]+$/", $table)) {
  173. $count = Db::table($table)->whereIn('id', $ids)->delete($ids);
  174. return $count > 0;
  175. } else {
  176. return false;
  177. }
  178. }
  179. /**
  180. * 恢复数据
  181. * @param $table
  182. * @param $ids
  183. * @return bool
  184. */
  185. public function recovery($table, $ids)
  186. {
  187. if (preg_match("/^[a-zA-Z0-9_]+$/", $table)) {
  188. $count = Db::table($table)
  189. ->where('id', 'in', $ids)
  190. ->update(['delete_time' => null]);
  191. return $count > 0;
  192. } else {
  193. return false;
  194. }
  195. }
  196. }