开源一款剪贴板跨设备共享工具

news/2024/7/10 22:04:55 标签: 开源, python, flask, redis

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
个人IP:shigen

昨天遇到了一个很棘手的问题:我的手机剪贴板需要同步到另外的两台设备上。遗憾的是手机上并没有安装相同的通讯软件。用网上免费的剪贴板共享工具吧,方便是方便,但是觉得还是不安全,关键是不能实现特定的需求。我很享受DIY的过程,于是思索一下,我觉得我可以自己做出来,还能做到局域网下的剪贴板跨设备共享,毕竟我也曾有过成功的案例:开源一个局域网文件共享工具。于是说干就干。

起名字

项目总得有个名字吧。哎,想了好久,还是觉得没有合适的,最后问了GPT,选用了cpoyhub这个名字。

确认需求

我的需求就是很简单,像极了【蜂巢】的设计,我随用随取。输入剪贴板内容,拿到取件码;输入取件码,获得剪贴板内容。再简单不过了!所以,我也不用考虑那么多复杂的东西,什么认证、安全、高并发……小脑袋要爆炸!

确认架构

这是一个小工具,用不着我动不动Spring Boot那一套,而且Spring boot本身就很重!还是拿起了拿手的Flask框架,外加一个Redis,搞定!

前端的话,别搞Vue项目了,直接原生的来一套!关键是时间就那么一丢丢,能用魔法尽量用魔法。需要注意的是:前端的js文件,能用CDN就用CDN,给服务器节省一点流量。

代码设计

算起来逻辑还是很简单的,shigen直接开干了!

项目的整体结构

项目的整体结构如图所示:

项目结构

算得上是一个简简单单的小demo了。

后端代码

这里只展示核心的代码:

python">from datetime import datetime
from app import app, redis_client
from flask import jsonify, render_template, request

REDIS_KEY_PREFIX = 'clip:'
REDIS_KEY_EXPIRE_SES = 3600 * 10


def format_current_time(format='%m%d%H%M%S'):
    """
    默认格式化当前时间为 'MMDDhhmmss'
    :return: 格式化后的时间字符串
    """
    current_time = datetime.now()
    formatted_time = current_time.strftime(format)
    return formatted_time


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/new', methods=['POST'])
def clipboard():
    data = request.form['data']
    # 将数据存储到 Redis 中
    tms = format_current_time()
    key = REDIS_KEY_PREFIX + tms
    redis_client.set(key, data, REDIS_KEY_EXPIRE_SES)
    return jsonify({'data': tms, 'success': True})


@app.route('/get', methods=['GET'])
def get():
    tms = request.args.get('code')
    key = REDIS_KEY_PREFIX + tms
    value = redis_client.get(key)
    if not value:
        return jsonify({'data': None, 'success': False})
    else:
        return jsonify({'data': value, 'success': True})

前端代码
    <script>
        $(document).ready(function() {
            // 保存剪贴板内容
            $('#save-btn').click(function() {
                var data = $('#new-data').val();
                $.post('/new', {data: data}, function(response) {
                    console.log(response);
                    showSuccessMessage('Your clipboard saved successfully');
                    $('#new-data').val(response.data);
                    $('#save-btn').attr('disabled', true);
                });
            });

            // 提取剪贴板内容
            $('#extract-code').change(function() {
                var code = $(this).val();
                $.get('/get', {code: code}, function(response) {
                    $('#extracted-data').val(response.data);
                });
            });

            // 复制剪贴板内容
            $('#copy-btn').click(function() {
                var textarea = document.getElementById('extracted-data');
                textarea.select();
                document.execCommand('copy');
                showSuccessMessage('Copied to clipboard!');
            });

            // 显示复制成功提示消息
            function showSuccessMessage(text) {
                var message = $('#alert-message');
                message.text(text).fadeIn(300).delay(1500).fadeOut(400);
            }
        });
    </script>

完整的代码,可参考shigen的GitHub。

服务部署

最后就是服务的部署了,shigen部署在了自己的腾讯云服务器上。一切很是顺利,基本山没有遇到大的问题:

nohup python3 run.py > app.log 2>&1 &

服务部署

整个过程也放在了shigen的哔哩哔哩上,感兴趣的伙伴,欢迎体验。

与shigen一起,每天不一样!


http://www.niftyadmin.cn/n/5462565.html

相关文章

Jenkins执行策略(图文讲解)

Jenkins执行策略-图文讲解 一&#xff1a;手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…

常见微服务的组件?

注册中心&#xff1a;就是一个服务注册的地方&#xff0c;我们可以把拆分的服务注册到注册中心&#xff0c;这样注册中心就能管理这些服务&#xff0c;服务之间的调用就会很方便&#xff0c;通过服务名就能相互调用。 负载均衡&#xff1a;被调用放的负载均衡&#xff0c;比如…

Java-常见面试题收集(九)

十七 Spring 1 Spring 的核心 IoC&#xff0c;DI 和 AOP。   依赖注入&#xff08;Dependency Injection, DI&#xff09;&#xff1a;这是Spring框架的核心特性之一。它允许在运行时&#xff0c;由外部源&#xff08;如配置文件、注解或环境变量&#xff09;决定一个对象所…

vue3数据库中存头像图片相对路径在前端用prop只能显示路径或无法显示图片只能显示alt中内容的问题的解决

不想看前情可以直接跳到头像部分代码 前情&#xff1a; 首先我们是在数据库中存图片相对路径&#xff0c;这里我们是在vue的src下的assets专门建一个文件夹img存头像图片。 然后我们如果用prop"avatar" label"头像"是只能显示图片路径的&#xff0c;即lo…

阿里云通用算力型u1云服务器配置性能评测及价格参考

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Verilog基础【一】

文章目录 1.1 第一个verilog设计1.2 Verilog 简介1.3 Verilog环境搭建1.4 Verilog 设计方法设计方法设计流程 2.1 Verilog 基础语法格式注释标识符与关键字 2.2 Verilog 数值表示数值种类整数数值表示方法实数表示方法十进制&#xff1a;科学计数法&#xff1a; 字符串表示方法…

关于缓存的一些问题

关于缓存的一些问题 1、缓存穿透 什么是缓存穿透&#xff1a; 缓存穿透指的是在使用缓存系统的过程中&#xff0c;对于不存在的数据不断地进行查询请求&#xff0c;导致这些请求都无法从缓存中获取到数据&#xff0c;最终达到了绕过缓存的目的&#xff0c;直接访问后端数据源…