{"id":7647,"date":"2026-01-14T19:06:28","date_gmt":"2026-01-14T18:06:28","guid":{"rendered":"https:\/\/innovacore.group\/?post_type=portfolio&p=7647"},"modified":"2026-03-17T10:43:15","modified_gmt":"2026-03-17T08:43:15","slug":"qiang-tie","status":"publish","type":"portfolio","link":"https:\/\/innovacore.group\/zh-hans\/portfolio\/qiang-tie\/","title":{"rendered":"Wallpost CRM &#8211; \u7cbe\u7b80\u8fd0\u8425\u5e76\u63d0\u5347\u9500\u552e"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Wallpost CRM is a comprehensive business management solution designed to bridge the gap between complex operations and customer engagement. Going beyond standard CRM features, it integrates sales automation, detailed analytics, and customer support into a single, intuitive interface. Wallpost empowers businesses to efficiently manage the entire customer lifecycle\u2014from lead to service delivery\u2014while providing a seamless user experience that eliminates data silos and operational inefficiencies.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u4f53\u5316\u7684CRM\u548cERP\u5e73\u53f0\uff0c\u7528\u4e8e\u81ea\u52a8\u5316\u9500\u552e\u5e76\u7b80\u5316\u8fd0\u8425\u3002<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"Wallpost CRM","summary":"\u7b80\u5316\u8fd0\u8425 & <span class=\"ic-nycd\">\u63d0\u5347\u9500\u552e<\/span>","mission":"<p>\u4e3a\u6bcf\u4e2a\u4f01\u4e1a\u63d0\u4f9b\u201c\u552f\u4e00\u771f\u5b9e\u7248\u672c\u201d\u3002Wallpost \u7684\u4f7f\u547d\u662f\u901a\u8fc7\u5b9e\u65f6\u6570\u636e\u548c\u81ea\u52a8\u5316\u5de5\u5177\u63d0\u5347\u51b3\u7b56\u8005\u7684\u80fd\u529b\uff0c\u4f7f\u4ed6\u4eec\u80fd\u591f\u4ece\u4e00\u4e2a\u96c6\u4e2d\u4eea\u8868\u677f\u7ba1\u7406\u5176\u5ba2\u6237\u5173\u7cfb\u3001\u5458\u5de5\u548c\u8d22\u52a1\uff0c\u5e76\u5efa\u7acb\u957f\u671f\u7684\u5ba2\u6237\u5173\u7cfb\u3002<\/p>\n","impact":"<p>Wallpost \u6b63\u5728\u8ba9\u4f01\u4e1a\u7ea7\u6548\u7387\u8d70\u5411\u666e\u53ca\uff0c\u60e0\u53ca\u6210\u957f\u4e2d\u7684\u4f01\u4e1a\u3002\u901a\u8fc7\u5c06CRM\u4e0e\u66f4\u5e7f\u6cdb\u7684\u8fd0\u8425\u5de5\u5177\uff08\u5982\u4eba\u529b\u8d44\u6e90\u548c\u8d22\u52a1\uff09\u7ed3\u5408\u5728\u4e00\u8d77\uff0c\u5b83\u5c06\u5206\u6563\u7684\u6570\u636e\u8f6c\u5316\u4e3a\u53ef\u64cd\u4f5c\u7684\u6d1e\u5bdf\uff0c\u663e\u8457\u964d\u4f4e\u884c\u653f\u5f00\u9500\uff0c\u4f7f\u56e2\u961f\u80fd\u591f\u5c06\u5168\u90e8\u7cbe\u529b\u653e\u5728\u589e\u957f\u548c\u5ba2\u6237\u6ee1\u610f\u5ea6\u4e0a\u3002<\/p>\n","company_logo":"https:\/\/innovacore.group\/wp-content\/uploads\/wallpost-logo-innov-innovacore-optimized.jpg","website_url":"https:\/\/wallpostsoftware.com\/","linkedin_url":"https:\/\/www.linkedin.com\/company\/wallpost-software\/https:\/\/www.linkedin.com\/company\/wallpost-software\/","location":"\u7f8e\u56fd \u52a0\u5229\u798f\u5c3c\u4e9a\u5dde \u6b27\u6587\u5e02","founded_year":"2021","key_numbers":{"item-0":{"metric_label":"K+ \u6d3b\u8dc3\u7528\u6237","metric_value":"10"},"item-1":{"metric_label":"+ \u5168\u7403\u5e02\u573a","metric_value":"30"},"item-2":{"metric_label":"+ \u6218\u7565\u4f19\u4f34","metric_value":"70"}},"hiring_status":"\u4fdd\u5bc6\u4e2d","sector":"\u7535\u5b50\u5546\u52a1","company_type":"\u4e2d\u5c0f\u4f01\u4e1a","audience":["b2b"],"geo_scope":["\u5168\u7403"],"business_model":["saas"],"funding_stage":"\u5c1a\u672a\u62ab\u9732","partnership_type":"\u521b\u5efa\u4e2d","logo_animation":"<div id=\"wallpost-particle-root\">rn    <canvas id=\"wallpostCanvas\"><\/canvas>rn<\/div>rnrn<style>rn    #wallpost-particle-root {rn        width: 100%;rn        height: 300px; \/* Hauteur fixe respect\u00e9e *\/rn        display: flex;rn        justify-content: center;rn        align-items: center;rn        background: transparent;rn        overflow: hidden;rn        cursor: crosshair;rn    }rn<\/style>rnrn<script>rn(function() {rn    const canvas = document.getElementById('wallpostCanvas');rn    const ctx = canvas.getContext('2d', { willReadFrequently: true });rn    const root = document.getElementById('wallpost-particle-root');rn    rn    let width, height;rn    let particles = [];rn    let mouse = { x: -1000, y: -1000 };rn    const particleColor = '#f5f5f5'; \/\/ Gris clair Innovacorern    let time = 0;rnrn    function init() {rn        width = root.offsetWidth;rn        height = 300;rn        rn        const dpr = window.devicePixelRatio || 1;rn        canvas.width = width * dpr;rn        canvas.height = height * dpr;rn        canvas.style.width = width + 'px';rn        canvas.style.height = height + 'px';rn        ctx.scale(dpr, dpr);rnrn        createLogoParticles();rn    }rnrn    function createLogoParticles() {rn        particles = [];rn        const cx = width \/ 2;rn        const cy = height \/ 2;rn        const isMobile = width < 600;rnrn        \/\/ --- 1. CONFIGURATION ---rn        \/\/ Dimensionsrn        const iconRadius = isMobile ? 35 : 50; rn        const fontSizeMain = isMobile ? 35 : 50;rn        const fontSizeSub = isMobile ? 12 : 16;rn        const gap = 25; \/\/ Espace entre ic\u00f4ne et texternrn        \/\/ On dessine en blanc pour le scanrn        ctx.fillStyle = 'white';rn        ctx.textAlign = 'center';rn        ctx.textBaseline = 'middle';rnrn        \/\/ Position verticale globale pour centrer le bloc (Icone + Texte + Baseline)rn        \/\/ Hauteur approx: (IconRadius*2) + gap + fontSizeMain + fontSizeSubrn        const totalHeight = (iconRadius * 2) + gap + fontSizeMain + fontSizeSub;rn        const startY = cy - (totalHeight \/ 2) + iconRadius; \/\/ Centre de l'ic\u00f4nernrn        \/\/ --- 2. DESSIN DE L'IC\u00d4NE (Cercle avec W n\u00e9gatif) ---rn        const iconY = startY;rn        rn        \/\/ A. Le Cercle pleinrn        ctx.beginPath();rn        ctx.arc(cx, iconY, iconRadius, 0, Math.PI * 2);rn        ctx.fill();rnrn        \/\/ B. Le \"W\" (Espace n\u00e9gatif)rn        ctx.globalCompositeOperation = 'destination-out'; \/\/ Mode \"Gomme\"rn        ctx.lineWidth = iconRadius * 0.25; \/\/ \u00c9paisseur des traits du Wrn        ctx.lineCap = 'round';rnrn        \/\/ On dessine 3 lignes pour faire le W stylis\u00e9rn        \/\/ Ligne 1 (gauche)rn        ctx.beginPath();rn        ctx.moveTo(cx - iconRadius * 0.4, iconY - iconRadius * 0.3);rn        ctx.lineTo(cx - iconRadius * 0.2, iconY + iconRadius * 0.4);rn        ctx.stroke();rnrn        \/\/ Ligne 2 (milieu)rn        ctx.beginPath();rn        ctx.moveTo(cx, iconY - iconRadius * 0.3);rn        ctx.lineTo(cx + iconRadius * 0.2, iconY + iconRadius * 0.4);rn        ctx.stroke();rnrn        \/\/ Ligne 3 (droite - plus courte pour le point ?)rn        ctx.beginPath();rn        ctx.moveTo(cx + iconRadius * 0.4, iconY - iconRadius * 0.3);rn        ctx.lineTo(cx + iconRadius * 0.6, iconY + iconRadius * 0.1); \/\/ Plus courtrn        ctx.stroke();rnrn        \/\/ Le petit point de notif\/pin (si pr\u00e9sent dans le W)rn        \/\/ On gomme un petit rondrn        \/\/ ctx.beginPath();rn        \/\/ ctx.arc(cx + iconRadius * 0.5, iconY - iconRadius * 0.4, iconRadius * 0.1, 0, Math.PI*2);rn        \/\/ ctx.fill();rnrn        \/\/ Retour au mode normalrn        ctx.globalCompositeOperation = 'source-over';rnrnrn        \/\/ --- 3. DESSIN DU TEXTE ---rn        const textY = iconY + iconRadius + gap;rnrn        \/\/ \"WallPost\"rn        ctx.font = `bold ${fontSizeMain}px Arial, Helvetica, sans-serif`;rn        ctx.fillText('WallPost', cx, textY);rnrn        \/\/ Baseline \"Work Smart, Work Fast\"rn        const subY = textY + fontSizeMain * 0.8;rn        ctx.font = `normal ${fontSizeSub}px Arial, Helvetica, sans-serif`;rn        \/\/ On espace un peu les lettres pour la lisibilit\u00e9 de la baselinern        \/\/ Note: letter-spacing ne marche pas bien en canvas standard, on fait simplern        ctx.fillText('Work Smart, Work Fast', cx, subY);rnrnrn        \/\/ --- 4. SCAN DES PIXELS ---rn        const density = 4;rn        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;rn        const dataWidth = canvas.width; rnrn        for (let y = 0; y < canvas.height; y += density) {rn            for (let x = 0; x < canvas.width; x += density) {rn                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {rn                    const dpr = window.devicePixelRatio || 1;rn                    particles.push({rn                        x: x \/ dpr,rn                        y: y \/ dpr,rn                        originX: x \/ dpr,rn                        originY: y \/ dpr,rn                        vx: 0, rn                        vy: 0,rn                        size: Math.random() * 1.5 + 0.5,rn                        force: Math.random() rn                    });rn                }rn            }rn        }rn        rn        \/\/ Nettoyagern        ctx.clearRect(0, 0, width, height);rn    }rnrn    function draw() {rn        ctx.clearRect(0, 0, width, height);rn        time += 0.05;rnrn        ctx.fillStyle = particleColor;rn        rn        particles.forEach(p => {rn            \/\/ 1. Respirationrn            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;rn            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;rnrn            \/\/ 2. Interactionrn            const dx = mouse.x - p.x;rn            const dy = mouse.y - p.y;rn            const dist = Math.sqrt(dx*dx + dy*dy);rn            const radius = 80;rn            rn            let repelX = 0;rn            let repelY = 0;rnrn            if (dist < radius) {rn                const force = (radius - dist) \/ radius;rn                const angle = Math.atan2(dy, dx);rn                repelX = -Math.cos(angle) * force * 20;rn                repelY = -Math.sin(angle) * force * 20;rn            }rnrn            \/\/ 3. Physiquern            const targetX = p.originX + waveX;rn            const targetY = p.originY + waveY;rnrn            const ax = (targetX - p.x) * 0.08;rn            const ay = (targetY - p.y) * 0.08;rnrn            p.vx += ax;rn            p.vy += ay;rn            p.vx += repelX * 0.5;rn            p.vy += repelY * 0.5;rn            p.vx *= 0.85; rnrn            p.x += p.vx;rn            p.y += p.vy;rnrn            ctx.beginPath();rn            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);rn            ctx.fill();rn        });rnrn        requestAnimationFrame(draw);rn    }rnrn    const updateMouse = (e) => {rn        const r = canvas.getBoundingClientRect();rn        const cx = e.touches ? e.touches[0].clientX : e.clientX;rn        const cy = e.touches ? e.touches[0].clientY : e.clientY;rn        mouse.x = cx - r.left;rn        mouse.y = cy - r.top;rn    };rnrn    window.addEventListener('resize', init);rn    canvas.addEventListener('mousemove', updateMouse);rn    canvas.addEventListener('touchmove', updateMouse, {passive: true});rn    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });rn    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });rnrn    setTimeout(init, 50);rn    draw();rn})();rn<\/script>"},"pt":[],"pipeline":[],"class_list":["post-7647","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/portfolio\/7647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/portfolio\/7647\/revisions"}],"predecessor-version":[{"id":7648,"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/portfolio\/7647\/revisions\/7648"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/media?parent=7647"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/pt?post=7647"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/innovacore.group\/zh-hans\/wp-json\/wp\/v2\/pipeline?post=7647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}