CINXE.COM
华为人才发展中心
<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,minimal-ui"><meta name="format-detection" content="telephone=no"><meta name="format-detection" content="email=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="full-screen" content="yes"><meta name="browsermode" content="application"><meta name="x5-fullscreen" content="true"><meta name="x5-page-mode" content="app"><meta name="referrer" content="strict-origin-when-cross-origin"><meta name="description" content="华为人才发展中心是面向华为合作伙伴提供的一站式学习平台。 我们聚焦伙伴的售前、售后、销售、商务、营销、管理者6类关键岗位角色,涵盖产品技术、解决方案、拓展策略、行业洞察、流程规范等培训内容,支持在线课程、直播培训、线下培训、考试等学习形式,为伙伴提供全面系统的能力提升帮助。"><meta name="keywords" content="关键词:人才发展中心,生态大学,伙伴大学,华为伙伴赋能"><meta charset="utf-8"><link rel="icon" href="//r.huaweistatic.com/s/gray/hwuniv/lst/huawei.png"><link rel="stylesheet" href="//r.huaweistatic.com/s/gray/hwuniv/lst/cookieApi/cookieStatement.css"><title>华为人才发展中心</title><script>/** * window.eplus_welink_login_client_id 免登使用的应用 client_id,默认为公共应用 * window.eplus_welink_login_latch 是否拦截 current / me 等请求,免登完成后放行,默认为 true * window.eplus_welink_login_latch_apis 拦截的 api 列表,后缀匹配, 默认为 ['/jalor/web/support/workspace/current', '/sa/urm/services/users/me'] * window.eplus_welink_env 环境, 默认测试环境dev, 生产环境传 production * window.eplus_welink_env_params: {heartbeatInterval, throttlingInterVal, hasLoading} heartbeatInterval = 10 * 60 * 1000; // 保活10分钟 throttlingInterVal = 3 * 60 * 1000; // 节流时间 */ window.eplus_welink_env = !['partner.huawei.com', 'w3.huawei.com', 'app.huawei.com', 'e.huawei.com',].includes(document.domain) ? 'dev' : 'production'; window.eplus_welink_login_client_id = '20230830145439627905213'; // 需要添加亿家分享功能的页面中,不是在welink/亿家打开的移动端页面要重定向到中间页 handleWelinkShareRedirect(); function getWelinkUrl(targetUrl) { const isProEnv = ['partner.huawei.com', 'w3.huawei.com', 'app.huawei.com', 'e.huawei.com',].includes(window.location.hostname); const hwWelink = isProEnv ? 'hwwelink://com.huawei.eplus/' : 'hwwelink://com.huawei.eplus.dev/'; const downloadPage = isProEnv ? 'https://app.huawei.com/eplus/front/download.html' : 'https://w3m-beta.huawei.com/mcloud/umag/FreeProxyForDownLoad/eplus_ui_sit/download.html'; return downloadPage + '?welinkuri=' + (window.encodeURIComponent(targetUrl.includes('type=app') ? targetUrl : targetUrl.includes('#/zone?') ? targetUrl + '&vessel=app' : targetUrl + '&type=app')) + '&welinkscheme=' + hwWelink; } function handleWelinkShareRedirect() { const targetPath = ['/zone', '/course/courseDetails', '/activity/activityDetails', '/news/details', '/sxz-course/home', '/onlineCourse', '/cert', '/certDetails', '/exams', '/sxz-exam', '/solution', '/service',]; // 需要添加亿家分享的路径 const [path, params,] = window.location.hash.slice(1).split('?'); const searchParams = new URLSearchParams(params); const userAgent = navigator.userAgent.toLowerCase(); const isWelink = userAgent.includes('com.huawei.welink') || userAgent.includes('com.huawei.cloudlink') || userAgent.includes('com.huawei.eplus'); const isWhiteListApp = ['eplussmb'].some(item => userAgent.includes(item)); // h5页面白名单app列表,白名单页面不跳中间页 if (isWhiteListApp) return; if (window.location.hash.indexOf('debug=true') > -1) return; // 用于PC调试,避免重定向到中间页 if (isWelink || !targetPath.includes(path) || searchParams.get('type') !== 'app' && searchParams.get('vessel') !== 'app') return; location.replace(getWelinkUrl(location.href)); } (function() { const welinkjsUrl = 'https://open-doc.welink.huaweicloud.com/docs/jsapi/2.0.12/hwh5-cloudonline.js'; const vconsolejsUrl = 'https://unpkg.com/vconsole/dist/vconsole.min.js'; const clientId = window.eplus_welink_login_client_id || window.eplus_welink_env !== 'production' ? '20230602163328786625204' : '20230830145439627905213'; window.eplus_welink_login_latch_apis = window.eplus_welink_login_latch_apis || ['/jalor/web/support/workspace/current', '/sa/urm/services/users/me'] window.eplus_welink_env = window.eplus_welink_env || 'dev'; window.eplus_welink_env_params = { heartbeatInterval: 10 * 60 * 1000, throttlingInterVal: 3 * 60 * 1000, hasLoading: true, ...window.eplus_welink_env_params || {}, }; const baseOrigin = window.eplus_welink_env !== 'production' ? 'https://apigw-beta.huawei.com' : 'https://apigw-04.huawei.com'; const getWcodeAuth = baseOrigin + '/api/eplus/base/uiservice/vuser/getWcodeAuth?X-HW-ID=com.huawei.coe.huawei_partner&language=zh_CN'; const checkUserIsLogin = baseOrigin + '/api/eplus/base/uiservice/checkLogin?X-HW-ID=com.huawei.coe.huawei_partner'; let lastQueryTime = 0; // 上次成功获取token的时间,用于节流 let deviceId = null; let heardBeatTimer = null; let retryCount = 3; // 重连次数 let globalLoading = null; window._welog = function() { if (window.eplus_welink_env === 'production') return; // 不是生产环境才打印日志 const that = this; setTimeout(() => window.console.log.call(that, ...arguments, new Date().getTime()), 1000); // 控制台有加载时间,为了看到全部日志,要设置一个延时来显示日志 } window._weWarn = function() { if (window.eplus_welink_env === 'production') return; // 不是生产环境才打印日志 const that = this; setTimeout(() => window.console.warn.call(that, ...arguments, new Date().getTime()), 1000); // 控制台有加载时间,为了看到全部日志,要设置一个延时来显示日志 } // 判断是否是 e+app 或者 蓝we window._welog('userAgent-----', navigator.userAgent); const userAgent = navigator.userAgent.toLowerCase(); const isWelink = userAgent.includes('com.huawei.welink') || userAgent.includes('com.huawei.cloudlink') || userAgent.includes('com.huawei.eplus'); isWelink ? initWelink() : (window.eplus_welink_login_promise = Promise.resolve()); // 加载welink的jsApi,绑定visibilitychange事件, 心跳检测 function initWelink() { eplus_welink_env_params.hasLoading && createLoadingContainer(); if (window.eplus_welink_env !== 'production' || window.location.hash.indexOf('openVConsole=true') > -1) addVConsole(); // 测试环境添加控制台 window.eplus_welink_login_latch !== false && hijackXMLHttpRequest(); window.eplus_welink_login_promise = getToken(); // 首屏渲染并行获取token document.removeEventListener('visibilitychange', visibilitychangeHandler); document.addEventListener('visibilitychange', visibilitychangeHandler); heardBeat(); // 心跳检测 } // 心跳检测,获取token function heardBeat() { heardBeatTimer && clearTimeout(heardBeatTimer); heardBeatTimer = setTimeout(() => { refreshToken(); heardBeat(); }, eplus_welink_env_params.heartbeatInterval); } // 串行获取token function getTokenBySerial() { return checkLogin().then(isLogin => !isLogin && refreshToken()); } // 并行获取token function getToken() { globalLoading && (globalLoading.style.display = 'flex'); setTimeout(() => hideLoading(), 5000); // 5s超时后自动隐藏loading,避免影响操作 return new Promise((resolve, reject) => { checkLogin().then(flag => flag === true && (resolve() || hideLoading())).catch(err => window._weWarn('checkLogin err:', err)); (window.HWH5 && window.HWH5.getAuthCode ? refreshToken().then(resolve) : loadScript(welinkjsUrl).then(() => { getDeviceId(); refreshToken().then(() => resolve()); })).catch(() => { retryCount--; // 重连 if (retryCount) return refreshToken().then(() => resolve()); // 重连逻辑待完善,目前调用refreshToken只会重连一次 }); }); } function visibilitychangeHandler() { if (document.visibilityState === 'visible') { // 亮屏或者标签页显示时 if (new Date().getTime() - lastQueryTime > eplus_welink_env_params.throttlingInterVal) getToken(); // 节流 获取token } } function checkLogin() { return new Promise((resolve, reject) => { fetchAjax(checkUserIsLogin, 'POST').then(res => resolve(res)).catch((err) => resolve(false) || window._weWarn('checkLogin err:', err)); }); } // 获取wcode,刷新token function refreshToken() { lastQueryTime = new Date().getTime(); return new Promise((resolve, reject) => { if (!HWH5) return reject(); HWH5.getAuthCode().then(data => { window._welog('getAuthCode res-----', data); if (data && data.code === 'error') return reject(); return getBlueToken({ wcode: data.code, appId: clientId, deviceId: deviceId, }).then(res => { retryCount = 3; hideLoading(); return resolve(); }).catch(err => reject()); }).catch(err => reject() || window._weWarn('getAuthCode err-----', err)); }); } function getBlueToken(params) { return new Promise((resolve, reject) => { fetchAjax(getWcodeAuth, 'POST', { data: params, }).then(res => { const { data = {}, } = res || {}; const isAndroid = navigator.userAgent.indexOf('Android') > -1 || navigator.userAgent.indexOf('Adr') > -1; if (!data.token) return reject(res); Object.entries(data.token).map(([key, val,]) => isAndroid ? setCookieItem(key, val) : setCookieItem(key, val, 1800)); window._welog('token获取成功-----', data.token); resolve(data); }).catch(err => reject(err) || window._weWarn('fetchBlueToken err-----', err)); }); } function getDeviceId() { if (deviceId) return Promise.resolve(deviceId); return HWH5 ? HWH5.getDeviceInfo().then(data => (deviceId = data.deviceID)) : Promise.reject(); } function fetchAjax(url, method, options) { return new Promise((resolve, reject) => { fetch(url, { method, body: JSON.stringify(options && options.data || {}), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, ...options, }).then(res => { res.json && res.json().then(data => resolve(data)).catch(err => reject(err) || window._welog(url, data)); }).catch(err => reject(err)); }); } function hideLoading() { globalLoading && (globalLoading.style.display = 'none'); } function hijackXMLHttpRequest() { let isCurrent = false; const originOpen = XMLHttpRequest.prototype.open; const originSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function() { const res = originOpen.apply(this, arguments); if ((window.eplus_welink_login_latch_apis || ['/workspace/current',]).some(it => arguments[1].includes(it))) { isCurrent = true; window._welog('current open'); } return res; }; XMLHttpRequest.prototype.send = function() { return ajaxHandler.bind(this)(originSend, arguments, 'ajax'); }; // 劫持fetch if (!window.fetch) return; const originFetch = window.fetch; window.fetch = function() { return ajaxHandler.bind(this)(originFetch, arguments, 'fetch'); } function ajaxHandler(originFn, args, type) { const isMatch = type === 'ajax' ? isCurrent : (window.eplus_welink_login_latch_apis || ['/workspace/current',]).some(it => args[0].includes(it)) if (isMatch) { type === 'ajax' && (isCurrent = false); return window.eplus_welink_login_promise.then(() => { window._welog(type + ':执行current'); return originFn.apply(this, args); }).catch(err => window._weWarn(type + ':执行current 异常----', err)); } return originFn.apply(this, args); } } // 添加调试控制台 function addVConsole() { loadScript(vconsolejsUrl).then(() => window.vConsole = new window.VConsole()); } function loadScript(url) { return new Promise((resolve, reject) => { const script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.onload = resolve; script.onerror = reject; document.head.appendChild(script); }); } // 创建 Loading 容器 function createLoadingContainer() { if (globalLoading) return globalLoading; if (!document.body) return; try { const setStyle = (dom, style) => Object.keys(style).forEach(key => dom.style[key] = style[key]); globalLoading = document.createElement('div'); globalLoading.id = 'global-loading'; const boxStyle = { position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', backgroundColor: 'rgba(0, 0, 0, 0.5)', justifyContent: 'center', alignItems: 'center', zIndex: '99999', opacity: '0.5' }; setStyle(globalLoading, boxStyle); const spinner = document.createElement('div'); spinner.className = 'spinner'; const spinnerStyle = { border: '4px solid #f3f3f3', borderTop: '4px solid #3498db', borderRadius: '50%', width: '30px', height: '30px', animation: 'spin 2s linear infinite' }; setStyle(spinner, spinnerStyle); globalLoading.appendChild(spinner); const style = document.createElement('style'); style.appendChild(document.createTextNode('@keyframes spin {0% {transform: rotate(0deg);} 100% {transform: rotate(360deg); }}')); document.body.appendChild(globalLoading); document.body.appendChild(style); } catch (err) { window._welog('err', err); } } function setCookieItem(key, value, end) { if (!key || /^(?:expires|max-age|path|domain|secure)$/i.test(key)) return false; const sExpires = end === Infinity ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT' : end ? '; max-age=' + end : ''; document.cookie = key + '=' + value + sExpires + ';domain=.huawei.com;path=/'; return true; } })();</script><script>function redirectAction() { var redirectUrl = { '/course/comSearch': '/onlineCourse', }; var key = location.hash.split('#')[1]; if (key in redirectUrl) { window.location.href = window.location.href.replace(key, redirectUrl[key]); } } redirectAction(); window.isAddVConsole = 'false'; // 移动端控制台开关 function initEntryPath(routeName = '') { var reg1 = new RegExp(routeName + '$', 'g'); var reg2 = new RegExp(routeName + '/$', 'g'); var errorHref = reg1.test(location.href) || reg2.test(location.href); if (errorHref) { var reg3 = new RegExp(routeName + '[\S]*', 'g'); location.href = location.origin + location.pathname.replace(reg3, routeName + '/#'); } } initEntryPath('webcn_portal'); initEntryPath('weben_portal');</script><script>function getHref() { const pathname = window.location.pathname; const href = window.location.href.replace('webui_portal', 'webcn_portal'); if (pathname.indexOf('webui_portal') > 0) { window.location.href = href; } } getHref()</script><style type="text/css">body { margin: 0; padding: 0; } a, button, p, div, ul, ol, li, h1, h2, h3, h4, span { font-size: 14px; box-sizing: border-box; } a { text-decoration: none; } .loading { width: 100%; height: 100%; background: #fff; position: absolute; } .loading .loadingco { width: 200px; height: 80px; text-align: center; z-index: 1; position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; } .loading h2 { color: #666; margin: 0; text-transform: uppercase; letter-spacing: 0.1em; font-size: 20px; font-weight: 400; font-family: Arial, Helvetica, sans-serif; } .loading span { display: inline-block; vertical-align: middle; width: 0.6em; height: 0.6em; margin: 0.19em; background: #007db6; border-radius: 0.6em; -webkit-animation: loading 1s infinite alternate; animation: loading 1s infinite alternate; } .loading span:nth-of-type(2) { background: #008fb2; -webkit-animation-delay: 0.2s; animation-delay: 0.2s; } .loading span:nth-of-type(3) { background: #009b9e; -webkit-animation-delay: 0.4s; animation-delay: 0.4s; } .loading span:nth-of-type(4) { background: #00a77d; -webkit-animation-delay: 0.6s; animation-delay: 0.6s; } .loading span:nth-of-type(5) { background: #00b247; -webkit-animation-delay: 0.8s; animation-delay: 0.8s; } .loading span:nth-of-type(6) { background: #5ab027; -webkit-animation-delay: 1s; animation-delay: 1s; } .loading span:nth-of-type(7) { background: #a0b61e; -webkit-animation-delay: 1.2s; animation-delay: 1.2s; } @-webkit-keyframes loading { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes loading { 0% { opacity: 0; } 100% { opacity: 1; } }</style><script>const setCookie = (name, value, domain) => { document.cookie = name + '=' + value + '; domain=' + domain + '; path=/'; } if (location.href.includes('/university/webcn')) { setCookie("lang", "zh", '.huawei.com'); // 设置cookie setCookie("language", "zh_CN", '.huawei.com'); // 设置cookie setCookie("hic_lang", "zh_CN", '.huawei.com'); // 设置cookie setCookie("current_lang", "zh_CN", '.huawei.com'); // 设置cookie } else { setCookie("lang", "en", '.huawei.com'); // 设置cookie setCookie("language", "en_US", '.huawei.com'); // 设置cookie setCookie("hic_lang", "en_US", '.huawei.com'); // 设置cookie setCookie("current_lang", "en_US", '.huawei.com'); // 设置cookie } window._talentGlobalEnv_gfmsApiSwitch = 'true' == 'true'; window._talentGlobalEnv_lrasApiSwitch = 'true' == 'true';</script></head><body><div id="app"><div class="loading"><div class="loadingco"><h2>Loading</h2><span></span> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span></div></div></div><script>if (window.location.host.indexOf('localhost') === -1) { window.location = window.location.href.replace(/^http:/, 'https:'); }</script><script src="//r.huaweistatic.com/s/gray/hwuniv/lst/assets/js/other/index.d1e1d171911272a99f17.js"></script></body></html>