Browse Source

版本恢复

moshaorui 4 months ago
parent
commit
344e65e797

+ 18 - 0
app/Admin/Controllers/DistAppearanceTemplateController.php

@@ -6,6 +6,7 @@ use App\Admin\Repositories\DistAdminDistributor;
 use App\Admin\Repositories\DistAppearance;
 use App\Admin\Repositories\DistAppearancePublishList;
 use App\Admin\Repositories\DistAppearanceTemplate;
+use App\Admin\Repositories\DistAppearanceTemplateLog;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
@@ -66,6 +67,23 @@ class DistAppearanceTemplateController extends AdminController
                 $distId = $request->get('dist_id');
                 $row = DistAdminDistributor::getOneById($distId);
                 return $row ? $row->appearance_id : '';
+            } else if ($request->get('act') == 'fetch_template_logs') {
+                //返回模版修改日志
+                $fileId = $request->get('file_id');
+                $appearanceId = $request->get('appearance_id');
+                $distId = $request->get('dist_id');
+                $rows = DistAppearanceTemplateLog::fetchTemplateLogs($appearanceId,$distId,$fileId);
+                return response()->json($rows);
+            } else if ($request->get('act') == 'fetch_template_log_content') {
+                //返回模版修改日志内容
+                $logId = $request->get('log_id');
+                $rows = DistAppearanceTemplateLog::fetchTemplateLogContent($logId);
+                return response()->json($rows);
+            } else if ($request->get('act') == 'restore_template_log') {
+                //还原模版修改日志
+                $logId = $request->get('log_id');
+                DistAppearanceTemplateLog::restoreTemplateLog($logId);
+                return ['status'=>1];
             }
         }
 

+ 34 - 0
app/Admin/Repositories/DistAppearanceTemplateLog.php

@@ -33,4 +33,38 @@ class DistAppearanceTemplateLog extends EloquentRepository
         $model->save();
     }
 
+    /*
+     *  获取模版修改日志
+     */
+    public static function fetchTemplateLogs($appearanceId,$distId,$templateCode)
+    {
+        $model = new Model();
+        $model = $model->where('appearance_id','=',$appearanceId)->where('dist_id','=',$distId)->where('template_code','=',$templateCode)->orderBy('id','desc')->select('id','version','created_at')->get();
+        return $model;
+    }
+
+    /*
+     *  获取单条模版修改日志内容
+     */
+    public static function fetchTemplateLogContent($logId)
+    {
+        $model = new Model();
+        $model = $model->where('id','=',$logId)->first();
+        return $model;
+    }
+    /*
+     * 还原模版
+     */
+    public static function restoreTemplateLog($logId) {
+        $model = new Model();
+        $model = $model->where('id', '=', $logId)->first();
+        if ($model) {
+            $appearanceId = $model->appearance_id;
+            $distId = $model->dist_id;
+            $templateCode = $model->template_code;
+            $content = $model->previous_content;
+            DistAppearanceTemplate::saveContent($appearanceId, $distId, $templateCode, $content);
+        }
+    }
+
 }

+ 161 - 2
resources/views/admin/pages-custom/ace.blade.php

@@ -119,6 +119,12 @@
     .btn-warning.disabled, .btn-warning:disabled {
         color: #ffffff;
     }
+    .modal-body {
+        background-color: #ffffff;
+    }
+    .selected-row {
+        background-color: rgba(221, 251, 239, 0.56);
+    }
 </style>
 </style>
 
@@ -135,6 +141,8 @@
                 <button type="button" class="btn btn-info btn-sm" id="save-btn" disabled>Save</button>
                 <button type="button" class="btn btn-warning btn-sm" data-toggle="modal" id="variable-btn" data-target="#iframeModal" disabled>Variable</button>
                 <button type="button" class="btn btn-success btn-sm" id="publish-btn" disabled>Publish</button>
+
+                <button type="button" class="btn btn-info btn-sm float-right" id="history-btn"  disabled>History</button>
             </div>
             <div class="main-panel-content" id="editor" style="width: 100%; height: 100%;"></div>
             <input type="hidden" name="template_id"  id="template_id" />
@@ -190,6 +198,44 @@
     </div>
 </div>
 
+<!-- Bootstrap Modal -->
+<div class="modal fade" id="templateLogModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+    <div class="modal-dialog modal-xl" role="document" >
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="exampleModalLabel">Template Logs</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body" style="height: 600px;">
+                <div class="row" style="height: 100%;">
+                    <!-- 左侧显示 Previous Content -->
+                    <div class="col-md-8">
+                        <h5>Content</h5>
+                        <textarea id="contentDetails" style="height: 550px; overflow-y: auto; border: 1px solid #ededed; padding: 10px;width: 100%;"></textarea>
+                    </div>
+                    <!-- 右侧显示 Version 和 Created At 列表 -->
+                    <div class="col-md-4">
+                        <h5>Version</h5>
+                        <table class="table table-condensed table-hover">
+                            <tbody id="templateLogTableBody">
+                            <!-- 动态生成的列表 -->
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <input type="hidden" id="templateLogId" name="templateLogId"/>
+                <input type="hidden" id="templateVersion" name="templateVersion"/>
+                <button type="button" class="btn btn-success" id="restoreTemplateLog">Restore Version</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 
 <script src="/vendor/ace/ace.js" type="text/javascript"></script>
 <script>
@@ -213,6 +259,7 @@
             $('#save-btn').prop('disabled', status);
             $('#variable-btn').prop('disabled', status);
             $('#publish-btn').prop('disabled', status);
+            $('#history-btn').prop('disabled', status);
         }
 
         var changeIframeUrl = function() {
@@ -446,7 +493,7 @@
                 }
             });
         }
-
+        //代码树新增
         $("#addFileButton").click(function () {
             var filePathName = $('#file_path_name').val();
             var fileInputName = $('#file_name_input').val();
@@ -462,7 +509,7 @@
             $('#addFileModal').modal('hide');
             ajaxAddDelFile(appearanceId,distId,0,filePathName,fileInputName,'add');
         });
-
+        //代码树删除
         function delFileButtonClick() {
                 $(".delFileButton").click(function () {
                     var filePathName = "";
@@ -480,7 +527,119 @@
                     });
                 });
         }
+        //历史记录弹窗
+        $("#history-btn").click(function () {
+            loadingIndex = layer.load(1, {
+                shade: [0.5, '#000'] // 设置遮罩层
+            });
+            var appearanceId = $('select[name="appearance_id"]').val();
+            var distId = $('input[name="dist_id"]').val();
+            if (fileId == '') {
+                Dcat.error('操作失败:请先选择模板');
+                return false;
+            }
+            $.ajax({
+                url: '/prime-control/dist-template/ace',
+                method: 'POST',
+                data: {
+                    act: 'fetch_template_logs',
+                    file_id: fileId,
+                    dist_id: distId,
+                    appearance_id: appearanceId,
+                },
+                success: function(data) {
+                    const tableBody = $('#templateLogTableBody');
+                    tableBody.empty();
+
+                    data.forEach(log => {
+                        const row = `<tr log_id="${log.id}">
+                                <td>版本:${log.version} <br /> ${log.created_at}</td>
+                             </tr>`;
+                        tableBody.append(row);
+                    });
 
+                    layer.close(loadingIndex);
+                    // Show modal
+                    $('#templateLogModal').modal('show');
+
+                },
+                error: function(error) {
+                    layer.close(loadingIndex);
+                    alert('Error fetching data!');
+                }
+            });
+        });
+        //显示历史记录内容
+        $(document).on('click', '#templateLogTableBody tr', function() {
+            loadingIndex = layer.load(1, {
+                shade: [0.5, '#000'] // 设置遮罩层
+            });
+            // 移除其他行的选中样式
+            $('#templateLogTableBody tr').removeClass('selected-row');
+            // 当前点击行添加选中样式
+            $(this).addClass('selected-row');
+            //
+            var logId = $(this).attr('log_id');
+            var appearanceId = $('select[name="appearance_id"]').val();
+            var distId = $('input[name="dist_id"]').val();
+            $.ajax({
+                url: '/prime-control/dist-template/ace',
+                method: 'POST',
+                data: {
+                    act: 'fetch_template_log_content',
+                    log_id: logId,
+                    dist_id: distId,
+                    appearance_id: appearanceId,
+                },
+                success: function(data) {
+                    layer.close(loadingIndex);
+                    $('#contentDetails').html(data.previous_content);
+                    $("#templateLogId").val(data.id);
+                },
+                error: function(error) {
+                    layer.close(loadingIndex);
+                    alert('Error fetching data!');
+                }
+            });
+        });
+        $("#restoreTemplateLog").click(function () {
+            var logId = $("#templateLogId").val();
+            var templateVersion = $("#templateVersion").val();
+            //确认框
+            msg = '确定恢复'+templateVersion+'版本吗?';
+            Dcat.confirm('确定恢复',msg , function () {
+                loadingIndex = layer.load(1, {
+                    shade: [0.5, '#000'] // 设置遮罩层
+                });
+                //ajax
+                $.ajax({
+                    url: '/prime-control/dist-template/ace',
+                    method: 'POST',
+                    data: {
+                        act:'restore_template_log',
+                        log_id: logId,
+                    },
+                    success: function(data) {
+                        layer.close(loadingIndex);
+                        if (data.status == '1') {
+                            Dcat.success('恢复成功');
+                            //关闭弹窗
+                            $('#templateLogModal').modal('hide');
+                            //请空编辑器内容
+                            editor.setValue('');
+                            //刷新代码树
+                            postData();
+                        }else{
+                            Dcat.error(data.msg);
+                        }
+                    },
+                    error: function(error) {
+                        layer.close(loadingIndex);
+                        alert('Error fetching data!');
+                    }
+                });
+            });
+        });
     });
 </script>