我是使用sharedb 作为后端 ,然后前端使用的elementUI样式,编写的一个值班小工具。接下来,让我们先来了解一下sharedb是什么吧?

  • sharedb工具

  github地址:https://github.com/share/sharedb.git

  官方概念:ShareDB是基于JSON文档的操作转换(OT)的实时数据库后端。它是DerbyJS Web应用程序框架的实时后端。

  特征:

    1. 实时同步任何JSON文档
    2. 并发多用户协作
    3. 具有异步最终一致性的同步编辑API
    4. 实时查询订阅
    5. 与任何数据库轻松集成-MongoDBPostgresQL(实验性)
    6. 通过发布/订阅集成可水平扩展
    7. 从文档和操作中选择所需字段的投影
    8. 用于实现访问控制和自定义扩展的中间件
    9. 非常适合在浏览器或服务器上使用
    10. 重新连接后脱机更改同步
    11. 用于单元测试的数据库和pub / sub的内存中实现

   在这里,我只列出sharedb的概念以及特征,其中的其他特性(包括中间件等等),大家可以自行去github上去看。

   对于我来说,我是把github上的代码克隆下来,然后选择了其中的counter作为例子模板,去编写工具代码,首先对其中的server.js进行更改.

在server.js中,我只改了 doc.create({ name1: [], date: [] }, callback);这一行代码,在sharedb文档中doc.create(data[, type][, options][, function(err) {...}]) 在本地创建文档,然后将创建操作发送到服务器。因为对于我的需求,就是要将名字,以及对应名字所选的日期发送到服务器上,所以在这里我创建了这个对象。

  server.js

var http = require('http');
var express = require('express');
var ShareDB = require('sharedb');
var WebSocket = require('ws');
var WebSocketJSONStream = require('websocket-json-stream'); var backend = new ShareDB();
createDoc(startServer);
// Create initial document then fire callback
function createDoc(callback) {
var connection = backend.connect();
var doc = connection.get('examples', 'counter');
doc.fetch(function (err) {
if (err) throw err;
if (doc.type === null) {
doc.create({ name1: [], date: [] }, callback);
return;
};
callback();
});
}
function startServer() {
// Create a web server to serve files and listen to WebSocket connections
var app = express();
app.use(express.static('static'));
var server = http.createServer(app);
// Connect any incoming WebSocket connection to ShareDB
var wss = new WebSocket.Server({ server: server });
wss.on('connection', function (ws, req) {
var stream = new WebSocketJSONStream(ws);
backend.listen(stream);
}); server.listen(8080);
console.log('Listening on http://localhost:8080');
}

  client.js代码:

var sharedb = require('sharedb/lib/client');

// Open WebSocket connection to ShareDB server
var socket = new WebSocket('ws://' + window.location.host);
var connection = new sharedb.Connection(socket); // Create local Doc instance mapped to 'examples' collection document with id 'counter'
var doc = connection.get('examples', 'counter'); // 获取文档的初始值并订阅更改
doc.subscribe(showNames);
doc.subscribe(dateRanges);
// 当文档更改时(由此客户端或任何其他客户端或服务器),
// 更新页面上的名字以及日期范围
doc.on('op', showNames);
doc.on('op', dateRanges);
function dateRanges() {
app.$data.items = doc.data.date[0];
};
function showNames() {
app.$data.messages1 = doc.data.name1[0] ? doc.data.name1[0] : [];
};
// 当点击提交名字的时候,更改本地的名字,并将同步更改服务器和其它链接的客户端//提交日期
function submite() {
doc.submitOp([{ p: ['date', 0], li: app.$data.items }]);
};
//提交名字
function display() {
doc.submitOp([{ p: ['name1', 0], li: app.$data.messages1 }]);
};
// Expose to index.html
global.display = display;
global.submite = submite;

html代码

这个代码就没什么好说的啦,主要功能 就是可以先输入名字,然后再选择想要进行值班的日期。而输入的名字不可以有重复的,主要是靠一个复选框实现的,以及日期选择器,感兴趣的同学可以看看哦!,大家也可以看到这里面引用的js是bundle.js,所以我们要把写在client.js中的代码,复制到bundle.js中才可以实现哦。

<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<link rel="icon" href="1.ico">
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<title>值班小工具</title> <body>
<div id="app" >
<router-view> </router-view>
</div>
</body>
<script src="dist/bundle.js"></script>
<script>
const inputName = {
template: `<div>
<el-header>
<el-input id="date" placeholder="请输入用户名" name="date" v-model="message"></el-input>
<el-button v-on:click="display1" type="primary">提交 名字</el-button>
</el-header>
<el-main>
<span class="date">日 期</span>
<span class="name">姓 名</span>
<el-checkbox-group v-model="checked" >
<li v-for="(item,index) in $root.items" :key="item.checked">
<el-checkbox
v-on:change="checked1(index,checked)"
:label="item"
name="item"
>
{{item}}
<span class="messages">{{[$root.messages1[index]].join("|")}}</span>
</el-checkbox>
</li>
</el-checkbox-group>
</el-main>
</div>` ,
data() {
name: inputName;
return {
message: '',
messages1: [],
checked: []
}
},
methods: {
checked1: function () {
},
display1: function (index, checked) {
var a = document.getElementsByName('item');
this.messages1 = this.$root.messages1;
var cashName = document.getElementById("date").value;
var result = cashName.match(/[\s`~!@#¥$%^&*()_+<>?:"{},.\/;'[\]\w]/im);
for (var i = 0; i < a.length; i++) {
if (result !== null) {
this.$message({
message: '请输入正确的名字哦!',
type: 'warning'
});
break
}
if (a[i].checked && this.messages1[i] == null) {
this.messages1[i] = new Array;
}
if (a[i].checked && this.messages1[i] !== null && this.messages1[i][0] !== this.message) {
this.messages1[i].push(this.message);
}
if (a[i].checked && this.messages1[i] !== null && this.messages1[i].length > 2) {
this.messages1[i].pop(this.message);
this.$message({
message: '前面已经有两人选择了哦,请选择其它日期吧!',
type: 'warning'
});
}
}
display()
}
}
};
const inputDate = {
template: `<div>
<el-header>
<el-date-picker
v-model="value"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy年M月d日"
value-format="yyyy-MM-dd"
v-on:change="change1"
>
</el-date-picker>
<el-button onclick="submite()" type="primary">提交 日期</el-button>
</el-header>
<el-main>
<span class="date">日 期</span>
<span class="name">姓 名</span>
<li v-for="(item,index) in $root.items" :key="item.index">
{{item}}
<span class="messages1">{{[$root.messages1[index]].join('&')}}</span>
</li>
</el-main>
</div>`,
data() {
name: inputDate;
return {
items: [],
value: '',
}
},
methods: {
change1(value) {
var begin = value[0];
var end = value[1];
var item = new Array();
app.$data.items = item;
var ab = begin.split("-");
var ae = end.split("-");
var db = new Date();
db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]);
var de = new Date();
de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]);
var unixDb = db.getTime();
var unixDe = de.getTime();
for (var k = unixDb; k <= unixDe;) {
item.push(new Date(parseInt(k)).format().toString());
k = k + 24 * 60 * 60 * 1000;
}
}
}
};
const routes = [
{ path: '/inputDate', component: inputDate },
{ path: '/inputName', component: inputName }
];
const router = new VueRouter({
routes
});
Date.prototype.format = function () {
var s = "";
s += this.getFullYear() + "-";
s += this.getMonth() + 1 + "-";
s += this.getDate();
return s;
};
var app = new Vue({
router,
data() {
return {
value6: '',
items: [],
checked: [],
message: '',
messages1: [],
checked: []
}
}
}).$mount('#app');
</script>
<style scoped>
#app {
/* width: 1200px;
height: 848px; */
background-position: center;
padding-top: 0%;
} body {
margin: 0%;
} .el-checkbox__label {
display: inline-block;
padding-left: 10px;
line-height: 19px;
font-size: 14px;
width: 100%;
} .el-date-picker {
width: 30%;
} h3 {
margin: 40px 0 0;
} a {
color: #42b983;
} .el-header { color: #333;
text-align: center;
line-height: 88px;
} li {
padding-top: 2%;
list-style-image: url('./4.ico');
} p {
font-size: 20px;
font-family: 'Segoe UI', Tahoma, Verdana, sans-serif
} .date {
padding-left: 10%;
} .name {
padding-left: 40%;
} .el-main {
padding-top: 1%;
padding-left: 35%;
width: 70%;
height: 550px;
} .el-input {
width: 30%;
} .messages1 {
float: right;
padding-right: 27%;
text-decoration: underline;
} .messages {
float: right;
padding-right: 24%;
text-decoration: underline;
} .el-checkbox {
width: 80%;
color: black; }
</style>

第一次写博客,可能有些地方写的不是很完整,欢迎大家提出意见!

sharedb结合elementUi编写的实时小工具的更多相关文章

  1. 目不识丁的我使用Python编写汉字注音小工具

    一万点暴击伤害 人懒起来太可怕了,放了个十一充分激发了我的惰性.然后公众号就这么停了半个月,好惭愧- 新学期儿子的幼儿园上线了APP,每天作业通过app布置后,家长需要陪着孩子学习,并上传视频才算完成 ...

  2. 小程序 web 端实时运行工具

    微信小程序 web 端实时运行工具 https://chemzqm.github.io/wept/

  3. 如何高效的编写与同步博客 (.NET Core 小工具实现)

    一.前言 写博客,可以带给我们很多好处,比如可以让我们结识更多志同道合的人:在写博客过程中去查技术资料或者实践可以让我们对知识的掌握和理解更加深刻:通过博客分享能帮助他人收获分享的快乐等等.写博客真的 ...

  4. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

  5. iOS 设备屏幕上实时打印 Log 的小工具

    需求 写这个小工具的想法,主要来源于很多团队都会用友盟.TalkingData 等第三方框架做自定义事件统计:不过统计代码加好之后,没有很好的方法来让测试工程师验证一下事件加上了没有,调用次数有没有重 ...

  6. 在windows下实时监控、接受文件变化小工具

    在windows下实时监控文件变化小工具   在测试的时候,我们可能想实时监控系统打出的log信息,在unix系统上我们可以用"tail -f"实现,在windows下一般就无法做 ...

  7. java 编写小工具 尝试 学习(七)

    1.在java 编写小工具 尝试 学习(六)里学会了,控件 的随意摆放, 以及大小(x,y,width,height),又根据前面学习的按钮 被点击 的事件监控 的方法 ,点击 按钮 在显示区域显示“ ...

  8. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  9. C# 基础知识系列- 17 实战篇 编写一个小工具(1)

    0. 前言 这是对C# 基础系列的一个总结,现在我们利用之前学到的知识做一个小小的工具来给我们使用. 如果有看过IO篇的小伙伴,应该有印象.当时我提过一个场景描述,我们在平时使用系统的时候,经常会为了 ...

随机推荐

  1. ModuleNotFoundError: No module named 'phkit.pinyin'

    1 产生背景 在mac系统本地使用正常,在linux系统上phkit包缺少相应的python文件 2 解决方案 自己想出来,手动上传本地相关python代码到linux服务器 3 解决过程 首先通过项 ...

  2. git配置httpd服务-web_dav模式

    1,搭建httpd应用 2,修改httpd.conf文件 注释 DocumentRoot "/data/httpd/htdocs" 注释 <Directory "/ ...

  3. FaaS 给前端带来了什么?

    一.Serverless 与 FaaS Serverless 是一种云计算理念,即无服务器计算(Serverless Computing): Serverless suggests that the ...

  4. boot camp要求独立的fat分区

    先在windows把u盘用diskpart clean掉分区表 然后在苹果里面,给u盘重新分区,分区表不要选择GUID,选择主引导记录,格式选择fat,OK

  5. 如何从Python负零基础到精通数据分析

    一.为什么学习数据分析 1.运营的尴尬:运营人需要一个硬技能每个初入行的新人都会察觉到,运营是一个似乎并没有自己的核心竞争力和安全感的工作.因为每天的工作好像都被各种琐事所围绕,而只有一个主题是永恒不 ...

  6. 关于C语言内存占用

    struct T { char a; int *d; int b; int c:16; double e; }; T *p; 在64位系统以及64位编译器下,以下描述正确的是 A. sizeof(p) ...

  7. consul与springcloud整合

    1. 服务提供者注册进consul 1.1新建支付服务module cloud-providerconsul-payment8006 1.2 pom.xml <?xml version=&quo ...

  8. PHP array_intersect_key() 函数

    实例 比较两个数组的键名,并返回交集: <?php$a1=array("a"=>"red","b"=>"gree ...

  9. Python File readline() 方法

    概述 readline() 方法用于从文件读取整行,包括 "\n" 字符.如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符.高佣联盟 w ...

  10. Python List sort()方法

    描述 sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数.高佣联盟 www.cgewang.com 语法 sort()方法语法: list.sort(cmp=None, ...