...">
,需要通过父级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);
}
});
})();
Οι προσωρινές προκατασκευασμένες τάξεις είναι ειδικά κτίρια που τα σχολεία μπορούν να χρησιμοποιήσουν για σύντομο χρονικό διάστημα. Αυτά προμηθευτές μοντουλάρων σπιτιών κατασκευάζονται σε εργοστάσιο και στη συνέχεια μεταφέρονται στα σχολεία, όπου μπορούν να εγκατασταθούν γρήγορα. Αποτελούν μια εξαιρετική λύση για σχολεία που χρειάζονται επιπλέον χώρο. Μερικές φορές, τα σχολεία έχουν πολλούς μαθητές αλλά όχι αρκετές αίθουσες, ή ίσως επισκευάζουν τις συνήθεις τους αίθουσες διδασκαλίας. Το CDPH κατανοεί πόσο χρήσιμες μπορούν να είναι αυτές οι αίθουσες διδασκαλίας για μαθητές και δασκάλους. Ένα σημαντικό πλεονέκτημα των κατασκευαστές μοντερνών σπιτιών είναι ότι μπορούν να εγκατασταθούν γρήγορα. Όταν μια σχολική μονάδα χρειάζεται περισσότερο χώρο, η αναμονή για μακροχρόνια κατασκευή δεν αποτελεί επιλογή. Αυτές οι τάξεις μπορούν να παραδοθούν και να εγκατασταθούν σε λίγες εβδομάδες, γεγονός που σημαίνει ότι οι μαθητές μπορούν να τις χρησιμοποιήσουν αμέσως. Αυτό είναι ιδιαίτερα σημαντικό κατά τις πιο απαιτητικές περιόδους του σχολικού έτους. Εάν μια σχολική μονάδα δεχθεί αιφνίδια περισσότερους μαθητές λόγω αύξησης του πληθυσμού της περιοχής, δεν χρειάζεται να ανησυχεί για υπερπληθυσμισμό. Αντ’ αυτού, μπορεί να διαθέτει επιπλέον τάξεις έτοιμες για χρήση. Ένα άλλο πλεονέκτημα είναι η ευελιξία. Εάν η σχολική μονάδα χρειαστεί αργότερα να μετακινήσει τις τάξεις, μπορεί να το πράξει. Αυτό σημαίνει ότι οι σχολικές μονάδες μπορούν να προσαρμοστούν σε μεταβαλλόμενες ανάγκες χωρίς να δαπανούν μεγάλα ποσά για μόνιμες κατασκευές. Επένδυση σε προσωρινές διαμοδικό σπίτι a-frame μπορεί να είναι μια σοφή επιλογή για τα σχολεία. Πρώτον, είναι συχνά λιγότερο ακριβά από την κατασκευή νέων μόνιμων κτιρίων. Τα σχολεία έχουν προϋπολογισμούς, και η σοφή δαπάνη χρημάτων είναι σημαντική. Αντί να ξοδεύουν πολλά χρήματα για νέα κτίρια, τα σχολεία μπορούν να χρησιμοποιήσουν προσωρινές τάξεις για να αποκτήσουν τον επιπλέον χώρο που χρειάζονται χωρίς να υπερβούν τον προϋπολογισμό τους. Αυτό τους επιτρέπει να χρησιμοποιήσουν τα κεφάλαιά τους για άλλα σημαντικά πράγματα, όπως βιβλία, τεχνολογία και επιμόρφωση εκπαιδευτικών. Επιπλέον, αυτές οι τάξεις μπορούν να επαναχρησιμοποιηθούν. Αν ένα σχολείο έχει μια προσωρινή τάξη για μερικά χρόνια και στη συνέχεια δεν τη χρειάζεται πια, μπορεί να τη μεταφέρει εύκολα σε ένα άλλο σχολείο που ενδέχεται να χρειάζεται περισσότερο χώρο. Οι προσωρινές μοντάρισμα τάξεις είναι μια εξαιρετική λύση για σχολεία που χρειάζονται επιπλέον χώρο γρήγορα. Αυτές οι τάξεις μοιάζουν με μεγάλα κουτιά που μπορούν να συναρμολογηθούν εύκολα. Δεν είναι μόνιμα κτίρια, αλλά μπορούν να βοηθήσουν όταν τα σχολεία έχουν πάρα πολλούς μαθητές. Για παράδειγμα, αν ένα σχολείο έχει περισσότερα παιδιά από όσα χωράει στις κανονικές τάξεις, μπορεί να χρησιμοποιήσει μια μοντερνό προεπισκευασμένο σπίτι για να δημιουργηθεί επιπλέον χώρος. Αυτές οι τάξεις σχεδιάζονται για να είναι ασφαλείς και άνετες. Συχνά διαθέτουν παράθυρα, πόρτες και ακόμη και κλιματισμό. Πολλά σχολεία και οργανισμοί χρησιμοποιούν ήδη μοντερνιστικό σπίτι prefab για παράδειγμα, μετά από φυσική καταστροφή, ορισμένα σχολεία έχουν χάσει τα κτίρια τους. Σε αυτές τις περιπτώσεις, οι προσωρινές τάξεις μπορούν να εγκατασταθούν γρήγορα, ώστε τα παιδιά να επιστρέψουν στο σχολείο. Ορισμένα σχολεία έχουν χρησιμοποιήσει προκατασκευασμένες τάξεις για να δημιουργήσουν επιπλέον χώρο κατά τις απασχολημένες περιόδους του χρόνου, όπως όταν ξεκινούν νέες τάξεις. Αυτό είναι ιδιαίτερα χρήσιμο σε περιοχές όπου μετακομίζουν πολλές νέες οικογένειες. Καμπίνα Apple, μοναδικό σχήμα, όμορφη εμφάνιση, κάνοντας το σπίτι σας πιο προσωπικοποιημένο. Προσφέρουμε μια ευρεία γκάμα χρωμάτων και στυλ για να ικανοποιήσουμε τις προτιμήσεις σας, από απλά σύγχρονα έως παραδοσιακά. Η Beijing Chengdong επικεντρώνεται στις επιθυμίες και τις ανάγκες των χρηστών. Μπορεί να προσαρμοστεί στις ανάγκες σας. Σύμφωνα με τις δικές σας επιθυμίες και προτιμήσεις, μπορείτε να τροποποιήσετε το σχήμα της διάταξης του σπιτιού, τη διάταξη των υδραυλικών και ηλεκτρικών εγκαταστάσεων, καθώς και τη διάταξη των ηλεκτρικών και υδραυλικών συστημάτων, προκειμένου να δημιουργήσετε το τέλειο σπίτι που είναι απολύτως μοναδικό για εσάς. Η προκατασκευή των υδραυλικών και ηλεκτρικών αγωγών μας βοηθά να αποφύγουμε τη χρονοβόρα διαδικασία επαναδιάταξης των σωλήνων μετά την αποπεράτωση της διακόσμησης του σπιτιού, αυξάνοντας έτσι την αποδοτικότητα και την ποιότητα της διακόσμησης. Προσφέρουμε μια σειρά επιλογών διάταξης για τους εσωτερικούς χώρους, συμπεριλαμβανομένων του σαλονιού και της τραπεζαρίας, των υπνοδωματίων, της κουζίνας, του μπάνιου κ.λπ. Μπορείτε να επιλέξετε εκείνη που ταιριάζει καλύτερα στις ανάγκες και τις προτιμήσεις σας, προκειμένου να δημιουργήσετε ένα ιδανικό και μοναδικό σπίτι για εσάς. Apple House – Ποιότητα στην κατοικία στο απόγειό της! Ανακαλύψτε το μικρό προκατασκευασμένο σπίτι της Apple House! Το σπίτι με την έκλιση βασίζεται σε κανονική μοντερνάρικη σχεδιασμό, που μπορεί να ρυθμιστεί σύμφωνα με τις ανάγκες της οικογένειας σας και να επιτύχει μαζική παραγωγή και να βοηθήσει να κάνει το χώρο ζωής σας πιο σταθερό, ασφαλές και αξιόπιστο. Το δωμάτιο που κλείνει μπορεί να διαταραχθεί με διάφορους τρόπους για να καλύψει διαφορετικές ανάγκες, έτσι ώστε να ζήσετε με ευκολία παντού και πάντα. Γρήγορη παράδοση! Παρέχουμε επίσης μια αποτελεσματική υπηρεσία συσκευασίας και παραδόσεως. Η ειδική ομάδα συσκευασίας μας θα συσκευάσει το δωμάτιο που κλείνει σύμφωνα με τις απαιτήσεις του πελάτη. Κατά τη διάρκεια της παράδοσης θα επιβλέπουμε επίσης όλους τους βήματα, ώστε τα προϊόντα να φτάνουν στον προορισμό. Το καλύτερο απ' όλα, το δωμάτιο κλείνει εύκολα για να εγκατασταθεί χωρίς συνδεσμούς επιτόπου. Παρέχουμε επίσης οδηγίες εγκατάστασης για να κάνουμε την εγκατάσταση σας ευκολότερη και γρηγορότερη. Εάν ακολουθήσετε τις οδηγίες, είναι απλό να στήσετε το σπίτι που κλείνει. Τα προσκειμένα σπίτια είναι εύκολα να συναρμολογηθούν και δεν απαιτούν ιδιαίτερες γνώσεις. Μπορούν να χρησιμοποιηθούν ως σπίτια με αναπτυξιμότητα για πώληση, αποθετήριο γραφείου ή για οποιαδήποτε άλλη χρήση. Σπίτι με έκβληση για πώληση, κάνε τη ζωή σου ασφαλέστερη και ευχερέστερη! Τα δομικά στοιχεία φτιάχνονται όλα προεγκατασκευασμένα σε εργοστάσιο. Όταν επιλέξεις τις κατάλληλες διαστάσεις, διαμόρφωση και στιλ, μπορείς να δημιουργήσεις το σπίτι σου γρήγορα. Βάσει των αναγκών του πελάτη και των προτιμήσεών, διαφορετικοί μόδουλοι μπορούν να συνδυαστούν για να δημιουργηθούν διαφορετικά σχέδια δωματίων όπως κουζίνα, ζωντανό χώρο και κοιταδιά. Το πιο σημαντικό παράγοντας είναι ότι το σπίτι σε κοντέινερ που χρησιμοποιούμε είναι εύκολο να αποσυρθεί και να συνταχθεί, έχει σταθερή δομή, εξαιρετική απόδοση όπως αντούδωση, αντιρτυβισμό, πυροασφάλεια και ο προσαρμογμός διαδικασία είναι εύκολη και απλή να λειτουργήσει, χωρίς να χρειάζεται καμία τεχνική ειδικότητα. Για ιδιωτική κατοικία, προσωρινή γραφειοκρατία, αποθήκευση ή άλλες ανάγκες, το προεγκατασκευασμένο σπίτι σε κοντέινερ σχεδιάζεται για να ανταποκριθεί στις ανάγκες σου. Πάρε σήμερα ένα δωμάτιο σε κοντέινερ και απόλαυσε μικρότερο κόστος και πιο γενναιόδωρη υπηρεσία. Αυξήστε την εμπειρία ζωής σου!Προσωρινές μονάδες διδασκαλίας
Εισαγωγή

Πλεονεκτήματα

Ποιότητα

Εφαρμογή
Why choose CDPH
Προσωρινές μονάδες διδασκαλίας?
Σύγχρονος Στυλ apple καμπίν
Υψηλής ποιότητας συμπιεστικό σπίτι
Νέα φθάση προεγκατασκευασμένου σπιτιού
Καλά πωλούμενο σπίτι-παραγγελίας
Δεν βρίσκετε αυτό που ψάχνετε;
Ζητήστε Προσφορά Τώρα
Επικοινωνήστε με τους συμβούλους μας για περισσότερα διαθέσιμα προϊόντα.Επικοινωνήστε μαζί μας