如何实现文章的实时保存?通常写文章的写博客的网站都会有这个功能点,这样保证了用户在不当心退出的状况下数据的保存下来,这样的交互比较符合用户的使用心理学。对于用户来讲这是一个很是实用的功能,做为一个博客来讲,有这个仍是不错的。哈哈^_^vue
一个功能的实现,你的编程思路很重要,决定着你在coding以前的设计,思路就是你的编程设计。node
- 使用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);
});
});
};
复制代码
redisToMysqlTask方法:定时同步redis数据到mysql数据的方法,使用node-schedule库实现定时同步 getDraftPostFromMysql方法:redis中不存在的数据时候,从mysql中查询数据 clearDraftPostOfMysql方法:从mysql中删除数据,文章保存后操做 四、/src/main.js 浏览器端先导入socket.io,使用vue-socket.io和socket.io-client库mysql
import VueSocketio from 'vue-socket.io';
import socketio from 'socket.io-client';
Vue.use(VueSocketio, socketio('http://localhost:9000', {
path: '/testsocketiopath'
}));
复制代码
五、/src/pages/edit.vue 使用websocket从服务端获取数据,并实施将数据传输到服务端进行保存git