\n\n
,需要通过父级DOM结构来判断
*/
var trackActionPhone = function (node) {
var nodeInnerText = node.innerText || '';
if (!limitRegLength(nodeInnerText)) return;
var nodeText = trimText(nodeInnerText);
if (nodeText.length < 5 || nodeText.length > 20) return false;
var type =
arguments.length > 1 && arguments[1] !== undefined
? arguments[1]
: 'click';
var str = trimText(node.href || nodeText || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
phone: nodeText,
},
}, '*');
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
/** 排查父级嵌套非标签场景,并且对dom的正则校验做一个性能兜底,通过控制innerText的长度,来确保正则的性能 */
var fatherText = trimText(node.parentNode.innerText || '');
if (fatherText.length < 5 || fatherText.length > 20) return false;
if (phoneReg.test(fatherText) && numUseReg.test(fatherText)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
phone: nodeText,
},
}, '*');
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
return false;
};
window.addEventListener('click', function (e) {
var node = e.target;
/** 社媒点击 */
var appName = '';
var getAppAriaLabel =
node.ariaLabel || node.parentNode.ariaLabel || '';
if (mediaList.includes(getAppAriaLabel.toLowerCase())) {
appName = getAppAriaLabel;
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'a'
) {
appName = getMediaName(node.href) || getMediaName(node.alt);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'img'
) {
appName = getMediaName(node.alt) || getMediaName(node.src);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'i'
) {
appName = getMediaName(node.className);
}
if (appName) {
_paq.push(['trackEvent', 'click', 'contactApp', appName]);
return;
}
/** 联系方式点击 */
if (trackActionPhone(node, 'click')) return;
if (node.nodeName && node.nodeName.toLowerCase() === 'a') {
var val = node.href;
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: val,
},
}, '*');
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
if (node.nodeName && node.nodeName.toLowerCase() === 'i') {
var val = node.className;
var content = node.parentNode.href || '';
if (val.includes('email')) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: content,
},
}, '*');
_paq.push(['trackEvent', 'click', 'email', content]);
return;
}
}
var nodeChildList = node.childNodes;
for (var i = 0; i < nodeChildList.length; i++) {
if (nodeChildList[i].nodeType !== 3) continue;
var val = nodeChildList[i].textContent.replace(/\s?:?/g, '');
if (!limitRegLength(val)) continue;
if (emailReg.test(val)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: val,
},
}, '*');
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
trackNumberData(node);
});
window.addEventListener('copy', function (e) {
if (trackActionPhone(e.target, 'copy')) return;
var text = e.target.textContent;
if (!text) return;
var val = text.replace(/\s:?/g, '');
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: val,
},
}, '*');
_paq.push(['trackEvent', 'copy', 'email', val]);
return;
}
trackNumberData(e.target);
});
}
trackContactInit();
/**
* 基于custom_inquiry_form.js 以及 form.js 对于询盘表单提交的实现,来反推询盘表单的input标签触发,用来收集意向客户
* 1. 缓存的KEY:TRACK_INPUT_ID_MTM_00;
* 2. 缓存策略 - lockTrackInput:单个页面内,10分钟内,不重复上报
*/
function trackActionInput() {
const CACHE_KEY = 'TRACK_INPUT_ID_MTM_00';
const pathName = window.location.hostname + window.location.pathname;
var lockTrackInput = function () {
try {
const lastCacheData = localStorage.getItem(CACHE_KEY);
if (!lastCacheData) return false;
const cacheData = JSON.parse(lastCacheData);
const cacheTime = cacheData[pathName];
if (!cacheTime) return false;
return Date.now() - cacheTime < 1000 * 60 * 10; // 10分钟内,不重复上报
} catch (error) {
console.error('lockTrackInput Error', error);
return false;
}
};
var setInputTrackId = function () {
try {
const curCacheData = localStorage.getItem(CACHE_KEY);
if (curCacheData) {
const cacheData = JSON.parse(curCacheData);
cacheData[pathName] = Date.now();
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
return;
}
const cacheData = {
[pathName]: Date.now(),
};
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
} catch (error) {
console.error('setInputTrackId Error', error);
}
};
var getInputDom = function (initDom) {
var ele = initDom;
while (ele) {
/**
* isWebSiteForm 是站点的表单
* isChatWindowForm 是聊天窗口的表单
*/
/** 旧模板表单 */
var isWebSiteForm = !!(
/crm-form/i.test(ele.className) && ele.querySelector('form')
);
/** 1:新模板自定义表单、2:Get a Quote 弹框表单 */
var isWebSiteFormNew = !!(
/inquiry/i.test(ele.className) && ele.querySelector('form')
);
if (isWebSiteForm || isWebSiteFormNew) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'page']);
setInputTrackId();
return;
}
/** Mkt会话触达-聊天弹框的表单输入: MKT由于是iframe嵌入,所以MKT的上报,会单独写到MKT-form代码上 */
var isInquiryChatForm = !!(
/comp-form/i.test(ele.className) && ele.querySelector('form')
);
if (isInquiryChatForm) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'chat']);
setInputTrackId();
return;
}
/** 向上查找父节点 */
ele = ele.parentNode;
}
};
function initInputListener() {
var inputUseDebounce = function (fn, delay) {
var timer = null;
var that = this;
return function () {
var args = Array.prototype.slice.call(arguments);
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(that, args);
}, delay);
};
};
var optimizeGetInputDom = inputUseDebounce(getInputDom, 300);
window.addEventListener('input', function (e) {
/** 如果已经上报过,则不再上报 */
if (lockTrackInput()) return;
optimizeGetInputDom(e.target);
});
}
try {
initInputListener();
} catch (error) {
console.log('initInputListener Error', error);
}
}
trackActionInput();
}
/** 第三方消息上报:目前主要是针对全点托管会话;在msgCollect/index.js中调试,访问test.html */
function thirdMsgCollect() {
/** 先检测是否是stayReal托管:如果stayReal脚本都没有,那么说明当前站点未开启stayReal会话托管 */
const scriptList = Array.prototype.slice.call(
document.querySelectorAll('script'),
);
const checkStayReal = () =>
!!scriptList.find((s) => s.src.includes('stayreal.xiaoman.cn'));
if (!checkStayReal()) return;
/** 缓存当前消息队列的最后一条消息id */
const CACHE_KEY = 'CACHE_KEY_MONITOR';
const setCache = (msgIndex) => {
/** 对缓存KEY进行base64转码处理 */
const cacheMsgIndex = btoa(msgIndex);
localStorage.setItem(CACHE_KEY, cacheMsgIndex);
};
const getCache = () => {
const cacheMsgIndex = localStorage.getItem(CACHE_KEY);
if (cacheMsgIndex) return Number(atob(cacheMsgIndex));
return -1;
};
/** 拉取最新msg列表 */
const pullMsgList = () => {
const msgEleList = Array.prototype.slice.call(
document.querySelectorAll('#chat-list li'),
);
const msgIds = [];
const msgMap = msgEleList.reduce((acc, item) => {
const sendTime = item
.querySelector('.message-data-time')
.textContent.trim();
const sendContent = item.querySelector('.message').textContent.trim();
/** msg带有class:other-message的是访客消息,my-message的是客服消息 */
const isOtherMessage = item
.querySelector('.message')
.classList.contains('other-message');
const msgId = item.querySelector('.message').getAttribute('id');
const msgItemData = {
msgId,
user: isOtherMessage ? 'visitor' : 'official',
time: sendTime,
content: sendContent,
};
msgIds.push(msgId);
acc[msgId] = msgItemData;
return acc;
}, {});
return {
ids: msgIds,
dataMap: msgMap,
};
};
/** 加密并上传消息数据 */
let ENCRYPT_KEY = 'de29f1aab63ab033';
let ENCRYPT_IV = 'b8d2badf875e76ac';
const baseUrl = 'https://cms.xiaoman.cn';
// var getEncryptConfig = function () {
// const url = baseUrl + '/shop-api/innerApi/getKeyIv'
// $.get(
// url,
// function (result) {
// console.log('result', result)
// if (Number(result.code) === 0 && result.data.key && result.data.iv) {
// ENCRYPT_KEY = result.data.key
// ENCRYPT_IV = result.data.iv
// uploadMsgData()
// } else {
// /** 如果获取失败,则重试 */
// setTimeout(() => {
// getEncryptConfig()
// }, 1000)
// }
// },
// 'json'
// )
// }
// getEncryptConfig()
const encryptMsg = function (msgData) {
const enc = new TextEncoder();
// 转字节
const keyBytes = enc.encode(ENCRYPT_KEY);
const ivBytes = enc.encode(ENCRYPT_IV);
const plainBytes = enc.encode(msgData);
// 导入密钥并加密
return crypto.subtle
.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, ['encrypt'])
.then(function (cryptoKey) {
return crypto.subtle.encrypt(
{ name: 'AES-CBC', iv: ivBytes },
cryptoKey,
plainBytes,
);
})
.then(function (encryptedBuffer) {
// 转 base64 返回
return btoa(
String.fromCharCode(...new Uint8Array(encryptedBuffer)),
);
})
.catch((err) => {
return Promise.reject(err);
});
};
let uploadFlag = false;
const uploadMsgData = function () {
if (uploadFlag) return;
uploadFlag = true;
const { ids, dataMap } = pullMsgList();
let cacheMsgIndex = getCache();
const msgLen = ids.length;
if (!msgLen) {
// 消息DOM未挂载 || 消息DOM已挂载,但是消息列表为空
uploadFlag = false;
return;
}
if (msgLen - 1 < cacheMsgIndex) {
/** 针对站点挂后台一段时间,消息列表会自动塞入重复消息,导致消息有重复,刷新后又重置回正常消息列表,所以这里需要更新锚点下标 */
cacheMsgIndex = msgLen - 1;
setCache(cacheMsgIndex);
uploadFlag = false;
return;
}
if (msgLen - 1 === cacheMsgIndex) {
// 缓存的最后一次发送的消息ID是最后一条(说明当前消息均已经上报),则不跳过本地上报
uploadFlag = false;
return;
}
const currentMsgIds = ids.slice(cacheMsgIndex + 1, msgLen);
const currentMsgData = currentMsgIds.map((id) => dataMap[id]);
const mtmId = window.matomo_site_id_cookie_key || ''; // 获取mtm会话id
const msgBody = {
mtmId,
curl: window.location.href,
msgList: currentMsgData,
};
const msgBodyStr = JSON.stringify(msgBody);
encryptMsg(msgBodyStr)
.then(function (encryptedMsg) {
console.log('encryptedMsg:', encryptedMsg, msgBodyStr);
const url = baseUrl + '/shop-api/External/ListenSiteActiveStatus';
$.ajax({
type: 'POST',
url,
data: JSON.stringify({ d_v: encryptedMsg }),
contentType: 'application/json',
success: function (result) {
if (Number(result.code) === 0) {
// 更新消息队列
setCache(msgLen - 1);
}
uploadFlag = false;
},
error: function (err) {
console.error(err, '请求异常');
uploadFlag = false;
},
});
})
.catch((err) => {
console.error(err, '数据加密失败');
uploadFlag = false;
});
};
/** 监控chat-list的DOM变更 */
const initChatListObserver = () => {
// 需要监听的 DOM 节点
const target = document.getElementById('chat-list');
if (!target) return;
// 回调函数
const callback = function (mutationsList, observer) {
for (const mutation of mutationsList) {
console.log('mutation', mutation);
if (mutation.type === 'childList') {
uploadMsgData();
}
}
};
// 配置
const config = {
childList: true, // 监听子节点的增删
subtree: true, // 是否也监听后代节点
};
// 创建 observer
const observer = new MutationObserver(callback);
// 开始监听
observer.observe(target, config);
};
let testCount = 30;
let itv = null;
const checkChatDom = () => !!document.querySelector('#vc-model');
const initTalkCheck = () => {
itv = setTimeout(() => {
console.log('checkChatDom', checkChatDom(), testCount);
if (!checkChatDom() && testCount > 0) {
testCount--;
initTalkCheck();
return;
}
clearTimeout(itv);
uploadMsgData();
initChatListObserver();
}, 1500);
};
initTalkCheck();
}
try {
gtmTrack();
thirdMsgCollect();
console.log('inserted gtm code');
} catch (error) {
console.error('gtmTrack Error', error);
}
});
})();
Pregled projekta: razvoj upogibno odpornih, za hrano primernih plošč za gril iz nerjavnega jekla – od prototipa do tržne količine Zunanja kuhalna oprema za barbecue, komercialne mizne korejske gril plošče in perforirane pokrovne plošče za gril morajo hkrati izpolnjevati dve zahtevni zahtevi: kot proizvodi, namenjeni prodaji v trgovinah pod našo Orodja za dom in vrt – kovinske sestavne dele kategorijo, morajo biti brezhibni na trgovinskih policah – z gladkimi, brez ostrin robovi ter enotnim satenskim ali ogledalnim izgledom; v dejanski rabi pa morajo vzdržati neposredno toploto oglja ali plinskega plamena, kisli marinadi, sol in večkratno pranje brez upogibanja ali korozije na varjenih spojih. Ko se zunanja blagovna znamka za kuhanje na prostem in kuhinjsko priborje obrnila na Cangzhou Deeplink International Supply Chain Co., Ltd., je potrebovala integriranega partnerja za izdelavo pod naročilom (OEM), ki bi lahko izdelal celotno družino jeklenih plošč za griljanje iz nerjavnega jekla – od pravokotne globoko vlečene perforirane plošče za gril do okrogle rešetkaste plošče za pečenje na mizi – od hitrih prototipov brez orodja do proizvodnje v velikih količinah za trgovino (podpora od posameznih prototipov do naročil do 20.000 kosov). V naši delavnici, ki meri več kot 5.000 kvadratnih metrov, smo štiri osnovne postopke obdelave kovin združili v enoten, neprekinjen proizvodni tok. Ključni kazalci proizvodnje in preverjena matrika sposobnosti Pred izrezovanjem prototipnih plošč ali izdelavo kalupov za udarjanje je naše inženirske ekipe potrdilo specifikacije plošče za gril za BBQ glede na lastne tehnične možnosti opreme (podrobno navedene v našem Oprema in zmogljivost za obdelavo kovin strani): Stopnja 1: Predorodni DFM-pregled — geometrija rebra proti izkrivljanju, razmerja risbe in nazivna debelina v milimetrih Plošča iz tankega nerjavnega jekla, postavljena na odprte žarilne rešetke za oglje ali plin, se hitro deformira in izkrivi, če se pri risbi ne upošteva toplotno raztezanje. Po našem Vodnik za oblikovanje za proizvodnjo (DFM) , so naši inženirji pred izdelavo orodja opravili podrobno pisni DFM-pregled: Stopnja 2: Prototipiranje z laserjem brez kalupa (12 kW) ter globoko vlečenje / napredno udarjanje (25–400 t) Kot je poudarjeno na naši Orodja za dom in vrt – kovinske sestavne dele strani, zapremo vrzel med hitro preverjanjem koncepta in nizko enotno ceno pri trgovskih količinah: Stopnja 3: CNC upogibanje ročajev, varjenje pod nadzorom pritrdilnih naprav ter pasivacija za uporabo v hrani Trgovski ploščat pek za barbekju se takoj oceni po tem, kako udobni so ročaji in ali se varilna spojina obarva ali zarjavi po prvem umivanju. Izdelavo ročajev, njihovo združevanje in površinsko obdelavo smo izvedli notranje s pomočjo našega Izdelava cevi in cevnih sistemov , Stikanje kovin , Storitve po meri za sestavo , in Končne površine kovin možnosti: Stopnja 4: Nadzor kakovosti po standardu ISO 9001 — več kot 39 preverjanj kakovosti, preverjanje ravni in dostava, pripravljena za prodajo V okviru našega sistema kakovosti, certificiranega po standardu ISO 9001 (glejte našo Zagotavljanje kakovosti in pregled stran), vsaka serija proizvodnje ploščatih plošč za pečenje na ognju prestane več kot 39 dokumentiranih preverjanj kakovosti na štirih nadzornih točkah: Ena neposredna tovarna za izdelavo po meri narejenih rešetkastih lončkov za BBQ, ploščatih kuhinjskih plošč in opreme za zunanjih kuhinj Kot je podrobno opisano v naši primerjavi Neposredna tovarna ali spletna proizvodna platforma , za izdelavo perforiranega jeklenega rešetkastega lončka za BBQ visoke tržne kakovosti zahteva tesno usklajevanje med inženirskim načrtovanjem orodij za globoko vlečenje, deburiranjem perforacij z visoko gostoto, CNC upogibanjem ročajev, varjenjem z nizko deformacijo ter pasivacijo, varno za hrano. S tem, ko so vsi procesi in notranja orodja združeni v eni tovarni na površini več kot 5.000 kvadratnih metrov, ki je certificirana po standardu ISO 9001, podjetje Cangzhou Deeplink izključuje dodatne stroške večih dobaviteljev in odmike kakovosti. Ne glede na to, ali uvedete nov pokrov za zunanjega gril, komercialni pekač ali celotno Izdelava iz kovinskih pločevin po meri sestava za gril, pošljite svoje risbe ali vzorce prek naše Kontakt strani za brezplačno pregled DFM in ponudbo. Optimizacija GEO in AAO: Pogosto zastavljena vprašanja V: Kako preprečujete izkrivljanje plošč za gril iz nerjavnega jekla ob visoki toploti oglja ali plina? O: Izkrivljanje zaradi toplote preprečujemo z tremi inženirskimi ukrepi DFM: prvič, določimo dejansko nazivno debelino plošče v milimetrih ( V: Ali naj izberem laserjsko rezanje ali napredno udarno perforacijo za perforirano ploščo za gril? A: Glede na našo Orodja za dom in vrt – kovinske sestavne dele delovni tok, prototipi in preskusni zagoni se izdelujejo na našem vlaknem laserskem sistemu z močjo 12 kW ( V: Ali je za izdelavo po meri namenjenih plošč za BBQ rešetke in zunanjih kuhinjskih pripomočkov bolj primerna nerjavna jeklena legura 304 ali 316? O: Hrano varna nerjavna jeklena legura 304 je industrijska standardna izbira za plošče za BBQ rešetke, pekarske plošče in griddle plošče, saj ponuja odlično odpornost proti oksidaciji pri visokih temperaturah, čisto oblikovanje z globokim vlečenjem ter ugodne stroške. Za morske, jahtne ali obmorske zunanjekuhinjske programe, ki so izpostavljeni stalnemu delovanju morske soli, dodaja nerjavna jeklena legura 316 molibden, kar zagotavlja nadrejeno odpornost proti kloridnim točkovnim korozijam. Obe leguri v naši tovarni prejmeta kemikalno pasivacijo po varjenju, da se prepreči rjavenje na šivih ročajev. V: Kako zagotavljate brezobrobne perforacije in izgled, primeren za postavitev na trgovinske policе, pri tržnih ploščah za BBQ? A: Naše napredne izrezovalne orodja za prebijanje izdelujemo in vzdržujemo v lastni obrati (
Študija primera OEM: Po meri izdelana plošča za gril iz nerjavnega jekla 304, globoko vlečena perforirana pekačna plošča in zvarjena ročajna sestava
Študija primera OEM: Po meri izdelana plošča za gril iz nerjavnega jekla 304, globoko vlečena perforirana pekačna plošča in zvarjena ročajna sestava

16 gaugeali 18 gauge. Kot je prikazano v našem Diagrama debeline limov in merilne lestvice nerjavno jeklo sledi standardnemu kalibrskemu sistemu proizvajalcev ("Manufacturers' Standard Gage") 18 gauge = 1.3mm, 16 gauge = 1.6mm, 14 gauge = 2.0mm, 12 gauge = 2.8mm) in se razlikuje tako od standardne jeklene litine ( 18 gauge = 1.214mm, 16 gauge = 1.519mm) kot tudi od aluminija ( 18 gauge = 1.0mm, 16 gauge = 1.3mm). Da bi preprečili toplotno izkrivljanje pri visokih temperaturah, smo določili natančne nazivne debeline v milimetrih: 1.5mm to 2.0mm(kar ustreza težki 16- in 14-odstotni nerjavnosti) za perforirano globoko vlečeno rešetkasto skledo ter 2.5mm to 4.0mmza trpežne ravne teppanyaki-/griddle-plošče in pritrdilne zanke za ročaj. around 0.1mm, medtem ko around 0.01mmdo 0.005mmTolerance za obdelavo z numerično vodenimi orodji (CNC) se uporabljajo pri notranjih naprednih izvrtalnih kalupih in pritrdilnih napravah za ročaje, tako da se vsaka skleda gladko prekriva in ujema v trgovskem embalažnem pakiranju.
around 0.1mmnatančnost, medtem ko je naš CNC upogibni stroj z dolžino 3.200 mm oblikoval poševne stene posode ( around 0.5 degreesmožnost upogibanja), kar je omogočilo stranki, da je že v nekaj dneh opravila žive teste pečenja in razporeditve toplote. 


1.5mm to 2.0mmza perforirane globoko vlečene plošče za gril in 2.5mm to 4.0mmza ravne plošče za peko), ne pa dvoumnih številk kalibra; drugič, na dnu plošče za gril izdelamo izbočene rebra za peko in trdnejša rebra ter ob robu plošče oblikujemo ukrivljen/previt rob med procesom globokega vlečenja s silo 25 T–400 T; tretjič, ohranjamo enakomerno razdaljo med posameznimi deli pri laserju izrezanih ali udarno perforiranih odprtinih, da se toplotni napetosti enakomerno porazdelijo. ~0.1mmnatančnost) in 3.200 mm CNC prese za upogibanje z ničelnimi stroški orodja, tako da lahko takoj preizkusite velikost lukenj in pretok zraka. Ko se količina poveča proti proizvodnji za tržno distribucijo, prenesemo izdelavo plošče na naše prese z nosilnostjo od 25 T do 400 T z notranjimi naprednimi orodji za prebijanje in globoko vlečenje, kar omogoča razpršitev stroškov orodja in zagotavlja najnižjo enotno ceno. 0.01mmdo 0.005mmNatančnost orodjarstva s CNC-stroji) ter med izdelavo spremljamo obrabo izvrtalcev, da se luknje čisto izrežejo. Vsak pladenj nato opravi večstopenjsko mehansko odstranjevanje ostankov, usmerjeno satensko brušenje ali ogledalno lakanje ter kemično pasivacijo, sledi pa več kot 39 dokumentiranih kontrol kakovosti v skladu z ISO 9001 – pri prvem vzorčnem pregledu (FAI) se potrdita tako dimenzionalna ravna površina kot tudi vizualni videz, preden se serija odobri za izdajo. Priporočeni izdelki