局域网内聊天室(网页版)

webrtc实现局域网网页视频聊天 f由于项目有视频聊天的需求,在网上了解到谷歌开源的webrtc可以实现p2p的视频通信,参考了很多网上的资料,最终还是硬着头皮去webrtc官网,找到基于webrtc官网的demo,demo本身是基于本机的,源代码是模拟了两个pc来通信,要实现局域网两台设备建立webrtc连接,前提是双方拿到对方的sdp和icecandidate,彼此交换对方的这两个信息,就可以视频聊天了。 ... 阅读详情

由于自己平时工作学习的时候需要在各个平台之间传一些文本,但是又不想登录微信或者QQ这类软件,麻烦不说,有的时候其他人的电脑或平板上还没登陆,传给他们百度网盘链接或者其他的长文本就很麻烦,还有隐私问题,于是使用GPTCV大法,写了一个网页端的局域网聊天室,并打包成了docker镜像,使用方法放到最后。

这篇文章主要是想记录自己打包docker镜像并上传dockerhub的历程做个笔记。

首先,目录层级如下:
internal_chat/
├── app.py # Flask 主程序
├── Dockerfile # Docker 构建文件
├── requirements.txt # Python 依赖包
├── chat_log.json # 聊天记录文件(自动生成或初始化为空列表)
├── templates/
│ └── index.html # 网页聊天界面 HTML 模板
├── static/
│ ├──style.css # 可选:自定义样式
└──

直接上代码:
app.py

from flask import Flask, render_template, request, jsonify
from datetime import datetime, timedelta
import json
import os

app = Flask(__name__)
LOG_FILE = 'chat_log.json'
messages = []

def load_messages():
    global messages
    if os.path.exists(LOG_FILE):
        with open(LOG_FILE, 'r', encoding='utf-8') as f:
            try:
                messages = json.load(f)
            except json.JSONDecodeError:
                messages = []

def save_messages():
    with open(LOG_FILE, 'w', encoding='utf-8') as f:
        json.dump(messages, f, ensure_ascii=False, indent=2)

def clean_old_messages():
    global messages
    now = datetime.now()
    messages[:] = [
        msg for msg in messages
        if now - datetime.strptime(msg['timestamp'], '%Y-%m-%d %H:%M:%S') < timedelta(days=1)
    ]
    save_messages()

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

@app.route('/send', methods=['POST'])
def send_message():
    data = request.get_json()
    username = data.get('username', '匿名')
    message = data.get('message', '')
    now = datetime.now()
    timestamp = now.strftime('%Y-%m-%d %H:%M:%S')
    messages.append({
        'username': username,
        'message': message,
        'timestamp': timestamp
    })
    clean_old_messages()
    save_messages()
    return jsonify(success=True)

@app.route('/messages')
def get_messages():
    clean_old_messages()
    for msg in messages:
        msg['time'] = datetime.strptime(msg['timestamp'], '%Y-%m-%d %H:%M:%S').strftime('%H:%M:%S')
    return jsonify(messages=messages)

if __name__ == '__main__':
    load_messages()
    clean_old_messages()
    app.run(host='0.0.0.0', port=15920, debug=True)

index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>局域网聊天</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="/static/style.css">
</head>
<body>
    <div class="container">
        <h2>局域网聊天室</h2>
        <div id="usernameDisplay"></div>
        <div id="chatbox"></div>
        <div class="input-area">
            <input type="text" id="msg" placeholder="输入消息..." autofocus>
            <button onclick="sendMessage()">发送</button>
        </div>
    </div>

    <script>
        // 生成随机用户名(5位)
        function generateUsername() {
            return Math.random().toString(36).substr(2, 5).toUpperCase();
        }

        const username = generateUsername();
        document.getElementById('usernameDisplay').textContent = `用户名:${username}`;

        function fetchMessages() {
            fetch('/messages')
                .then(res => res.json())
                .then(data => {
                    const chatbox = document.getElementById('chatbox');
                    chatbox.innerHTML = '';
                    data.messages.forEach(msg => {
                        const item = document.createElement('div');
                        item.className = 'message';
                        item.innerHTML = `<span class="time">[${msg.time}]</span> <strong>${msg.username}</strong>: ${msg.message}`;
                        chatbox.appendChild(item);
                    });
                    chatbox.scrollTop = chatbox.scrollHeight;
                });
        }

        function sendMessage() {
            const msgInput = document.getElementById('msg');
            const msg = msgInput.value.trim();
            if (!msg) return;
            fetch('/send', {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify({ username: username, message: msg })
            }).then(() => {
                msgInput.value = '';
                fetchMessages();
            });
        }

        // 回车发送消息
        document.getElementById('msg').addEventListener('keydown', function (e) {
            if (e.key === 'Enter') {
                sendMessage();
            }
        });

        setInterval(fetchMessages, 1000);
        window.onload = fetchMessages;
    </script>
</body>
</html>

style.css

body {
    font-family: -apple-system, BlinkMacSystemFont, sans-serif;
    margin: 0;
    padding: 0;
    background: #f2f2f2;
}

.container {
    max-width: 600px;
    margin: auto;
    padding: 20px;
}

h2 {
    text-align: center;
    color: #333;
}

#usernameDisplay {
    text-align: center;
    margin-bottom: 10px;
    font-weight: bold;
}

#chatbox {
    background: #fff;
    height: 400px;
    overflow-y: auto;
    border: 1px solid #ccc;
    padding: 10px;
    border-radius: 5px;
}

.message {
    margin: 5px 0;
    line-height: 1.4;
}

.message .time {
    color: #888;
    margin-right: 5px;
}

.input-area {
    display: flex;
    margin-top: 10px;
}

#msg {
    flex: 1;
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 5px 0 0 5px;
    font-size: 16px;
}

button {
    padding: 10px 15px;
    border: none;
    background: #007bff;
    color: white;
    font-size: 16px;
    cursor: pointer;
    border-radius: 0 5px 5px 0;
}

button:hover {
    background: #0056b3;
}

@media (max-width: 600px) {
    #chatbox {
        height: 300px;
    }
    button {
        font-size: 14px;
    }
    #msg {
        font-size: 14px;
    }
}

运行测试:
访问IP:15920
在这里插入图片描述

OK,运行正常,下一步我们打包成docker镜像

Linux执行命令:

docker login
[root@localhost internal_chat]# docker login

USING WEB-BASED LOGIN
To sign in with credentials on the command line, use 'docker login -u <username>'

Your one-time device confirmation code is: DKTP-BLDV
Press ENTER to open your browser or submit your device code here: https://login.docker.com/activate

Waiting for authentication in the browser¡­

访问网址:https://login.docker.com/activate
然后输入设备ID:DKTP-BLDV(在提示里面)
按照网页提示注册登录
登录后终端回显:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

接下来Linux在项目目录下执行命令:

touch requirements.txt

里面只写一个模块

Flask==3.1.1

创建一个Dockerfile

touch Dockerfile

写入以下内容:

# Builder 阶段:安装依赖并安装python包
FROM python:3.11-alpine AS builder

WORKDIR /app

RUN apk add --no-cache gcc musl-dev libffi-dev

COPY requirements.txt .

RUN pip install --prefix=/install --no-cache-dir -r requirements.txt

COPY . .

# 运行阶段:只复制已安装的包和代码
FROM python:3.11-alpine

WORKDIR /app

# 复制 builder 阶段安装好的包
COPY --from=builder /install /usr/local

# 复制应用代码
COPY --from=builder /app /app

CMD ["python", "app.py"]

OK,执行打包命令:

docker build -t lan-chat .

注意最后有个 .

[root@localhost internal_chat]# docker build -t lan-chat .
[+] Building 20.0s (13/13) FINISHED                                                 docker:default
 => [internal] load build definition from Dockerfile                                          0.0s
 => => transferring dockerfile: 540B                                                          0.0s
 => [internal] load metadata for docker.io/library/python:3.11-alpine                         1.3s
 => [internal] load .dockerignore                                                             0.0s
 => => transferring context: 2B                                                               0.0s
 => [internal] load build context                                                             0.0s
 => => transferring context: 2.46kB                                                           0.0s
 => [builder 1/6] FROM docker.io/library/python:3.11-alpine@sha256:8068890a42d68ece5b62455ef  0.0s
 => CACHED [builder 2/6] WORKDIR /app                                                         0.0s
 => CACHED [builder 3/6] RUN apk add --no-cache gcc musl-dev libffi-dev                       0.0s
 => CACHED [builder 4/6] COPY requirements.txt .                                              0.0s
 => [builder 5/6] RUN pip install --prefix=/install --no-cache-dir -r requirements.txt       17.3s
 => [builder 6/6] COPY . .                                                                    0.2s 
 => [stage-1 3/4] COPY --from=builder /install /usr/local                                     0.2s 
 => [stage-1 4/4] COPY --from=builder /app /app                                               0.1s 
 => exporting to image                                                                        0.4s 
 => => exporting layers                                                                       0.4s 
 => => writing image sha256:7e1b8c7d6611d4d6b58cc739b91941dacfa2302689a136d74eaf31e0b3edd5fe  0.0s 
 => => naming to docker.io/library/lan-chat                                               0.0s

这里我选择python:3.11-alpine是为了压缩镜像体积

打包后我们查看一下:

[root@localhost internal_chat]# docker images
REPOSITORY                    TAG                  IMAGE ID       CREATED          SIZE
lan-chat                      latest               7e1b8c7d6611   32 seconds ago   64.4MB

好的,接下来我们打个tag

[root@localhost internal_chat]# docker tag lan-chat-app sspeaf/lan-chat:latest

然后push到dockerhub

[root@localhost internal_chat]# docker push sspeaf/lan-chat:latest
The push refers to repository [docker.io/sspeaf/lan-chat]
40f4d3da82c7: Pushed 
96b5e0494498: Pushed 
9a6a1c7594c7: Pushed 
ed1fa62b5e54: Mounted from library/python 
15b8ed2bc3f1: Mounted from library/python 
e980fad4908b: Mounted from library/python 
fd2758d7a50e: Mounted from library/python 
latest: digest: sha256:f536145b2b92468e6133e4b8b0964367d006501354a3368ba07461e2f5a3347d size: 1785

OK,我们执行下面的命令run一下试试:

docker run -d -p 15920:15920 --name lan-chat  --restart unless-stopped   -v /etc/localtime:/etc/localtime:ro   -v /etc/timezone:/etc/timezone:ro   sspeaf/lan-chat:latest

记得防火墙放开15920/tcp端口

浏览器访问下:
在这里插入图片描述
接下来在各个平台的浏览器内收藏IP:15920,然后添加到桌面就可以啦!

希望这个项目能帮到你

【源码+文档】局域网聊天室之C语言 我们利用 socket 编程,服务器端建立线程套接字,通过绑定监听等待客户端的请求,一旦有客户端请求连接则建立连接,双方进行通信,而客户端则主动去连接服务器,基本步骤相同。局域网聊天室是单服务器端,多个客户端的聊天程序,多个客户端可以通过配置 IP 和端口号来连接服务器。 阅读详情

相关推荐

基于winsock的局域网聊天室实现

最初实现是由于课题要求运用WinSock来实现SOCKET通信,就去了解了一下了一下winsock的官方文档:微软Winsock文档 WINSock2最初设计目的便是向Windows添加IPv4通信的支持,其工作原理就是在原有的Socket编程上进一步适应于Windows的开发与使用,其具体实现步骤如下: 但在这里要实现一个多人的聊天室,故就要引入多线程的开发,...

小黑炮的博客 2388

Java基础之网络通信-简单局域网聊天室

服务器使用 ServerSocket 类创建一个监听指定端口的套接字。服务器和客户端都可以通过 socket.getInputStream() 和 socket.getOutputStream() 方法获取这些流对象。以下是一个简单的客户-服务端示例程序,但是在这个示例中我们把一个Java对象通过Socket传送给对方。使用 Socket 编程,您可以在客户端和服务器之间建立网络连接,并通过套接字(Socket)进行数据传输。以下是一个简单的基于控制台的聊天室程序,在这个示例中开启一个服务端和多个客户端。

QIFU的专栏 1114

基于Socket的局域网简易聊天室

主要是通过Socket进行编程 Scoket与ServerSocket交互的过程: 1)服务器端程序创建一个ServerSocket,然后调用accept()方法等待客户端进行连接 2)客户端程序创建一个Socket并请求与服务器端程序建立连接 3) 服务器端程序接受客户端的连接请求,并创建一个新的Socket与该客户端建立专线连接 4)建立了连接的客户端及服务器端的两个Socket在一

zhuzg的专栏 3974

使用Socket实现局域网内聊天室

【代码】使用Socket实现局域网内聊天室。

weixin_43507682的博客 947

基于socket通信的局域网聊天室搭建(socket通信第四弹)

欢迎转载,请注明转载微信订阅号(安卓编程入门进阶)。 百度云原清晰度地址:http://pan.baidu.com/s/1mhS0H8O 在前两次课程已经实现了客户端向服务器端的数据单向传输并且能够将数据呈现到界面,本次课程将前两次课程合并完成服务器端向客户端传递数据并展示。最终实现的是一个基于socket通信的局域网单点聊天室。 1、  服务器端的界面布局为从上至下为开启按钮、聊天输入框、

changhe6669的博客 1753

基于NodeJs的局域网聊天室

基于NodeJs的局域网聊天室(1对1),对electron的简单实践

菜鸟弱鸡三段_袁浩宇 2718

基于WebSocket的网页版聊天室

项目展示: 1. 登录页面:如果未输入登录名与密码点击登录会有提示。 点击注册会跳到注册页面 页面下方可以加上自己的GitHub与博客链接。 登录成功后会跳转到聊天页面 登陆失败后会弹出用户名或者密码不正确 2. 注册页面 当注册成果功会弹出提醒,并且返回登录界面。 3.聊天页面 登录成功后会进入聊天页面,并且会有其他用户的上下线提醒。 可以通过用户列表左侧按钮选择私发或者群发 4. 控制......

学习笔记。 1224

Qt打造局域网聊天室实战

Qt是一个跨平台的C++图形用户界面应用程序开发框架。它被广泛用于开发各种桌面、嵌入式以及移动设备应用程序。Qt具有丰富的API、高度模块化的设计以及跨平台特性,使其成为全球开发者首选的GUI开发工具之一。TCP/IP协议栈是一组用于互联网数据交换的协议,其主要特点在于其分层结构和标准化的数据封装。每一层都有明确的责任,使得整个网络通信过程既模块化又高效。链路层:主要负责在同一个链路中的节点之间的数据帧传输,如以太网协议。

weixin_29317963的博客 1184

局域网聊天室

最近学习网络编程,写了一个聊天室,基本功能已经实现,还有待优化的部分 #include"server.h" static int sockid,i,end; void fa(int signo) { printf("\r服务器正在关闭>>>>>\n"); sleep(2); close(sockid); exit(0); } typedef struct { struct sockad

good1st的专栏 767

聊天室,可以在学校内网进行聊天

非常好

开源LocalAI本地人工智能安装教程

LocalAI是一款能在本地运行的人工智能应用,它兼容了OpenAI API规范,它可以在普通的电脑运行,不需要GPU,也不需要联网,音频转录

2301_78652552的博客 3614

JAVA实现聊天室(局域网)

JAVA用局域网实现聊天室 类和接口 Server类(服务器端) package Test; import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server { private static final int SERVER_PORT=30000; //使用CrazyitMap对象来保存每

weixin_45821324的博客 3197

OCCT(Open CASCADE Technology)入门-2.搭建开发环境

安装完成后,在【扩展】菜单下会看到【Qt VS Tools】菜单,打开子菜单【options】进入qt配置窗口。打开VS后随便创建一个新项目,进入开发环境主页,打开顶部菜单【扩展】->【管理扩展】打开管理扩展窗口。然后点击右下角【创建】,一路【next】即可,最后会进入到开发主界面,得到一个下面的工程结构。好了,到这里基本的环境我们已经安装好了,下面我们开始创建项目并配置开发环境。打开顶部菜单【项目】,点击最后一个菜单项【xxx属性】,进入项目配置界面。这里的配置一般不用改,我们看【Versions】

2501_91235145的博客 2875

[Qt] 基于Tcp协议的聊天室实现(Chat Room 局域网通信)

时间:2016年12月11日 一、写在前面: 平时做图形学的东西多一些,虽然一直对网络编程很感兴趣,但是没有什么机会去尝试一下。最近正好赶上期末的课程实习,然后就参考Qt官方的 Network Programming References,写了一个局域网群聊软件,还算比较好看吧~ ,因为是自己的提交的作业,所以比较简陋将就一下,主要功能有: (1) 用户...

RyuZhihao123 的博客 1万+

从安装到出图:一份给振动测试新手的LMS Test.Lab 2021完整避坑手册(含许可证更新和常见弹窗解决)

本文为振动测试新手提供LMS Test.Lab 2021的完整使用指南,涵盖安装配置、许可证更新、数据采集到频域后处理的全流程。特别针对常见弹窗错误提供解决方案,并详细讲解Colormap时频图分析技巧,帮助用户快速掌握振动数据分析核心技能。

weixin_29268331的博客 983

15张图详解三方支付:总架构、5大核心业务处理流程、备付金管理

用户可以将银行卡与零钱账户绑定,建立银行结算账户与支付账户的连接,然后将银行账户资金充值到零钱账户中,或将零钱账号中的余额提现至绑定的银行卡。因此,用户在A支付机构的零钱一般只能支付给A支付机构的商户,如支付宝的零钱不能支付给微信的商户。这五大业务的协同运作,使得第三方支付机构这一庞大的支付服务平台能够为市场提供卓越的支付能力。到了结算时间,网联会向备付金集中存管账户提交结算指令,在第三方支付机构备付金集中存管账户内完成最终的结算,并将结算结果及额度变动情况通知给第三方支付机构,具体流程如图13所示。

银行信息系统应用架构详解 1044

基于QT的TCP本地与不同局域网(使用公网)的简易聊天室

本文包含了目前平台上大多数的文章所采取的本地tcp构建的聊天室项目,也就是同一局域网通信。同时,我在这里提供不同局域网下实现通信的方法,这里用到的方法是客户端发送消息给服务器,然后服务器再发送给另一个局域网的客户,为了减少工作量,我采取的是用群聊的方式同一接收信息。如果需要实现不同局域网的通信,我们得租一个云服务器,这里以华为云示例。文章最后一并展示参考文档与视频链接。

2301_81070376的博客 3638

银行统一监管报送系统

依据《银行业金融机构数据治理指引》,银行业金融机构应当建立适应监管数据报送工作需要的信息系统,实现流程控制的程序化,提高监管数据加工的自动化程度。银行业金融机构应当将监管数据纳入数据治理,建立工作机制和流程,确保监管数据报送工作有效组织开展,监管数据质量持续提升。银行通常要对接报送EAST5.0、1104、CRSS等近40个监管应用,涉及近1000张报表。表13-01是主要的监管报送应用、报送依据、报送规范、监管机构名称。

银行信息系统应用架构详解 4348

Java实现多线程局域网聊天室

局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c++而轻视java的心态,搞了一个多线程的聊天室,熟悉了一下服务器和客户机的操作。 1.TCP 要实现局域网连接,就必须知道信息传输的原理。 在局域网里面传输的信息都是以包的形式,我使用的TCP包传输数据,TCP包里面封装了IP报文。 下面这句话就是通过一个静态IPV4协议的类得到一个服务器的IP地址。 address = InetAddress.getByName("192.168.43.86"); 2.套接字 在T

一只懒猫的博客 3910

【三维激光扫描】第二章:国内外三维激光扫描设备简介

地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。 2.1 国外地面三维激光扫描仪简介 目前,生产地面三维激光扫描仪的公司比较多,随着地面三维激光扫描技术应用普及程度的不断提高,国外产品在中国的市场目前还占主导地位。它们各自的产品在性能指标上有所不同,以下简要介绍有代表性的公司产品。 2.1.1 奥地利 Riegl公司的.

智慧空间实验室 4643

【总目录】AUTOSAR精进之路专栏介绍及内容目录持续更新...

本专栏系统讲解AUTOSAR汽车电子开发技术,包含Eth/OS/Can/Lin等协议栈、MCAL驱动、功能安全等核心模块。内容基于实际项目经验,从概念原理到工程配置、特殊需求实现及问题排查进行深入剖析。重点涵盖TC3xx芯片平台开发、多核OS、网络管理、存储协议栈等难点问题,提供100+篇原创技术文章。专栏采用付费模式,保证内容完整性和持续更新,并提供专业答疑服务。适合汽车电子工程师系统学习AUTOSAR开发技术。

qq_36056498的博客 6510

开发一个基于DCOM的局域网聊天室(一)

开发一个基于DCOM的局域网聊天室难度:★★★☆☆先行知识:Delphi / 接口 / OLE&COM&DCOM / Win32  首先祝大家新春快乐,猴年万事如意!在前面的几篇文章中我们已经探讨了不少基于微软COM的相关技术,而分布式COM(以下简称DCOM)的出现给我们轻松的创建分布式应用提供了机会;我们可以完全不去理会低级别的Windows Sockets(DCOM通过M

hkbarton的专栏 1780

Python 爬虫实战:Boss直聘 Python 岗位招聘数据爬取

本文介绍了一个Python爬虫项目,用于抓取Boss直聘平台的Python岗位招聘数据并进行可视化分析。项目采用requests库发送POST请求,通过抓包分析获取JSON接口,绕过HTML解析直接获取结构化数据。主要内容包括: 接口分析:找到关键POST接口,解析请求头和JSON参数格式 环境准备:安装requests/pandas/matplotlib/pyecharts等依赖库 核心实现: 手动获取登录Cookie 构建请求头和城市代码映射 实现分页抓取职位列表数据 项目特色在于直接解析JSON接口而

u014481728的博客 297

java局域网聊天室小项目架构思路

本文介绍了基于Java开发的局域网聊天室项目架构思路。项目分为客户端和服务器端,使用Swing构建GUI界面,实现多用户在线聊天和私聊功能。客户端包含登录界面(含昵称输入和验证)和聊天主界面(显示聊天区、用户列表和消息输入)。服务器端负责处理客户端连接、消息转发和用户管理。技术栈包括Java网络编程、多线程、面向对象和GUI开发。服务器采用TCP协议保证稳定传输,通过多线程处理并发连接。项目采用模块化设计,先构建服务器端再开发客户端逻辑。

2401_88685396的博客 698

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...

基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述本科生毕业论文(设计)题 目: 基于Java网页版聊天室的设计与实现 姓 名:学 院: 理学院 专 业: 信息与计算科学 ...

weixin_39857480的博客 1074

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 一次成功的手机QQ聊天记录找回(OPPO R7s 安卓4.4.4)并把聊天记录导入新版本QQ的心得
kuraki peaf
博客等级 码龄7年 41粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值