нь ...">
,需要通过父级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 || node.innerHTML || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
_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;
var fatherDom = trimText(node.parentNode.innerHTML || '');
if (phoneReg.test(fatherDom) && numUseReg.test(fatherDom)) {
_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)) {
_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')) {
_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)) {
_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)) {
_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);
}
});
})();
Үнэхээр, үнэ өсч, нөөц хомсдож буй энэ үед контейнерийн өрөө зөвхөн нэг л боломжит сайн тус болж чадна. Хуучин контейнерүүдээс барьсан стилтэй контейнерийн байшин — өвөрмөц, хүйтэн загварын амьдрах орон. Бид эдгээр контейнерийг гэрийн зориулалтаар ашиглах талаар илүү их мэдээлэл цуглууллаа. Орчин үед дэлхийд сая сая ачааны контейнерууд байдаг. Гэсэн хэдий ч тэдгээрийн хангалттай хэсэг нь одоо ашиглагдахгүй байгаа бөгөөд хүмүүс тэдгээрийг шинэ, өөр өөр арга замаар ашиглах арга замыг олж байна. Зарим иргэд тэдгээрийг суурин байранд хувиргах талаар санаа тавьж байсан. Энэ нь шинэ зүйлсийг бий болгох зорилгоор зүйлсийг хамтад нь цуглуулах донгослонд үндэслэн дахин боловсруулах/байгуулалтын арга замаар шийдвэр гаргаж буй юм шиг санагддаг. гэхдээ хэрэгцээгүй болсон савыг шидэж байх шаардлагагүй. Зөвхөн ийм савыг дулаан, сайхан амьдрах орчин болгон хувиргах зөв хүмүүс л хэрэгтэй. Унтлагын өрөө, ванн, гал тогоо, зочны өрөө зэрэг цэнгэлгүй гэрт байдаг бүхнээр хангамжтай байшин. Хуучин контейнерийг жижигхэн ажиллагаагаар ийм өвөрмөц байшингууд болгон хувиргаж болохыг үзэх нь гайхалтай биш юу? Контейнерийн байшингийн амьдрал элегант, сонирхолтой байж болно. Энэ нь ган хайрцаг дотор амьдрах мэт! Ийм байшингийн архитектур нь тэдгээрийн загвар, хэлбэрээр маш их ялгардаг. Гэсэн хэдий ч зарим сул талууд ч бас байдаг. Үнэндээ том ган хайрцаг шиг тул контейнерүүд халах, хөрөх явцад ихэд хэлбэлзэх тул нэмэлт дулааныг шаарддаг. Мөн цонхны тоогоор сайн гэрэлтүүлэгддэггүй байх боломжтой тул гэрлийг нэмэгдүүлэх нь маш чухал. Контейнерийн байшин бол хамгийн гоё, хамгийн олон талт амьдрах орчин юм. Тэдгээрийг хооронд нь хэсэгчлэн холбох, давхарлах эсвэл янз бүрийн хэлбэр, хэмжээтэй болгон огтлох боломжтой. Эдгээр контейнерийн байшингууд ихэнхдээ нэг талаасаа ердийн байшингийн адил харагдахад нөгөө талаасаа орчин үеийн байшин эсвэл ирээдүйн байшин шиг харагддаг. Багтаамжийн байшин барих дизайн хийхэд бүх л дижитал архитекторуудын чадварлаг ухаан оролцож байна. Хүмүүс яагаад контейнерийн байшин руу шилжихийг дуртай вэ? Хүмүүсийн ихэнх нь дахин боловсруулах, орчныг хамгаалах ач холбогдолтой. Бусад хүмүүс санхүүгийн хувьд хэмнэлттэй байхыг хүсдэг тул ийм байшин барина. Зарим хүмүүст контейнерийн байшингийн гадаад дүр төрх, мэдрэмж тэднийг татдаг. Ямар ч шалтгаантай байсан, контейнерийн байшинд амьдрах давуу талуудад анхаарал хандуулж буй контейнерийн өрөө хурдан өсөн нэмэгдэж байна. Apple ордон, үл хуулийн хэлбэр, гоё гадаад хүч, таны ордныг илүү хувийн болгоно. Бид таны сонирхолд нийцүүлж, хялбар үндэсний хүчнээс хүртэл уламжлалт хүчнээс хүртэл өнгө ба загварын өргөн спектр саналд тавьж бүүн. Пекин Чэндунгийн анхаарал хэрэглэгчдийн хүссэн зүйлс ба шаардлагад төвлөрсөн. Таны шаардлагад нийцүүлж хийн хүчнээс хүртэл цахилгаан, усны шугамын байршлыг өөрчлөх боломжтой. Таны хүссэн зүйлс ба сонирхолд нийцүүлж ордонгийн дотоод байршлын хэлбэр, ус, цахилгааны шугамын байршлыг өөрчлөх боломжтой, үүнээр танд зөвхөн таарах гоё ордонг бүтээх боломжтой. Ус, цахилгааны шугамыг урьдчилан бүтээх нь ордонгийн дотоод бүтээлд дараа нь шугамыг дахин бүтээх урт процессыг саатуулж, дотоод бүтээлд үр дүнтэй ба чанартай ажиллах боломжтой. Бид дотоод бүтээлд зориулан суудал-хоолойн өрөө, хоолойн өрөө, хаяг өрөө, кухня, санузел өрөө гэх мэт бүтээлд зориулан өөрсдийн сонирхолд нийцүүлж саналд тавьж бүүн. Таны сонирхолд нийцүүлж хамгийн тохиромжтой хувийн ордонг бүтээх боломжтой. Apple ордон — чанартай амьдралын үл хуулийн жишээ! Apple ордонгийн далай түүврийн ордонг судалж үз! Урьдчилан бүтээсэн оронд хүчлэг бүтцүүдийн тодорхой загвар бүхий, аюулгүй байдлыг хангах үүрэгтэй онцгой сейсмик төшөөрүүлэлт бүхий барилга бүтээц юм. Модуль хэлбэрт загвар, хөнгөн тээвэрлэх боломжтой, түүнчлэн далайн контейнерын гэр — та нарын хувийн сонирхол, янз бүрийн стил, өрөөний төрлийн шаардлагад нийцүүлэн хүссэн хэмжээнд хийгдмүүл. Бүх деталд урьдчилан бүтээсэн бөөрсөн бүтцүүд бүхий, суурьлуулахад хялбар, ямар нь ч тусгай уралдаан шаардажгүй. Амьдрах, алба хийх, нөөцлөх гэх мэт бүх төрлийн зориулалтад урьдчилан бүтээсэн оронд та нарын шаардлагыг хангамүүл. Стильт дүрс, гладкий шугам, та нарын хувийн дур сонирхолд нийцүүлэн хийгдмүүл, үл хувиршгүй амьдралын оронд бүтээмүүл. Хамгийн сайн нь, урьдчилан бүтээсэн оронд суурьлуулах үед газар дээрх холбогч холболт (хүүрдүүлэлт) шаардажгүй, бид суурьлуулалтын зааварчлалыг үүрд үлдээмүүл, та нарын суурьлуулалтыг хялбар, хурдан хийгдмүүл. Чэндунг урьдчилан бүтээсэн орондын давуу талд тулгуурлан илүү дотоодын амьдралын төрөлд шилжих. Хураагдаж бүтээх оронд модуль стандартын дагуу бүтээдэг. Таны түлхүүр хайрцагт суурьшмүүр оронд шаардлагад нийцүүлэн зохион бүтээж болой. Энэ нь масс үйлдвэрлэлд боломж олгох газар, оронд тань илүү хамгаалалт, тогтвортой, найдвартай бүтээдэг. Газрын хувьд мөн үүрд хэрэглээний шаардлагад нийцүүлэн сунгах, холбож бүтээж болой, та аливаа цагт, аливаа газарт аюулгүй, даруй амьдралын туршлага бүтээж болой. Хурдан хүргэлт! Хүргэлт ба баглааж бүтээлт чинь хурдан. Бид таны захиалгын дагуу урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүтээлт хийдэг урьдчилан баглааж бүт...... Контейнер байр сууриа суурилуулж байшингаа илүү аюулгүй, тав тухтай болгоно.Бүх бүтцийн бүрэлдэхүүн хэсгүүд үйлдвэрт урьдчилан үйлдвэрлэгддэг. Зөв хэмжээ, тохируулга, хэв маяг, тохируулга сонгож, та амьдрах орон зайг хурдан бий болгож болно. Тэдгээрийн хэрэгцээ, хүсэл сонирхолд нийцүүлэн, хэд хэдэн модулийг олон функцтай, шилжих контейнер байр болох өрөө, гал тогоо, унтлагын өрөө зэрэг өрөөний байрла Өнөөдөр бокс өрөөнд ашиглаж, илүү сайн үнэ, илүү сайн үйлчилгээг хүртээрэй. амьдралаа сайжруулах! CDPH нь аялалт модуль барилгын, загасч барилга, вилла барилгын төрөл бүрийг үйлдвэрлэдэг болон худалдаа хийдэг. Ачааллын табанд үндсэн шийдлийг олгоход бидний бүтээгдэхүүнүүд нь их төрлийн байдаг.ацааны контейнерт байшин
Хаягдсан контейнерүүдийг загалмай орон суудал болгон хувиргах

Ачааны контейнерээр барьсан байшингийн чимэг ба сорилтууд

Контейнерт байшин архитектурын олон тал

Яагаад илүү их хүмүүс ачааны контейнерээр барьсан байшинг сонгож байна вэ
Why choose CDPH
ацааны контейнерт байшин?
Цагдаагийн стил apple газар
Шинэ бүтээгдэхүүн модуль гэр
Эрчимтэй фолдинг гэр
Баярлалаа борлуулж байгаа контейнерийн гэр
Холбоотой бүтээгдэхүүний ангилал
Хайж буй зүгээ олж чадаагүй байна уу?
Одоогоор санал хүсэлт ирүүлэх
Боломжит бүтээгдэхүүний талаар илүү дэлгэрэнгүй мэдээлэл авахын тулд бидний зөвлөхтэй холбоо барилцаа уу.Холбогдох
27+ Жил Туршлагатай
Инженерийн табаны үйлдвэрлэл