backups.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <?php
  2. use common\helpers\Url;
  3. use common\helpers\Auth;
  4. $this->title = '数据备份';
  5. $this->params['breadcrumbs'][] = ['label' => $this->title];
  6. ?>
  7. <div class="row">
  8. <div class="col-sm-12">
  9. <div class="nav-tabs-custom">
  10. <ul class="nav nav-tabs">
  11. <li class="active"><a href="<?= Url::to(['backups']) ?>"> 数据表列表</a></li>
  12. <li class="hide"><a href="<?= Url::to(['restore']) ?>"> 数据还原</a></li>
  13. </ul>
  14. <div class="tab-content">
  15. <div class="active tab-pane">
  16. <div class="col-sm-12 normalPaddingJustV">
  17. <div class="btn-group m-l-n-sm">
  18. <!-- 权限校验 -->
  19. <?php if (Auth::verify('/rf-dev-tool/data-base/export')) { ?>
  20. <a class="btn btn-white table-list-database hide" href="javascript:void(0);" data-type="1">立即备份</a>
  21. <?php } ?>
  22. <!-- 权限校验 -->
  23. <?php if (Auth::verify('/rf-dev-tool/data-base/repair')) { ?>
  24. <a class="btn btn-white table-list-database" href="javascript:void(0);" data-type="2">修复表</a>
  25. <?php } ?>
  26. <!-- 权限校验 -->
  27. <?php if (Auth::verify('/rf-dev-tool/data-base/optimize')) { ?>
  28. <a class="btn btn-white table-list-database" href="javascript:void(0);" data-type="3">优化表</a>
  29. <?php } ?>
  30. <!-- 权限校验 -->
  31. <?php if (Auth::verify('/rf-dev-tool/data-base/data-dictionary')) { ?>
  32. <a class="btn btn-white dictionary" href="javascript:void(0);">Markdown数据字典</a>
  33. <?php } ?>
  34. </div>
  35. </div>
  36. <table class="table table-hover">
  37. <thead>
  38. <tr>
  39. <th><input type="checkbox" checked="checked" class="check-all"></th>
  40. <th>表备注</th>
  41. <th>表名</th>
  42. <th>类型</th>
  43. <th>记录总数</th>
  44. <th>数据大小</th>
  45. <th>编码</th>
  46. <!-- <th>创建时间</th>-->
  47. <!-- <th>备份状态</th>-->
  48. <th>操作</th>
  49. </tr>
  50. </thead>
  51. <tbody id="list">
  52. <?php foreach ($models as $model) { ?>
  53. <tr data-name="<?= $model['name'] ?>">
  54. <td><input type="checkbox" name="table[]" checked="checked" value="<?= $model['name'] ?>"></td>
  55. <td data-table="<?= $model['name'] ?>">
  56. <span class="table <?= $model['name'] ?>"><?= $model['comment'] ?></span> <i class="icon ion-compose" data-toggle="modal" data-target="#editTitle"></i>
  57. </td>
  58. <td><?= $model['name'] ?></td>
  59. <td><?= $model['engine'] ?></td>
  60. <td><?= $model['rows'] ?></td>
  61. <td><?= Yii::$app->formatter->asShortSize($model['data_length'], 0) ?></td>
  62. <td><?= $model['collation'] ?></td>
  63. <!-- <td>--><?php //$model['create_time'] ?><!--</td>-->
  64. <!--<td id="--><?php //// = $model['name'] ?><!--">未备份</td>-->
  65. <td>
  66. <!-- 权限校验 -->
  67. <?php if (Auth::verify('/rf-dev-tool/data-base/optimize')) { ?>
  68. <a href="#" class="btn btn-white table-list-optimize">优化表</a>
  69. <?php } ?>
  70. <!-- 权限校验 -->
  71. <?php if (Auth::verify('/rf-dev-tool/data-base/repair')) { ?>
  72. <a href="#" class="btn btn-white table-list-repair">修复表</a>
  73. <?php } ?>
  74. </td>
  75. </tr>
  76. <?php } ?>
  77. </tbody>
  78. </table>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. <div class="modal fade" id="editTitle" aria-hidden="true">
  85. <div class="modal-dialog">
  86. <div class="modal-content">
  87. <div class="modal-header">
  88. <h4 class="modal-title">表备注</h4>
  89. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
  90. </div>
  91. <div class="modal-body">
  92. <textarea type="text" class="form-control" id="tableComment"></textarea>
  93. </div>
  94. <div class="modal-footer">
  95. <button type="button" class="btn btn-white" data-dismiss="modal">关闭</button>
  96. <button class="btn btn-primary submit-name" data-dismiss="modal">确定</button>
  97. </div>
  98. </div>
  99. </div>
  100. </div>
  101. <script type="text/javascript">
  102. $(document).ready(function () {
  103. var tablename = [];
  104. // dataType = 1:备份;2:修复;3:优化
  105. $(".table-list-database").click(function () {
  106. tablename = [];
  107. $("#list :checkbox").each(function () {
  108. if (this.checked) {
  109. var table = $(this).val();
  110. tablename.push(table);
  111. }
  112. });
  113. var dataType = $(this).attr('data-type');
  114. if (dataType == 1) {
  115. rfAffirm('备份中,请不要关闭本页面');
  116. Export();
  117. } else if (dataType == 2) {
  118. rfAffirm('修复中,请不要关闭本页面');
  119. repair();
  120. } else if (dataType == 3) {
  121. rfAffirm('优化中,请不要关闭本页面');
  122. optimize();
  123. }
  124. $('#reminder').show();
  125. });
  126. // 优化表单击
  127. $(".table-list-optimize").click(function () {
  128. tablename = $(this).parent().parent().data('name');
  129. rfAffirm('优化中,请不要关闭本页面');
  130. optimize();
  131. });
  132. // 修复表表单击
  133. $(".table-list-repair").click(function () {
  134. tablename = $(this).parent().parent().data('name');
  135. repair();
  136. });
  137. // 备份表
  138. function Export() {
  139. tablename = [];
  140. $("#list :checkbox").each(function () {
  141. if (this.checked) {
  142. var table = $(this).val();
  143. tablename.push(table);
  144. }
  145. });
  146. $.ajax({
  147. type: "post",
  148. url: "<?= Url::to(['export'])?>",
  149. dataType: 'json',
  150. data: {tables: tablename},
  151. success: function (data) {
  152. if (data.code == 200) {
  153. var id = data.data.tab.id;
  154. var start = data.data.tab.start;
  155. startExport(id, start);
  156. } else {
  157. rfAffirm(data.message);
  158. }
  159. }
  160. })
  161. }
  162. // 开始备份
  163. function startExport(id, start) {
  164. $.ajax({
  165. type: "post",
  166. url: "<?= Url::to(['export-start'])?>",
  167. dataType: 'json',
  168. data: {id: id, start: start},
  169. success: function (data) {
  170. if (data.code == 200) {
  171. var achieveStatus = data.data.achieveStatus;
  172. var tabName = data.data.tablename;
  173. $("#" + tabName).text(data.message);
  174. if (achieveStatus == 0) {
  175. startExport(data.data.tab.id, data.data.tab.start);
  176. } else {
  177. rfAffirm(data.message);
  178. }
  179. } else {
  180. }
  181. }
  182. })
  183. }
  184. // 优化表
  185. function optimize() {
  186. $.ajax({
  187. type: "post",
  188. url: "<?= Url::to(['optimize'])?>",
  189. dataType: 'json',
  190. data: {tables: tablename},
  191. success: function (data) {
  192. rfAffirm(data.message);
  193. }
  194. })
  195. }
  196. // 修复表
  197. function repair() {
  198. $.ajax({
  199. type: "post",
  200. url: "<?= Url::to(['repair'])?>",
  201. dataType: 'json',
  202. data: {tables: tablename},
  203. success: function (data) {
  204. rfAffirm(data.message);
  205. }
  206. })
  207. }
  208. $(".dictionary").click(function () {
  209. $.ajax({
  210. type: "get",
  211. url: "<?= Url::to(['data-dictionary'])?>",
  212. dataType: 'json',
  213. success: function (data) {
  214. //自定页
  215. layer.open({
  216. type: 1,
  217. title: '数据字典',
  218. skin: 'layui-layer-demo', //样式类名
  219. closeBtn: false, //不显示关闭按钮
  220. shift: 2,
  221. area: ['400px', '80%'],
  222. shadeClose: true, //开启遮罩关闭
  223. content: data.data.str
  224. });
  225. }
  226. })
  227. });
  228. // 多选框选择
  229. $(".check-all").click(function () {
  230. if (this.checked) {
  231. $("#list :checkbox").prop("checked", true);
  232. } else {
  233. $("#list :checkbox").prop("checked", false);
  234. }
  235. });
  236. })
  237. var table;
  238. $(document).on("click",".ion-compose",function(){
  239. table = $(this).parent().data('table');
  240. var comment = $(this).parent().find('.table').text();
  241. $('#tableComment').val(comment);
  242. });
  243. // 标题编辑
  244. $(document).on("click",".submit-name",function(){
  245. var comment = $('#tableComment').val();
  246. url = "<?= Url::to(['update-table-comment'])?>" + '?table=' + table + '&comment=' + comment;
  247. $.ajax({
  248. type: "post",
  249. url: url,
  250. dataType: "json",
  251. success: function (data) {
  252. if (parseInt(data.code) === 200) {
  253. $('.' + table).text(comment);
  254. rfMsg('修改成功');
  255. } else {
  256. rfWarning(data.message);
  257. }
  258. }
  259. });
  260. });
  261. </script>
粤ICP备19079148号