千千块模板|千千表白模板(七夕情人节必备神器)

千千块模板 | 千千表白模板(七夕情人节必备神器)

七夕情人节就不必说什么了,没对象的大胆表白,有对象的送 ta 闺蜜一个惊喜

可以修改内容,修改的内容都在代码最上面

录制 20250922185744487.gif

录制 20250922185752936.gif

自定义块 js(祝你表白成功!)

// --- 可自定义区域 ---
const customTexts = {
    rain: 'I LOVE U',
    heart: '我会永远陪着你',
    sequence: ['#countdown 3', '亲爱的', '节日快乐', '我爱你', '#rectangle'],
    finalMessage: '祝你表白成功!' // 动画结束后显示在此处,可以自定义
};
// --- 可自定义区域结束 ---

// 每次代码块刷新时,都先清空旧内容,以确保修改能生效
this.innerHTML = '';


const style = document.createElement('style');
style.textContent = `
    .protyle-wysiwyg {
        margin: 0 !important;
        padding: 0 !important;
        overflow: hidden !important;
        background: #000 !important;
        height: 100vh;
        width: 100vw;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 9998;
    }
    .rain-canvas, .text-canvas, .heart-canvas {
        position: absolute;
        top:0;
        left:0;
        width: 100%;
        height: 100%;
    }
    .heart-text {
        position: fixed;
        top: 42%;
        left: 50%;
        transform: translate(-50%, -50%);
        z-index: 9999;
        pointer-events: none;
        display: none;
    }
    .heart-text h4 {
        font-family: "STKaiti";
        font-size: 40px;
        color: #f584b7;
        text-align: center;
        white-space: nowrap;
    }
    .close-btn {
        position: fixed;
        top: 20px;
        right: 20px;
        z-index: 10000;
        color: white;
        background: rgba(255,255,255,0.2);
        border: 1px solid white;
        border-radius: 50%;
        width: 30px;
        height: 30px;
        text-align: center;
        line-height: 28px;
        cursor: pointer;
        font-size: 20px;
    }
`;
this.appendChild(style);

const container = document.createElement('div');
container.className = 'protyle-wysiwyg';
this.appendChild(container);


const rainCanvas = document.createElement('canvas');
rainCanvas.id = 'rain-canvas';
rainCanvas.className = 'rain-canvas';
container.appendChild(rainCanvas);

const textCanvas = document.createElement('canvas');
textCanvas.className = 'text-canvas';
container.appendChild(textCanvas);

const heartTextContainer = document.createElement('div');
heartTextContainer.className = 'heart-text';
heartTextContainer.innerHTML = `<h4>💗 ${customTexts.heart}</h4>`;
container.appendChild(heartTextContainer);

const heartCanvas = document.createElement('canvas');
heartCanvas.id = 'heart-canvas';
heartCanvas.className = 'heart-canvas';
heartCanvas.style.display = 'none';
container.appendChild(heartCanvas);

const closeButton = document.createElement('div');
closeButton.className = 'close-btn';
closeButton.innerHTML = '×';
container.appendChild(closeButton);

// 新增:ESC 退出功能
const handleEscKey = (event) => {
    if (event.key === 'Escape') {
        closeButton.click();
    }
};
document.addEventListener('keydown', handleEscKey);

closeButton.addEventListener('click', () => {
    // 移除 ESC 键的监听
    document.removeEventListener('keydown', handleEscKey);

    // 移除所有创建的元素和样式
    const createdContainer = this.querySelector('.protyle-wysiwyg');
    if (createdContainer) createdContainer.remove();
    const createdStyle = this.querySelector('style');
    if (createdStyle) createdStyle.remove();

    const blockId = this.getAttribute('data-node-id');
    const finalMessage = customTexts.finalMessage || '祝你表白成功!';

    // 使用 API 更新块内容为最终消息
    // 这会用一个新的段落块替换掉当前的代码块,从而彻底停止脚本
    fetch('/api/block/updateBlock', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            id: blockId,
            dataType: 'markdown',
            data: finalMessage
        })
    }).catch(error => {
        console.error('更新块内容失败:', error);
        // API调用失败时的后备方案:直接写入文本
        this.innerHTML = finalMessage;
    });
});


// ==================== 字符雨效果 ====================
function initRainEffect() {
    var canvas = rainCanvas;
    var ctx = canvas.getContext('2d');

    canvas.height = window.innerHeight;
    canvas.width = window.innerWidth;

    var texts = customTexts.rain.split('');
    var fontSize = 16;
    var columns = canvas.width / fontSize;
    var drops = [];

    for (var x = 0; x < columns; x++) {
        drops[x] = 1;
    }

    function draw() {
        ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = '#f584b7';
        ctx.font = fontSize + 'px arial';

        for (var i = 0; i < drops.length; i++) {
            var text = texts[Math.floor(Math.random() * texts.length)];
            ctx.fillText(text, i * fontSize, drops[i] * fontSize);

            if (drops[i] * fontSize > canvas.height || Math.random() > 0.95) {
                drops[i] = 0;
            }
            drops[i]++;
        }
    }

    const rainInterval = setInterval(draw, 33);
  
    const resizeHandler = () => {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        columns = canvas.width / fontSize;
        drops = [];
        for (var x = 0; x < columns; x++) {
            drops[x] = 1;
        }
    };
    window.addEventListener('resize', resizeHandler);

    closeButton.addEventListener('click', () => {
        clearInterval(rainInterval);
        window.removeEventListener('resize', resizeHandler);
    });
}

// ==================== 心形效果 ====================
function initHeartEffect() {
    var settings = {
        particles: {
            length: 500,
            duration: 2,
            velocity: 100,
            effect: -0.75,
            size: 30,
        },
    };

    var Point = function(x, y) {
        this.x = typeof x !== 'undefined' ? x : 0;
        this.y = typeof y !== 'undefined' ? y : 0;
    };

    Point.prototype = {
        clone: function() {
            return new Point(this.x, this.y);
        },
        length: function(length) {
            if (typeof length === 'undefined')
                return Math.sqrt(this.x * this.x + this.y * this.y);
            this.normalize();
            this.x *= length;
            this.y *= length;
            return this;
        },
        normalize: function() {
            var length = this.length();
            this.x /= length;
            this.y /= length;
            return this;
        }
    };

    var Particle = function() {
        this.position = new Point();
        this.velocity = new Point();
        this.acceleration = new Point();
        this.age = 0;
    };

    Particle.prototype = {
        initialize: function(x, y, dx, dy) {
            this.position.x = x;
            this.position.y = y;
            this.velocity.x = dx;
            this.velocity.y = dy;
            this.acceleration.x = dx * settings.particles.effect;
            this.acceleration.y = dy * settings.particles.effect;
            this.age = 0;
        },
        update: function(deltaTime) {
            this.position.x += this.velocity.x * deltaTime;
            this.position.y += this.velocity.y * deltaTime;
            this.velocity.x += this.acceleration.x * deltaTime;
            this.velocity.y += this.acceleration.y * deltaTime;
            this.age += deltaTime;
        },
        draw: function(context, image) {
            function ease(t) {
                return (--t) * t * t + 1;
            }
            var size = image.width * ease(this.age / settings.particles.duration);
            context.globalAlpha = 1 - this.age / settings.particles.duration;
            context.drawImage(image, this.position.x - size / 2, this.position.y - size / 2, size, size);
        }
    };

    var ParticlePool = (function(length) {
        var particles = new Array(length);
        for (var i = 0; i < particles.length; i++) {
            particles[i] = new Particle();
        }
        var firstActive = 0;
        var firstFree = 0;
        var duration = settings.particles.duration;

        return {
            add: function(x, y, dx, dy) {
                particles[firstFree].initialize(x, y, dx, dy);
                firstFree++;
                if (firstFree === particles.length) firstFree = 0;
                if (firstActive === firstFree) firstActive++;
                if (firstActive === particles.length) firstActive = 0;
            },
            update: function(deltaTime) {
                var i;
                if (firstActive < firstFree) {
                    for (i = firstActive; i < firstFree; i++) {
                        particles[i].update(deltaTime);
                    }
                }
                if (firstFree < firstActive) {
                    for (i = firstActive; i < particles.length; i++) {
                        particles[i].update(deltaTime);
                    }
                    for (i = 0; i < firstFree; i++) {
                        particles[i].update(deltaTime);
                    }
                }
                while (particles[firstActive].age >= duration && firstActive !== firstFree) {
                    firstActive++;
                    if (firstActive === particles.length) firstActive = 0;
                }
            },
            draw: function(context, image) {
                var i;
                if (firstActive < firstFree) {
                    for (i = firstActive; i < firstFree; i++) {
                        particles[i].draw(context, image);
                    }
                }
                if (firstFree < firstActive) {
                    for (i = firstActive; i < particles.length; i++) {
                        particles[i].draw(context, image);
                    }
                    for (i = 0; i < firstFree; i++) {
                        particles[i].draw(context, image);
                    }
                }
            }
        };
    })(settings.particles.length);

    function startHeartEffect() {
        var canvas = heartCanvas;
        var context = canvas.getContext('2d');
        canvas.style.display = 'block';
        canvas.width = canvas.clientWidth;
        canvas.height = canvas.clientHeight;

        heartTextContainer.style.display = 'block';

        var particles = ParticlePool;
        var particleRate = settings.particles.length / settings.particles.duration;
        var time;
        let animationFrameId;

        function pointOnHeart(t) {
            return new Point(
                160 * Math.pow(Math.sin(t), 3),
                130 * Math.cos(t) - 50 * Math.cos(2 * t) - 20 * Math.cos(3 * t) - 10 * Math.cos(4 * t) + 25
            );
        }

        var image = (function() {
            var canvas = document.createElement('canvas'),
                context = canvas.getContext('2d');
            canvas.width = settings.particles.size;
            canvas.height = settings.particles.size;

            function to(t) {
                var point = pointOnHeart(t);
                point.x = settings.particles.size / 2 + point.x * settings.particles.size / 350;
                point.y = settings.particles.size / 2 - point.y * settings.particles.size / 350;
                return point;
            }

            context.beginPath();
            var t = -Math.PI;
            var point = to(t);
            context.moveTo(point.x, point.y);
            while (t < Math.PI) {
                t += 0.01;
                point = to(t);
                context.lineTo(point.x, point.y);
            }
            context.closePath();

            context.fillStyle = '#ea80b0';
            context.fill();

            var image = new Image();
            image.src = canvas.toDataURL();
            return image;
        })();

        function render() {
            animationFrameId = requestAnimationFrame(render);

            var newTime = new Date().getTime() / 1000,
                deltaTime = newTime - (time || newTime);
            time = newTime;

            context.clearRect(0, 0, canvas.width, canvas.height);

            var amount = particleRate * deltaTime;
            for (var i = 0; i < amount; i++) {
                var pos = pointOnHeart(Math.PI - 2 * Math.PI * Math.random());
                var dir = pos.clone().length(settings.particles.velocity);
                particles.add(canvas.width / 2 + pos.x, canvas.height / 2 - pos.y, dir.x, -dir.y);
            }

            particles.update(deltaTime);
            particles.draw(context, image);
        }

        const resizeHandler = () => {
            canvas.width = canvas.clientWidth;
            canvas.height = canvas.clientHeight;
        };
        window.addEventListener('resize', resizeHandler);

        closeButton.addEventListener('click', () => {
             cancelAnimationFrame(animationFrameId);
             window.removeEventListener('resize', resizeHandler);
        });

        render();
    }

    return {
        start: startHeartEffect
    };
}

// ==================== 文字特效 ====================
function initTextEffect() {
    var Drawing = {
        canvas: null,
        context: null,
        renderFn: null,
        requestFrame: window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function(callback) {
                window.setTimeout(callback, 1000 / 60);
            },
        animationFrameId: null,

        init: function(el) {
            this.canvas = textCanvas;
            this.context = this.canvas.getContext('2d');
            this.adjustCanvas();

            const resizeHandler = () => this.adjustCanvas();
            window.addEventListener('resize', resizeHandler);
  
            closeButton.addEventListener('click', () => {
                window.removeEventListener('resize', resizeHandler);
                this.stopLoop();
            });
        },
  
        stopLoop: function() {
            if (this.animationFrameId) {
                window.cancelAnimationFrame(this.animationFrameId);
                this.animationFrameId = null;
            }
        },

        loop: function(fn) {
            this.renderFn = !this.renderFn ? fn : this.renderFn;
            this.clearFrame();
            this.renderFn();
            this.animationFrameId = this.requestFrame.call(window, this.loop.bind(this));
        },

        adjustCanvas: function() {
            this.canvas.width = window.innerWidth;
            this.canvas.height = window.innerHeight;
        },

        clearFrame: function() {
            this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
        },

        getArea: function() {
            return {
                w: this.canvas.width,
                h: this.canvas.height
            };
        },

        drawCircle: function(p, c) {
            this.context.fillStyle = c.render();
            this.context.beginPath();
            this.context.arc(p.x, p.y, p.z, 0, 2 * Math.PI, true);
            this.context.closePath();
            this.context.fill();
        }
    };

    var Point = function(args) {
        this.x = args.x;
        this.y = args.y;
        this.z = args.z;
        this.a = args.a;
        this.h = args.h;
    };

    var Color = function(r, g, b, a) {
        this.r = r;
        this.g = g;
        this.b = b;
        this.a = a;
        this.render = function() {
            return 'rgba(' + this.r + ',' + this.g + ',' + this.b + ',' + this.a + ')';
        };
    };

    var Dot = function(x, y) {
        this.p = new Point({
            x: x,
            y: y,
            z: 5,
            a: 1,
            h: 0
        });

        this.e = 0.07;
        this.s = true;
        this.c = new Color(255, 255, 255, this.p.a);
        this.t = this.clone();
        this.q = [];
    };

    Dot.prototype = {
        clone: function() {
            return new Point({
                x: this.x,
                y: this.y,
                z: this.z,
                a: this.a,
                h: this.h
            });
        },

        _draw: function() {
            this.c.a = this.p.a;
            Drawing.drawCircle(this.p, this.c);
        },

        _moveTowards: function(n) {
            var details = this.distanceTo(n, true),
                dx = details[0],
                dy = details[1],
                d = details[2],
                e = this.e * d;

            if (this.p.h === -1) {
                this.p.x = n.x;
                this.p.y = n.y;
                return true;
            }

            if (d > 1) {
                this.p.x -= ((dx / d) * e);
                this.p.y -= ((dy / d) * e);
            } else {
                if (this.p.h > 0) {
                    this.p.h--;
                } else {
                    return true;
                }
            }

            return false;
        },

        _update: function() {
            if (this._moveTowards(this.t)) {
                var p = this.q.shift();
                if (p) {
                    this.t.x = p.x || this.p.x;
                    this.t.y = p.y || this.p.y;
                    this.t.z = p.z || this.p.z;
                    this.t.a = p.a || this.p.a;
                    this.p.h = p.h || 0;
                } else {
                    if (this.s) {
                        this.p.x -= Math.sin(Math.random() * 3.142);
                        this.p.y -= Math.sin(Math.random() * 3.142);
                    } else {
                        this.move(new Point({
                            x: this.p.x + (Math.random() * 50) - 25,
                            y: this.p.y + (Math.random() * 50) - 25,
                        }));
                    }
                }
            }

            var d = this.p.a - this.t.a;
            this.p.a = Math.max(0.1, this.p.a - (d * 0.05));
            d = this.p.z - this.t.z;
            this.p.z = Math.max(1, this.p.z - (d * 0.05));
        },

        distanceTo: function(n, details) {
            var dx = this.p.x - n.x,
                dy = this.p.y - n.y,
                d = Math.sqrt(dx * dx + dy * dy);

            return details ? [dx, dy, d] : d;
        },

        move: function(p, avoidStatic) {
            if (!avoidStatic || (avoidStatic && this.distanceTo(p) > 1)) {
                this.q.push(p);
            }
        },

        render: function() {
            this._update();
            this._draw();
        }
    };

    var Shape = {
        dots: [],
        width: 0,
        height: 0,
        cx: 0,
        cy: 0,

        compensate: function() {
            var a = Drawing.getArea();
            this.cx = a.w / 2 - this.width / 2;
            this.cy = a.h / 2 - this.height / 2;
        },

        shuffleIdle: function() {
            var a = Drawing.getArea();
            for (var d = 0; d < this.dots.length; d++) {
                if (!this.dots[d].s) {
                    this.dots[d].move({
                        x: Math.random() * a.w,
                        y: Math.random() * a.h
                    });
                }
            }
        },

        switchShape: function(n, fast) {
            var size, a = Drawing.getArea();

            this.width = n.w;
            this.height = n.h;
            this.compensate();

            if (n.dots.length > this.dots.length) {
                size = n.dots.length - this.dots.length;
                for (var d = 1; d <= size; d++) {
                    this.dots.push(new Dot(a.w / 2, a.h / 2));
                }
            }

            var d = 0,
                i;
            while (n.dots.length > 0) {
                i = Math.floor(Math.random() * n.dots.length);
                this.dots[d].e = fast ? 0.25 : (this.dots[d].s ? 0.14 : 0.11);

                if (this.dots[d].s) {
                    this.dots[d].move(new Point({
                        z: Math.random() * 20 + 10,
                        a: Math.random(),
                        h: 18
                    }));
                } else {
                    this.dots[d].move(new Point({
                        z: Math.random() * 5 + 5,
                        h: fast ? 18 : 30
                    }));
                }

                this.dots[d].s = true;
                this.dots[d].move(new Point({
                    x: n.dots[i].x + this.cx,
                    y: n.dots[i].y + this.cy,
                    a: 1,
                    z: 5,
                    h: 0
                }));

                n.dots = n.dots.slice(0, i).concat(n.dots.slice(i + 1));
                d++;
            }

            for (var i = d; i < this.dots.length; i++) {
                if (this.dots[i].s) {
                    this.dots[i].move(new Point({
                        z: Math.random() * 20 + 10,
                        a: Math.random(),
                        h: 20
                    }));

                    this.dots[i].s = false;
                    this.dots[i].e = 0.04;
                    this.dots[i].move(new Point({
                        x: Math.random() * a.w,
                        y: Math.random() * a.h,
                        a: 0.3,
                        z: Math.random() * 4,
                        h: 0
                    }));
                }
            }
        },

        render: function() {
            for (var d = 0; d < this.dots.length; d++) {
                this.dots[d].render();
            }
        }
    };

    var ShapeBuilder = {
        gap: 13,
        shapeCanvas: document.createElement('canvas'),
        shapeContext: null,
        fontSize: 500,
        fontFamily: 'Avenir, Helvetica Neue, Helvetica, Arial, sans-serif',

        init: function() {
            this.shapeContext = this.shapeCanvas.getContext('2d');
            this.fit();
  
            const resizeHandler = () => this.fit();
            window.addEventListener('resize', resizeHandler);

            closeButton.addEventListener('click', () => {
                window.removeEventListener('resize', resizeHandler);
            });
        },

        fit: function() {
            this.shapeCanvas.width = Math.floor(window.innerWidth / this.gap) * this.gap;
            this.shapeCanvas.height = Math.floor(window.innerHeight / this.gap) * this.gap;
            this.shapeContext.fillStyle = 'red';
            this.shapeContext.textBaseline = 'middle';
            this.shapeContext.textAlign = 'center';
        },

        processCanvas: function() {
            var pixels = this.shapeContext.getImageData(0, 0, this.shapeCanvas.width, this.shapeCanvas.height).data;
            var dots = [],
                x = 0,
                y = 0,
                fx = this.shapeCanvas.width,
                fy = this.shapeCanvas.height,
                w = 0,
                h = 0;

            for (var p = 0; p < pixels.length; p += (4 * this.gap)) {
                if (pixels[p + 3] > 0) {
                    dots.push(new Point({
                        x: x,
                        y: y
                    }));

                    w = x > w ? x : w;
                    h = y > h ? y : h;
                    fx = x < fx ? x : fx;
                    fy = y < fy ? y : fy;
                }

                x += this.gap;

                if (x >= this.shapeCanvas.width) {
                    x = 0;
                    y += this.gap;
                    p += this.gap * 4 * this.shapeCanvas.width;
                }
            }

            return {
                dots: dots,
                w: w + fx,
                h: h + fy
            };
        },

        setFontSize: function(s) {
            this.shapeContext.font = 'bold ' + s + 'px ' + this.fontFamily;
        },

        letter: function(l) {
            var s = 0;
            this.setFontSize(this.fontSize);
            s = Math.min(this.fontSize,
                (this.shapeCanvas.width / this.shapeContext.measureText(l).width) * 0.8 * this.fontSize,
                (this.shapeCanvas.height / this.fontSize) * (isFinite(l) ? 1 : 0.45) * this.fontSize);
            this.setFontSize(s);

            this.shapeContext.clearRect(0, 0, this.shapeCanvas.width, this.shapeCanvas.height);
            this.shapeContext.fillText(l, this.shapeCanvas.width / 2, this.shapeCanvas.height / 2);

            return this.processCanvas();
        }
    };
  
  
    let timeouts = [];
    let intervals = [];

    function simulate(sequence) {
        var current;
        var index = 0;

        function next() {
            if (index < sequence.length) {
                current = sequence[index];
                index++;

                if (current === '#countdown 3') {
                    var count = 3;
                    var countdown = setInterval(function() {
                        if (count > 0) {
                            Shape.switchShape(ShapeBuilder.letter(count), true);
                        } else {
                            clearInterval(countdown);
                            next();
                        }
                        count--;
                    }, 1000);
                    intervals.push(countdown);
                } else if (current === '#rectangle') {
                    const timeout = setTimeout(function() {
                        textCanvas.style.display = 'none';
                        var heartEffect = initHeartEffect();
                        heartEffect.start();
                    }, 1000);
                    timeouts.push(timeout);
                } else {
                    Shape.switchShape(ShapeBuilder.letter(current));
                    const timeout = setTimeout(next, 2000);
                    timeouts.push(timeout);
                }
            }
        }
        next();
    }
  
    closeButton.addEventListener('click', () => {
        timeouts.forEach(clearTimeout);
        intervals.forEach(clearInterval);
    });

    Drawing.init('.text-canvas');
    ShapeBuilder.init();
    Drawing.loop(function() {
        Shape.render();
    });
    simulate(customTexts.sequence);
}

// ==================== 初始化所有效果 ====================
initRainEffect();
initTextEffect();

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28446 引用 • 119783 回帖
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • 千千块
    25 引用 • 61 回帖
  • 千千块模板
    8 引用 • 18 回帖
3 操作
lovexmm521 在 2025-09-23 07:45:35 更新了该帖
lovexmm521 在 2025-09-22 19:47:49 更新了该帖
lovexmm521 在 2025-09-22 19:31:19 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 建议顺序——关闭千千块——代码加入文档的普通块里——关闭文档标签——打开千千块——(可以关闭思源笔记)让 ta 打开,再打开那个文档给 ta 个惊喜,然后最后生成的字可以修改一下浪漫的话

  • 分享一段牛逼的代码

    我也分享一个,把代码发给对方,让对方粘贴代码到浏览器地址栏即可,支持手机版

lovexmm521 MOD
窈窕淑女,君子好逑 爱发电:https://afdian.com/a/QianQian517

推荐标签 标签

  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    215 引用 • 358 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4602 回帖 • 731 关注
  • 电影

    这是一个不能说的秘密。

    125 引用 • 610 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 693 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 633 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 443 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 702 关注
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 646 关注
  • 博客

    记录并分享人生的经历。

    274 引用 • 2393 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 494 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 436 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 577 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 46 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 3 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    950 引用 • 1460 回帖 • 2 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 768 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    40 引用 • 157 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注