SystemDatabackup.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace app\admin\controller\system;
  3. use app\admin\controller\AuthController;
  4. use service\FormBuilder as Form;
  5. use think\Request;
  6. use service\JsonService as Json;
  7. use \tp5er\Backup;
  8. use think\Session;
  9. use think\Db;
  10. /**
  11. * 文件校验控制器
  12. * Class SystemDatabackup
  13. * @package app\admin\controller\system
  14. *
  15. */
  16. class SystemDatabackup extends AuthController
  17. {
  18. protected $DB;
  19. public function _initialize()
  20. {
  21. parent::_initialize();
  22. $config = array(
  23. 'path' => '.'.PUBILC_PATH.'backup/data/',
  24. //数据库备份路径
  25. 'part' => 20971520,
  26. //数据库备份卷大小
  27. 'compress' => 1,
  28. //数据库备份文件是否启用压缩 0不压缩 1 压缩
  29. 'level' => 5,
  30. );
  31. $this->DB = new Backup($config);
  32. }
  33. /**
  34. * 数据类表列表
  35. */
  36. public function index(){
  37. return $this->fetch();
  38. }
  39. /**
  40. * 获取数据库表
  41. * @param Request|null $request
  42. */
  43. public function tablelist(Request $request = null)
  44. {
  45. $db= $this->DB;
  46. return Json::result(0,'sucess',$db->dataList(),count($db->dataList()));
  47. }
  48. /**
  49. * 查看表结构
  50. * @param Request|null $request
  51. */
  52. public function seetable(Request $request = null)
  53. {
  54. $database = config("database.database");
  55. $tablename = $request->param('tablename');
  56. $res = Db::query("select * from information_schema.columns where table_name = '".$tablename."' and table_schema = '".$database."'" );
  57. $html = '';
  58. $html .= '<table border="1" cellspacing="0" cellpadding="0" align="center">';
  59. $html .= '<tbody><tr><th>字段名</th><th>数据类型</th><th>默认值</th><th>允许非空</th><th>自动递增</th><th>备注</th></tr>';
  60. $html .= '';
  61. foreach($res AS $f)
  62. {
  63. $html .= '<td class="c1">' . $f['COLUMN_NAME'] . '</td>';
  64. $html .= '<td class="c2">' . $f['COLUMN_TYPE'] . '</td>';
  65. $html .= '<td class="c3">' . $f['COLUMN_DEFAULT'] . '</td>';
  66. $html .= '<td class="c4">' . $f['IS_NULLABLE'] . '</td>';
  67. $html .= '<td class="c5">' . ($f['EXTRA'] == 'auto_increment'?'是':' ') . '</td>';
  68. $html .= '<td class="c6">' . $f['COLUMN_COMMENT'] . '</td>';
  69. $html .= '</tr>';
  70. }
  71. $html .= '</tbody></table></p>';
  72. $html .= '<p style="text-align:left;margin:20px auto;">总共:' . count($res) . '个字段</p>';
  73. $html .= '</body></html>';
  74. echo '<style>
  75. body,td,th {font-family:"宋体"; font-size:12px;}
  76. table,h1,p{width:960px;margin:0px auto;}
  77. table{border-collapse:collapse;border:1px solid #CCC;background:#efefef;}
  78. table caption{text-align:left; background-color:#fff; line-height:2em; font-size:14px; font-weight:bold; }
  79. table th{text-align:left; font-weight:bold;height:26px; line-height:26px; font-size:12px; border:1px solid #CCC;padding-left:5px;}
  80. table td{height:20px; font-size:12px; border:1px solid #CCC;background-color:#fff;padding-left:5px;}
  81. .c1{ width: 150px;}
  82. .c2{ width: 150px;}
  83. .c3{ width: 80px;}
  84. .c4{ width: 100px;}
  85. .c5{ width: 100px;}
  86. .c6{ width: 300px;}
  87. </style>';
  88. echo $html;
  89. }
  90. /**
  91. * 优化表
  92. * @param Request|null $request
  93. */
  94. public function optimize(Request $request = null)
  95. {
  96. $tables = $request->post('tables/a');
  97. $db= $this->DB;
  98. $res = $db->optimize($tables);
  99. return Json::successful($res ? '优化成功':'优化失败');
  100. }
  101. /**修复表
  102. * @param Request|null $request
  103. */
  104. public function repair(Request $request = null)
  105. {
  106. $tables = $request->post('tables/a');
  107. $db = $this->DB;
  108. $res = $db->repair($tables);
  109. return Json::successful($res ? '修复成功':'修复失败');
  110. }
  111. /**备份表
  112. * @param Request|null $request
  113. */
  114. public function backup(Request $request = null)
  115. {
  116. $tables = $request->post('tables/a');
  117. $db= $this->DB;
  118. $data = '';
  119. foreach ($tables as $t){
  120. $res = $db->backup($t,0);
  121. if($res == false && $res != 0){
  122. $data .= $t.'|';
  123. }
  124. }
  125. return Json::successful($data? '备份失败'.$data:'备份成功');
  126. }
  127. /**获取备份记录表
  128. */
  129. public function fileList()
  130. {
  131. $db = $this->DB;
  132. $files = $db->fileList();
  133. $data = [];
  134. foreach ($files as $key=>$t){
  135. $data[$key]['filename'] = $t['filename'];
  136. $data[$key]['part'] = $t['part'];
  137. $data[$key]['size'] = $t['size'].'B';
  138. $data[$key]['compress'] = $t['compress'];
  139. $data[$key]['backtime'] = $key;
  140. $data[$key]['time'] = $t['time'];
  141. }
  142. krsort($data);//根据时间降序
  143. return Json::result(0,'sucess',$data,count($data));
  144. }
  145. /**删除备份记录表
  146. * @param Request|null $request
  147. */
  148. public function delFile(Request $request = null)
  149. {
  150. $feilname = intval($request->post('feilname'));
  151. $files = $this->DB->delFile($feilname);
  152. return Json::result(0,'sucess');
  153. }
  154. /**倒入备份记录表
  155. * @param Request|null $request
  156. */
  157. public function import(Request $request = null)
  158. {
  159. $part = $request->post('part') != '' ? intval($request->post('part')) :null;
  160. $start = $request->post('start') != '' ? intval($request->post('start')) : null;
  161. $time = intval($request->post('time'));
  162. $db = $this->DB;
  163. if(is_numeric($time) && is_null($part) && is_null($start)){
  164. $list= $db->getFile('timeverif',$time);
  165. if(is_array($list)){
  166. session::set('backup_list',$list);
  167. $this->success('初始化完成!','',array('part' =>1,'start'=>0));
  168. }else{
  169. $this->error('备份文件可能已经损坏,请检查!');
  170. }
  171. }else if(is_numeric($part)&&is_numeric($start)){
  172. $list=session::get('backup_list');
  173. $start=$db->setFile($list)->import($start);
  174. if(false===$start){
  175. $this->error('还原数据出错!');
  176. }elseif(0===$start){
  177. if(isset($list[++$part])){
  178. $data=array('part'=>$part,'start'=>0);
  179. $this->success("正在还原...#{$part}",'',$data);
  180. }else{
  181. session::delete('backup_list');
  182. $this->success('还原完成!');
  183. }
  184. }else{
  185. $data=array('part'=>$part,'start'=>$start[0]);
  186. if($start[1]){
  187. $rate=floor(100*($start[0]/$start[1]));
  188. $this->success("正在还原...#{$part}({$rate}%)",'',$data);
  189. }else{
  190. $data['gz']=1;
  191. $this->success("正在还原...#{$part}",'',$data);
  192. }
  193. $this->success("正在还原...#{$part}",'');
  194. }
  195. }else{
  196. $this->error('参数错误!');
  197. }
  198. // return Json::result(0,'sucess',$data,count($data));
  199. }
  200. /**下载备份记录表
  201. * @param Request|null $request
  202. */
  203. public function downloadFile(Request $request = null)
  204. {
  205. $time = intval($request->param('feilname'));
  206. $this->DB->downloadFile($time);
  207. }
  208. }