• home > php > phpcms >

    ueditor使用indexBD缓存草稿——多重防护编辑内容丢失

    Author:zhoulujun Date:

    使用indexDB保存数据相比localstorage保存的更多,同时也可以保存于后台数据库表一直的结构。文章的草稿不怕丢失,同时有可以查看之前的修

    本站phpcms使用ueditor编辑文件,phpcms登录失效了,会自动刷新编辑页面,这个时候之前辛辛苦苦的编辑内容,全部作废

    虽然ueditor等编辑会自动保存草稿到到localstorage,但是如过你此篇文章未编辑完成,又编辑了其他文章,那么ueditor的草稿会被覆盖

    所以,首先用indexDB,保所有的编辑内容,缓存到数据库。然后,用ajax去提交表单。

    这样,文件草稿内容就不怕丢失了

    indexDB保存草稿

    草稿保存到indexDB

    var dataBaseIndexDB;  // 统一使用db变量存储数据库实例
    // 初始化数据库
    try {
      var request = indexedDB.open('ueditor', 1);
    
      request.onupgradeneeded = function (event) {
        dataBaseIndexDB = event.target.result;
        // 创建对象存储(如果不存在)
        if (!dataBaseIndexDB.objectStoreNames.contains('v9_news_data')) {
          dataBaseIndexDB.createObjectStore('v9_news_data', { keyPath: 'id' });
        }
      };
    
      request.onsuccess = function (event) {
        dataBaseIndexDB = event.target.result;
        console.log("数据库打开成功!");
      };
    
      request.onerror = function (event) {
        console.error("数据库打开失败:", event.target.error);
      };
    } catch (e) {
      console.log(e)
    }
    var titleInput = document.getElementById('title')
    var keywordsInput = document.getElementById('keywords')
    var descriptionInput = document.getElementById('description')
    
    function saveToIndexDB(content) {  // 添加参数接收
      if (!dataBaseIndexDB) {
        console.error("数据库尚未初始化完成");
        return;
      }
    
      // 使用正确的对象存储名称
      const transaction = dataBaseIndexDB.transaction('v9_news_data', 'readwrite');
      const store = transaction.objectStore('v9_news_data');
    
      const request = store.put(content);
    
      request.onsuccess = () => {
        console.log("数据保存成功:");
      };
    
      request.onerror = (event) => {
        console.error("保存失败:");
      };
    
      // 监听事务完成
      transaction.oncomplete = () => {
        console.log("事务已完成");
      };
    }
    var tempContentId = Math.random().toString(3,10);
    var searchParams = new URLSearchParams(window.location.search)
    var contentId = searchParams.get('id')
    function addContent(content) {
      var id = contentId
      if (!id) {
        id = tempContentId
      }
      var title = titleInput && titleInput.value;
      var keywords = keywordsInput && keywordsInput.value
      var description = descriptionInput && descriptionInput.value
      addContent({ id, content, title, keywords, description, time: new Date().getTime() })
    }
    function clearIndexContent(){
      if(!tempContentId){
        return
      }
      // TODO 清理indexDB
    }
    window.addEventListener('beforeunload ',clearIndexContent)

    其次,在

    phpcms/modules/content/templates/content_add.tpl.php 与 content_edit.tpl.php 修改refersh_window 

    <div class="fixed-but text-c">
       <div class="button"><input value="<?php echo L('save_close');?>" type="submit" name="dosubmit" class="cu" style="width:145px;" onclick="refersh_window()"></div>
       <div class="button"><input value="<?php echo L('save_continue');?>" type="submit" name="dosubmit_continue" class="cu" style="width:130px;" title="Alt+X" onclick="refersh_window()"></div>
       <div class="button"><input value="<?php echo L('c_close');?>" type="button" name="close" onclick="refersh_window();close_window();" class="cu" style="width:70px;"></div>
         </div>

    refersh_window  里面增加清楚缓存 或者保存缓存的方法

     Ajax 提交表单

    $('#myform').submit(function(e){
      e.preventDefault(); // 阻止默认表单提交
      
      // 创建 FormData 对象(支持文件上传)
      let formData = new FormData(this);
    
      $.ajax({
        url: $(this).attr('action'), // 保持原提交地址
        type: 'POST',
        data: formData,
        processData: false,  // 必须!避免jQuery处理FormData
        contentType: false,  // 必须!自动识别内容类型
        dataType: 'json',    // 期待返回JSON格式
        success: function(response) {
          if(response.status) {
            alert('保存成功');
            // 如果需要跳转(参考原系统逻辑)
            if(response.url){
              window.location.href = response.url;
            }
          } else {
            alert('保存失败: ' + response.message);
          }
        },
        error: function(xhr) {
          alert('请求异常,请检查网络');
        }
      });
    });
    </script>

    然后修改phpcms

    // 在对应控制器方法中(content::add)
    public function add() {
      // ...原有处理逻辑...
      
      // 改为判断ajax请求
      if($this->input->is_ajax_request()){
        if($result){ // 假设$result是保存结果
          echo json_encode(['status' => 1, 'message' => '成功', 'url' => $return_url]);
        }else{
          echo json_encode(['status' => 0, 'message' => $error]);
        }
        exit; // 结束输出
      }
      // 原有非ajax处理逻辑...
    }






    转载本站文章《ueditor使用indexBD缓存草稿——多重防护编辑内容丢失》,
    请注明出处:https://www.zhoulujun.cn/html/php/phpcms/2025_0310_9512.html