资讯专栏INFORMATION COLUMN

songEagle开发系列:如何科学有效的让博客文章实时保存

hatlonely / 3002人阅读

摘要:一写在前面如何实现文章的实时保存一般写文章的写博客的网站都会有这个功能点,这样保证了用户在不小心退出的情况下数据的保存下来,这样的交互比较符合用户的使用心理学。

一、写在前面

如何实现文章的实时保存?一般写文章的写博客的网站都会有这个功能点,这样保证了用户在不小心退出的情况下数据的保存下来,这样的交互比较符合用户的使用心理学。对于用户来说这是一个非常实用的功能,作为一个博客来说,有这个还是不错的。哈哈^_^

二、实现的思路

一个功能的实现,你的编程思路很重要,决定着你在coding之前的设计,思路就是你的编程设计。

使用webSocket来进行浏览器与服务器的实时通信

服务端使用redis来缓存实时的编辑的文章,因为编辑的时候文章会出现频繁的改动,频繁的读写数据库算不上一个科学合理的解决方案

服务端使用定时任务,目前设置的是每天的凌晨三点,将redis缓存的数据存储到mysql数据库中

浏览器初次进入到新增文章的页面的时候,使用websocket从服务端获取数据,首先从redis中查找有没有数据,没有数据再去mysql数据库中查找

浏览器初次进入到编辑页面,不需要从服务端获取数据,这样避免请求接口时间上浪费

使用vue的watch方式来监听写文章页面的变化,变化时使用websocket向服务端保存到redis中

文章保存的时候,清空redis和mysql的实时保存的数据

三、主要代码
const SocketIO = require("socket.io");
const config =  require("../config/environment");
const DraftRedis =  require("./draft-redis");
const redisMysql = require("./redis-mysql");

const draftPostRedisKey = config.draftPostRedisKey;

exports.initSocket = function (server) {
  console.log("init websocket");
  //socket.io
  let socketHandle = SocketIO(server, {
    serveClient: true,
    path: config.socketioPath
  });

  let draftRedis = new DraftRedis(config.db.redis);
  socketHandle.on("connection", function (socket) {
    console.log("socket connected");

    // 离开编辑文章页面
    socket.on("disconnect", function () {
      console.info("[%s] DISCONNECTED", socket.sid);
    });

    // 进入新增文章页面,获取已保存的草稿(可以为空)
    socket.on("getDraftPost", async function () {
      let data = await draftRedis.get(draftPostRedisKey);
      if (!data) {
        data = await redisMysql.getDraftPostFromMysql();
        socket.emit("getDraftPost", data);
        await draftRedis.set(draftPostRedisKey, data);
      } else {
        socket.emit("getDraftPost", data);
      }
    });

    // 实时保存文章内容
    socket.on("saveDraftPost", async function (data) {
      let res = await draftRedis.set(draftPostRedisKey, data);
      socket.emit("saveDraftPost", res);
    });

    // 保存后清空已保存的文章草稿
    socket.on("clearDraftPost", async function () {
      await draftRedis.destroy(draftPostRedisKey);
      await redisMysql.clearDraftPostOfMysql();
      socket.emit("clearDraftPost", true);
    });
  });
};
四、方法说明

目前个人博客的后台使用的是,只有一个账户,没有添加多账户体系,所以redis的mysql中只存有一条记录。后续有空会慢慢加上多账户体系

涉及到的模块及说明

1、/server/util/draft-socketio.js
服务端websocket服务,使用socket.io库
2、/server/util/draf-redis.js
redis的set方法和get公共方法
3、/server/util/redis-mysql.js

redisToMysqlTask方法:定时同步redis数据到mysql数据的方法,使用node-schedule库实现定时同步
getDraftPostFromMysql方法:redis中不存在的数据时候,从mysql中查询数据
clearDraftPostOfMysql方法:从mysql中删除数据,文章保存后操作
4、/src/main.js
浏览器端先导入socket.io,使用vue-socket.io和socket.io-client库
import VueSocketio from "vue-socket.io";
import socketio from "socket.io-client";

Vue.use(VueSocketio, socketio("http://localhost:9000", {
  path: "/testsocketiopath"
}));

5、/src/pages/edit.vue
使用websocket从服务端获取数据,并实施将数据传输到服务端进行保存

五、总结

整个功能本质上就是:webSocket、redis、mysql的使用,这几个之前使用过,没有联合使用过,还算是比较完满实现文章的实时保存

最后欢迎fork和start

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109777.html

相关文章

  • songEagle开发系列:Vue + Vuex + Koa 中使用JWT认证

    摘要:一前言,是为了在网络环境间传递声明而执行的一种基于的开放标准。用户签发添加中间件校验判断是否可用获取解密,获取用户名和认证失败中添加处理此处在开发时需要过滤掉登录接口,否则会导致验证永远失败。前端处理前端开发使用的是,发送请求使用的是。 一、前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。 JWT不是一个新...

    suosuopuo 评论0 收藏0
  • 如何创建一个数据科学项目?

    摘要:虽然我们可以在网上参照各种模板项目文章博客等创建一个数据科学项目,但是目前也没有教科书对这些知识做一个统一的回答。举个例子来说,数据科学分析项目通常就不需要部署和监控这两个过程。创建文件描述源数据及位置。进一步探索和报告在整个数据科学项目中 摘要: 在一个新的数据科学项目,你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面?读完本文...

    Aceyclee 评论0 收藏0
  • 为什么Nagios会那么吵?你又能做些什么呢?(1)

    摘要:自动化监控这里我需要问两个重要的问题为什么洪水警戒会一直发生并且为什么会愈演愈烈问题的根源其实是基于告警监控的积极一面自动化。所以,我们对配置好阈值,并把这项艰巨的工作委派给它。开发人员通过吸收客户的反馈指导,会选择短平快的项目。 如果你受困于 Nagios 的告警洪潮中不能自拔,那么这两篇连载博客就是为你而生的。让我们来详细的阐述下这个问题! showImg(https://segm...

    kaka 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<