PageSourceSearch

https://www.umu.cn/auth/login

html umu.cn collected 2026-10-02 15:31:47 UTC 54,456 bytes, 853 lines download raw bytes

1<!doctype html><html class="font-1-0"><head><title>登录 - UMU 学习平台</title> <meta charset="UTF-8"><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no"><meta name="msvalidate.01" content="C6365096B98B689B0FE5ABF7E75C9DBC"/><link rel="preconnect" href="https://statics-cdn-cn.umucdn.cn"><link rel="dns-prefetch" href="https://statics-cdn-cn.umucdn.cn"><link rel="dns-prefetch" href="https://sentry.umu.cn"><link href="https://statics-cdn-cn.umucdn.cn/twww/cn/u_design_umu_pc/u_design_umu_pc.f4add7af.css" rel="stylesheet" />
2<link href="https://statics-cdn-cn.umucdn.cn/twww/cn/common_header_umu_pc/common_header_umu_pc.3c9bdb51.css" rel="stylesheet" />
3<link href="https://statics-cdn-cn.umucdn.cn/twww/cn/umu_search_umu_pc/umu_search_umu_pc.82c1666d.css" rel="stylesheet" />
4<link href="https://statics-cdn-cn.umucdn.cn/twww/cn/libs_common_umu_pc/libs_common_umu_pc.084a7cff.css" rel="stylesheet" />
5<link href="https://statics-cdn-cn.umucdn.cn/twww/cn/third_vendors_umu_pc/third_vendors_umu_pc.8301d89d.css" rel="stylesheet" />
6<link href="https://statics-cdn-cn.umucdn.cn/twww/cn/accountLogin/accountLogin.d5f6b38b.css" rel="stylesheet" />
7<link href="https://statics-cdn-cn.umucdn.cn/twww/cn/pc_common_umu_pc/pc_common_umu_pc.f949b6a3.css" rel="stylesheet" />
7<script src="https://statics-cdn-cn.umucdn.cn/statics/js/0701/boot.js" defer="defer"></script>
7<script src="https://statics-cdn-cn.umucdn.cn/common/es6.shim.min1.js" defer="defer"></script>
7<script src="https://statics-cdn-cn.umucdn.cn/common/qrcode.min.v1.js" defer="defer"></script>
7<script>window.__serverTemplate = 'node';</script>
7<script>window.HOME_URL = '/twww/cn';window.UEDITOR_HOME_URL = '/twww/cn/vendor/editor/';</script>
7<script>window.pageDwt = "accountLogin"</script>
7<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/i18n/twww/accountLogin/59227/zh-cn.js"></script>
7
8            
8<script>
9                if(!window.__LANG__ || !window.__LANG__['twww/accountLogin']){
10                    document.write('
10<script src="/napi/v1/i18n/js?scope=twww/accountLogin" type="text/javascript"><\/script>');
11                }
12            </script>
12
13            
14<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/i18n/web_common/59231/zh-cn.js"></script>
14
15            
15<script>
16                if(!window.__LANG__ || !window.__LANG__['web_common']){
17                    document.write('
17<script src="/napi/v1/i18n/js?scope=web_common" type="text/javascript"><\/script>');
18                }
19            </script>
19
20            
20<script>var namespace = window.pageDwt;
21                window.__LANG__ = Object.assign({}, window.__LANG__);
22                window.langMap = {"de-de":"de","en-us":"en","es-es":"es","fr-fr":"fr","id-id":"id","it-it":"it","ja-jp":"jp","ko-kr":"ko","nl-nl":"nl","ar-ae":"ar","he-il":"he","pt-br":"pt","ru-ru":"ru","sv-se":"sv","th-th":"th","vi-vn":"vi","zh-cn":"cn","zh-tw":"tw"}</script>
22    <meta name="description" content="UMU 互动学习平台网页版登录入口。UMU 利用学习科学和AI技术,让学习真正指向绩效提升,同时提升企业培训的效果、效率、体验。">
23        <meta name="keywords" content="用户登录, 学员登录, 讲师登录, 培训登录, 企业登录">
24       <link rel="alternate" href="https://www.umu.co/auth/login" hreflang="ja" />
25<link rel="alternate" href="https://www.umu.com/auth/login" hreflang="en" />
26<link rel="alternate" href="https://www.umu.cn/auth/login" hreflang="zh-CN" />
27<link rel="alternate" href="https://www.umu.tw/auth/login" hreflang="zh-TW" />
28<link rel="alternate" href="https://www.umu.cn/auth/login" hreflang="x-default" />
29
30    </head><body class=""><div class="account-container account-login-container"><div class="doc account account-login"><style>.site-loading-holder{
31    width: 100%;
32    height: 100vh;
33    background: var(--umu-color-bg-base, #fff);
34    position: fixed;
35    top: 0;
36    bottom: 0;
37    left: 0;
38    right: 0;
39    z-index: 2001;
40}
41.loading-spinner {
42    padding: 200px;
43    margin: 0 auto;
44    text-align: center;
45}
46
47.web-umu-loading2{
48    display: block;
49    width: 100px;
50    height: 25px;
51    margin: auto;
52    background-image: url(data:image/png;base64,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);
53    background-repeat: no-repeat;
54    -webkit-background-size: 100px auto;
55    background-size: 100px auto;
56    -webkit-animation: web-page-loading-frame 3s steps(30) infinite;
57    animation: web-page-loading-frame 3s steps(30) infinite;
58}
59
60@-webkit-keyframes web-page-loading-frame {
61    from {
62        background-position-y: 0;
63    }
64    to {
65        background-position-y: -750px;
66    }
67}
68
69@keyframes web-page-loading-frame {
70    from {
71        background-position-y: 0;
72    }
73    to {
74        background-position-y: -750px;
75    }
76}</style><div class="site-loading-holder"></div><div ng-controller="mainController"><div ui-view></div><page-tool></page-tool></div></div><div id="footer"><ul class="nav"><li><a class="trackEvent" data-track-cat="home" data-track-label="aboutUs" href="/home/about-us">关于我们</a></li><li><a class="trackEvent" data-track-cat="home" data-track-label="termcondition" href="/staticPage/termcondition.html">服务协议</a></li><li><a class="trackEvent" data-track-cat="home" data-track-label="termcondition" href="/staticPage/privacy-policy.html">隐私政策</a></li><li><a class="trackEvent" data-track-cat="help" data-track-label="help" href="/help">帮助中心</a></li>   <li><div class="site-lang-switch"><lang-switch is-editing="true" auto-save="true"></lang-switch></div></li></ul>  <div class="page-footer-node-copyright-wrapper"><span class="copyright">© 2014-<span class="js-current-year" style="visibility:hidden">2025</span> 北京优幕科技有限责任公司 | 背调邮箱:[email protected]</span> <span class="copyright" style="margin-left: 40px;"><a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010202007103" style="height:20px;line-height:20px;"><img src="https://statics-cdn-cn.umucdn.cn/statics/police.png" style="vertical-align: sub;"/> <span>京公网安备11010202007103号</span></a> <a target="_blank" href="https://beian.miit.gov.cn/#/Integrated/index">京ICP备161018号</a> </span><span class="copyright" style="margin-left: 40px;">
76网络安全等级保护三级11010243658-20001 <a target="_blank" href="http://www.moe.gov.cn/jyb_xxgk/s5743/s5744/A16/202001/t20200120_416151.html" style="height:20px;line-height:20px;"><span>教APP备1100465号</span></a></span></div>    
76<script>(function () {
77            try {
78                var year = String(new Date().getFullYear());
79                var nodes = document.querySelectorAll('#footer .js-current-year');
80                for (var i = 0; i < nodes.length; i++) {
81                    nodes[i].textContent = year;
82                    nodes[i].style.visibility = 'visible';
83                }
84            } catch (e) {}
85        })();</script>
85</div></div>
85<script>window.pageData = {"version":"1.0","data":{"teacher_info":false,"email_list":["@qq.com","@163.com","@126.com","@sina.com","@gmail.com","@hotmail.com","@sohu.com","@139.com","@189.com","@21cn.com"],"page_config":{"is_course_reviewer":"0"}},"enterprise_setting":{},"status":true,"errno":0,"error_code":0,"error":"success","token":"tuv26ilti43ptcit5mvp0p8cc6","page_token":"669628|1790955106|1326f1","config":{"step_length":15,"env":"ONLINE","lang":"zh-cn","site_host":"umu.cn","system":"CN","fixed":true,"i18n_config":{"langs_full":[{"value":"de-de","short":"de","label":"Deutsch"},{"value":"en-us","short":"en","label":"English"},{"value":"es-es","short":"es","label":"Español"},{"value":"fr-fr","short":"fr","label":"Français"},{"value":"id-id","short":"id","label":"Bahasa Indonesia"},{"value":"it-it","short":"it","label":"Italiano"},{"value":"ja-jp","short":"jp","label":"日本語"},{"value":"ko-kr","short":"ko","label":"한국어"},{"value":"nl-nl","short":"nl","label":"Nederlands"},{"value":"ar-ae","short":"ar","label":"العربية"},{"value":"he-il","short":"he","label":"עִברִית"},{"value":"pt-br","short":"pt","label":"Português"},{"value":"ru-ru","short":"ru","label":"Русский"},{"value":"sv-se","short":"sv","label":"Svenska"},{"value":"th-th","short":"th","label":"ภาษาไทย"},{"value":"vi-vn","short":"vi","label":"Tiếng Việt"},{"value":"zh-cn","short":"cn","label":"简体中文"},{"value":"zh-tw","short":"tw","label":"繁體中文"}],"systems":["CN","TW","JP","EN","EM"],"system_langs":["zh-cn","en-us","zh-tw"]},"site":"CN","is_course_mini_app":false,"is_in_midea_mini_app":false,"video_point_rate_interval":"8","questionnaire_auto_save_interval":"10","node_html_font_size":"small","node_html_font_size_value":100,"support_html_font_size_languages":["zh-cn","ja-jp","zh-tw"]},"success":false,"_dwt":"accountLogin"};</script>
85<script>window.teacherInfo = "";
86        var siteHost    = "umu.cn";
87        var hasSso    = "";
88        var ssoOnly    = "";
89        var customizedEnterpriseName = "";
90        var enterpriseSetting = {};</script>
90<script src="https://statics-cdn-cn.umucdn.cn/cdn/js/jquery/jquery-3.7.1.min.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/ejs.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular/angular.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular/angular-animate.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular/angular-cookies.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular/angular-messages.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular/angular-route.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular/angular-sanitize.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular-autocomplete.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular-ngdialog.js?v=7820fcf0"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/angular-ui-router.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/ng-context-menu.js?v=1"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/DragDropTouch.js?v=1"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/dragLists.js?v=1"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/statics/js/vendor/dotdotdot.js?v=1"></script>
90<script defer="defer" src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/cdn/js/react.18.2.0/react.production.min.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/cdn/js/react-dom.18.2.0/react-dom.production.min.js"></script>
90<script src="https://statics-cdn-cn.umucdn.cn/cdn/js/react-router-dom.5.3.3/react-router-dom.min.js"></script>
90<script>function I18nError(type, message, fileName, lineNumber) {
91        var instance = new Error(message, fileName, lineNumber);
92        instance.name = 'I18nError';
93        instance.type = type;
94        Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
95        if (Error.captureStackTrace) {
96            Error.captureStackTrace(instance, I18nError);
97        }
98        return instance;
99    }
100
101    I18nError.prototype = Object.create(Error.prototype, {
102        constructor: {
103            value: Error,
104            enumerable: false,
105            writable: true,
106            configurable: true
107        }
108    });
109
110    if (Object.setPrototypeOf) {
111        Object.setPrototypeOf(I18nError, Error);
112    } else {
113        I18nError.__proto__ = Error;
114    }
115
116    var PARAM_REG = /{\$(\d+)}/g
117    var sendedErrors = [];
118
119    function reportError(scope, key, type, lang) {
120        var errObj = {
121            scope: scope,
122            key: key,
123            type: type,
124            lang: lang
125        };
126
127        var errString = JSON.stringify(errObj);
128        if (sendedErrors.indexOf(errString) > -1) {
129            return;
130        }
131        sendedErrors.push(errString);
132
133        console.error(new I18nError(type, errString));
134
135        // upload to sentry
136        if (window.Sentry && window.Sentry.captureException) {
137            var i18nError = new I18nError(type, JSON.stringify(errObj));
138            window.Sentry.captureException(i18nError);
139            return;
140        }
141
142        // upload to elk
143        errObj.loc = location;
144        var errStr = 'i18n_err:' + JSON.stringify(errObj);
145        if (window.BJ_REPORT && window.BJ_REPORT.report) {
146            window.BJ_REPORT.report(errStr);
147        }
148    }
149
150    var isEmptyObj = function (obj) {
151        return !!obj && Object.keys(obj).length === 0 && Object.getPrototypeOf(obj) === Object.prototype;
152    };
153
154    var langUtils = {
155        getPageConfig: function () {
156            var pageData;
157            try {
158                pageData = typeof window.pageData === 'string' ? JSON.parse(window.pageData) : window.pageData;
159            } catch (err) {
160                pageData = {};
161                reportError('pageData', 'pageData', 'pageData', this.getLang());
162            }
163            var config = pageData.config || pageData.page_config || {};
164            if (isEmptyObj(config)) {
165                console.warn('Page Config is EMPTY, please check window.pageData.config');
166            }
167            return config;
168        },
169        getLang: function () {
170            var config = this.getPageConfig();
171            var langVal = (window.langMap || {})[config.lang] || '';
172            if (!langVal) {
173                console.error(
174                    new Error(
175                        'Get LANG VALUE failed, return ' + langVal + ', please check window.pageData OR window.langMap'
176                    )
177                );
178            }
179            return langVal;
180        },
181        getCurrentSystem: function () {
182            var config = this.getPageConfig();
183            var systemVal = config.system || '';
184            if (!systemVal) {
185                console.error(new Error('Get SYSTEM VALUE failed, return' + systemVal + ', please check window.pageData'));
186            }
187            return systemVal;
188        },
189        _lang: function (locale) {
190            var currentLocale = this.getLang();
191            return currentLocale.toLowerCase() === (locale || '').toLowerCase();
192        },
193        isSystem: function (system) {
194            var currentSystem = this.getCurrentSystem();
195            return currentSystem.toLowerCase() === (system || '').toLowerCase();
196        },
197        renderHtml: function (content) {
198            var namespace = window['pageDwt'];
199
200            if (!namespace || !window.__LANG__ || !window.__LANG__[namespace]) {
201                reportError(namespace || 'pc_page', 'cdn_fail', 'cdn_fail', this.getLang());
202                return content;
203            }
204
205            var LANG_CONTENT = window.__LANG__[namespace];
206            if (isEmptyObj(LANG_CONTENT)) {
207                return content;
208            }
209            var langContent = {};
210            var that = this;
211            Object.keys(LANG_CONTENT).forEach(function (key) {
212                langContent[key] = that.getLangWithSystem(LANG_CONTENT[key]);
213            });
214
215            // 检查 ejs 是否存在
216            if (typeof ejs === 'undefined') {
217                console.warn('EJS is undefined, please check the CDN or include it locally.');
218                return content;
219            }
220
221            try {
222                var data = ejs.render(content, langContent);
223                return data;
224            } catch (err) {
225                var errMsg = err.message.split(' ').join('');
226                reportError(window['pageDwt'], errMsg, 'render', this.getLang());
227                return content;
228            }
229        },
230        getLangWithSystem: function (value) {
231            var SITE_CONFIG_KEYS = {
232                EMAIL: /([email protected]|[email protected])/g
233            };
234            if (this.isSystem('jp') && !!value) {
235                return value.replace(SITE_CONFIG_KEYS.EMAIL, '[email protected]');
236            }
237            return value;
238        },
239        lang: function (key) {
240            if (arguments.length > 1) {
241                return this.langReplace(arguments);
242            }
243            var namespace = window['pageDwt'];
244
245            if (!namespace || !window.__LANG__ || !window.__LANG__[namespace]) {
246                reportError(namespace || 'pc_page', 'cdn_fail', 'cdn_fail', this.getLang());
247                return this.getLangWithSystem(key);
248            }
249
250            var LANG_CONTENT = window.__LANG__[namespace];
251            if (isEmptyObj(LANG_CONTENT)) {
252                return this.getLangWithSystem(key);
253            }
254
255            var langValue = LANG_CONTENT && LANG_CONTENT[key];
256            if (langValue === undefined || langValue === null) {
257                reportError(window['pageDwt'], key, 'lang', this.getLang());
258            }
259
260            return this.getLangWithSystem(langValue);
261        },
262        getCurrentLocale: function () {
263            var config = this.getPageConfig();
264            return config.lang;
265        },
266        langReplace: function () {
267            var langKey = Array.prototype.slice.call(arguments, 0, 1)[0];
268            var lang = this.lang(langKey);
269            var params = Array.prototype.slice.call(arguments, 1);
270            var langValue = lang.replace(PARAM_REG, function (_, index) {
271                var i = parseInt(index, 10);
272                if (params.length > i - 1) {
273                    return params[i - 1];
274                }
275                return '';
276            });
277            if (!langValue) {
278                reportError(window['pageDwt'], langKey, 'langReplace', this.getLang());
279            }
280            return langValue;
281        },
282        initBodyClassName: function () {
283            if (document.body) {
284                document.body.classList.add('locale-' + this.getLang());
285                document.body.classList.add('system-' + this.getCurrentSystem().toLowerCase());
286
287                const USEQuery = 'ums';
288                const nUrl = new URL(window.location.href);
289                const nSearchParams = nUrl.searchParams.size ? nUrl.searchParams : new URLSearchParams(window.location.href.split('?')[1]);
290                const inUSE = nSearchParams.get(USEQuery) === '1';
291                if (inUSE && self !== parent) { // 在 iframe 中才使用 use 的样式
292                    document.body.classList.add('is-in-use')
293                }
294            }
295        }
296    };
297
298    ejs.filters.replace = function (lang) {
299        var params = Array.prototype.slice.call(arguments, 1);
300        if (typeof lang === 'string') {
301            return langUtils.getLangWithSystem(lang.replace(PARAM_REG, function (key, index) {
302                index = parseInt(index, 10);
303                if (index < 1) {
304                    return key;
305                }
306                if (typeof params[index - 1] === 'string') {
307                    return params[index - 1];
308                }
309                return '';
310            }));
311        }
312        if (lang === '') {
313            reportError('filter', lang, 'ejs', langUtils.getLang());
314        }
315        return langUtils.getLangWithSystem(lang);
316    };
317
318    langUtils.getCurrentLang = langUtils.getLang;
319    langUtils.isLang = langUtils._lang;
320    langUtils.isAsiaLang = function () {
321        return langUtils.isLang('cn') || langUtils.isLang('tw') || langUtils.isLang('ja') || langUtils.isLang('ko');
322    };
323    langUtils.initBodyClassName();
324    window.langUtils = langUtils;</script>
324<script src="https://statics-cdn-cn.umucdn.cn/statics/js/bundle.tracing.min.js"></script>
324<script>(function(config) {
325                var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
326    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
327    return new (P || (P = Promise))(function (resolve, reject) {
328        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
329        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
330        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
331        step((generator = generator.apply(thisArg, _arguments || [])).next());
332    });
333};
334var __generator = (this && this.__generator) || function (thisArg, body) {
335    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
336    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
337    function verb(n) { return function (v) { return step([n, v]); }; }
338    function step(op) {
339        if (f) throw new TypeError("Generator is already executing.");
340        while (_) try {
341            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
342            if (y = 0, t) op = [op[0] & 2, t.value];
343            switch (op[0]) {
344                case 0: case 1: t = op; break;
345                case 4: _.label++; return { value: op[1], done: false };
346                case 5: _.label++; y = op[1]; op = [0]; continue;
347                case 7: op = _.ops.pop(); _.trys.pop(); continue;
348                default:
349                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
350                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
351                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
352                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
353                    if (t[2]) _.ops.pop();
354                    _.trys.pop(); continue;
355            }
356            op = body.call(thisArg, _);
357        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
358        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
359    }
360};
361var release = config.version;
362var defaultTracesSampleRate = config.tracesSampleRate;
363var dsn = config.sentryDSN;
364var integrations = [];
365var userInfo = (window.pageData.data && (window.pageData.data.teacher_info || window.pageData.data.user_info)) || {};
366var enterpriseInfo = (window.pageData.data && (window.pageData.data.enterpriseInfo || window.pageData.data.enterprise_info)) || {};
367var params = {
368    eId: userInfo.enterpriseId || enterpriseInfo.enterpriseId || '',
369    eName: enterpriseInfo.enterprise_show_name || enterpriseInfo.enterpriseName || '',
370    umuId: userInfo.umu_id || '',
371    userName: userInfo.userName || '',
372    email: userInfo.email || ''
373};
374function estimateFromTiming() {
375    try {
376        if (typeof performance === 'undefined')
377            return { rtt: -1, downlink: -1 };
378        var navEntries = performance.getEntriesByType('navigation');
379        if (!navEntries || !navEntries.length)
380            return { rtt: -1, downlink: -1 };
381        var nav = navEntries[0];
382        var rtt = nav.connectEnd - nav.connectStart;
383        if (rtt <= 0)
384            rtt = nav.responseStart - nav.requestStart;
385        var downlink = -1;
386        var resources = performance.getEntriesByType('resource');
387        for (var i = 0; i < resources.length; i++) {
388            var entry = resources[i];
389            var dur = entry.responseEnd - entry.responseStart;
390            if (entry.transferSize > 0 && dur > 10) {
391                var tp = (entry.transferSize * 8) / (dur * 1000);
392                if (tp > downlink)
393                    downlink = tp;
394            }
395        }
396        var navDur = nav.responseEnd - nav.responseStart;
397        if (nav.transferSize > 0 && navDur > 10) {
398            var navTp = (nav.transferSize * 8) / (navDur * 1000);
399            if (navTp > downlink)
400                downlink = navTp;
401        }
402        return { rtt: rtt > 0 ? rtt : -1, downlink: downlink };
403    }
404    catch (e) {
405        return { rtt: -1, downlink: -1 };
406    }
407}
408function getNetworkInfo() {
409    var connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
410    if (connection) {
411        var rtt = (typeof connection.rtt === 'number') ? connection.rtt : -1;
412        var downlink = (typeof connection.downlink === 'number') ? connection.downlink : -1;
413        if (rtt !== 0 || downlink !== 0) {
414            return { effectiveType: connection.effectiveType || 'unknown', downlink: downlink, rtt: rtt, apiAvailable: true };
415        }
416    }
417    var timing = estimateFromTiming();
418    return {
419        effectiveType: (connection && connection.effectiveType) || 'unknown',
420        downlink: timing.downlink,
421        rtt: timing.rtt,
422        apiAvailable: false,
423    };
424}
425function isWeakNetwork() {
426    var info = getNetworkInfo();
427    if (info.effectiveType === '2g' || info.effectiveType === 'slow-2g' || info.effectiveType === '3g') {
428        return true;
429    }
430    if (info.rtt > 500)
431        return true;
432    if (info.downlink > 0 && info.downlink < 1)
433        return true;
434    return false;
435}
436function getNavigationTiming() {
437    try {
438        if (typeof performance === 'undefined')
439            return { connectTime: -1, dnsTime: -1 };
440        var navEntries = performance.getEntriesByType('navigation');
441        if (!navEntries || !navEntries.length)
442            return { connectTime: -1, dnsTime: -1 };
443        var nav = navEntries[0];
444        return {
445            connectTime: nav.connectEnd - nav.connectStart,
446            dnsTime: nav.domainLookupEnd - nav.domainLookupStart,
447        };
448    }
449    catch (e) {
450        return { connectTime: -1, dnsTime: -1 };
451    }
452}
453function attachNetworkTags(event) {
454    var info = getNetworkInfo();
455    if (!event.tags)
456        event.tags = {};
457    event.tags['network.effectiveType'] = info.effectiveType;
458    event.tags['network.downlink'] = String(info.downlink);
459    event.tags['network.rtt'] = String(info.rtt);
460    event.tags['network.isWeak'] = String(isWeakNetwork());
461    event.tags['network.apiAvailable'] = String(info.apiAvailable);
462}
463var BOT_PATTERNS = [
464    /bot/i, /crawler/i, /spider/i, /headless/i,
465    /puppeteer/i, /playwright/i, /phantom/i, /selenium/i,
466    /scrapy/i, /yandex/i, /Sogou/i,
467    /facebookexternalhit/i, /Slurp/i,
468];
469function isBotTraffic() {
470    if (typeof navigator === 'undefined')
471        return false;
472    var ua = navigator.userAgent || '';
473    return BOT_PATTERNS.some(function (pattern) { return pattern.test(ua); });
474}
475var _lastHiddenTimestamp = 0;
476if (typeof document !== 'undefined') {
477    if (document.visibilityState === 'hidden')
478        _lastHiddenTimestamp = Date.now();
479    document.addEventListener('visibilitychange', function () {
480        if (document.visibilityState === 'hidden')
481            _lastHiddenTimestamp = Date.now();
482    });
483}
484function getConfig(key) {
485    var _a;
486    return __awaiter(this, void 0, void 0, function () {
487        var res, contentType, error_1;
488        return __generator(this, function (_b) {
489            switch (_b.label) {
490                case 0:
491                    _b.trys.push([0, 4, , 5]);
492                    if (!key) {
493                        return [2, {}];
494                    }
495                    return [4, fetch('/napi/config/center?key=' + key)];
496                case 1:
497                    res = _b.sent();
498                    if (!res || !res.ok) {
499                        return [2, {}];
500                    }
501                    contentType = (_a = res.headers) === null || _a === void 0 ? void 0 : _a.get('content-type');
502                    if (!(contentType && contentType.includes('application/json'))) return [3, 3];
503                    return [4, res.json()];
504                case 2: return [2, _b.sent()];
505                case 3: return [2, {}];
506                case 4:
507                    error_1 = _b.sent();
508                    console.error('getConfig error:', error_1);
509                    return [2, {}];
510                case 5: return [2];
511            }
512        });
513    });
514}
515function getDefaultTracesSampleRate() {
516    return defaultTracesSampleRate;
517}
518function getEnvironment(tracesSampleRate) {
519    if (tracesSampleRate === 1) {
520        return 'pro-full-trace';
521    }
522    return 'pro';
523}
524var ignoreErrors = [
525    'domtoimage: Error while reading CSS rules from https:',
526    "Can't find variable: WeixinJSBridge",
527    "Can't find variable: WebViewJavascriptBridge",
528    'WebViewJavascriptBridge is not defined',
529    'AbortError: The operation was aborted.',
530    'window.ttJSBridge is undefined',
531    'judgeHmHashcode is not defined',
532    'No error message',
533    'The network connection was lost.',
534    'Failed to fetch',
535    'Load failed',
536    'TypeError: Load failed',
537    "Can't find variable: cordova",
538    'appcb is not defined',
539    'LIDNotify is not defined',
540    '網路連線中斷。',
541    '已取消',
542    'Internet連線已斷開。',
543    'UnhandledRejection: Non-Error promise rejection captured with value: Timeout',
544    'transition superseded',
545    'Error: [ngModel:numfmt] Expected',
546    /^AbortError: The play/i,
547    /^NotAllowedError: The request is not/i,
548    /^The fetching process for the media resource was aborted/i,
549    'Loading CSS chunk',
550    'Network Error',
551    'fetch error',
552    'network error',
553    'Network Failure',
554    'Request failed',
555    'Invalid reCAPTCHA client',
556    'Java bridge method invocation error',
557    'Non-recoverable error. Do not retry',
558    'WeakRef is not defined',
559    'Script execution context has stopped',
560    'Request aborted',
561    'insertHotWords is not defined',
562    'Attempt to delete range from database without an in-progress transaction',
563    'An internal error was encountered in the Indexed Database server',
564    'NetworkError when attempting to fetch resource',
565    'dpfrzbu0cqnmm.cloudfront.net',
566    'statics-cdn-cn.umucdn.cn',
567    'キャンセルしました',
568    'Google captcha script load failed',
569    'load script src failed',
570    "undefined is not an object (evaluating 'M.didTimeout')",
571    /recaptcha.*\.js/i
572];
573var DynamicSentryIgnoreErrorsManager = (function () {
574    function DynamicSentryIgnoreErrorsManager() {
575        this.ignoreErrors = [];
576        this.initPromise = null;
577    }
578    DynamicSentryIgnoreErrorsManager.getInstance = function () {
579        if (!DynamicSentryIgnoreErrorsManager.instance) {
580            DynamicSentryIgnoreErrorsManager.instance = new DynamicSentryIgnoreErrorsManager();
581        }
582        return DynamicSentryIgnoreErrorsManager.instance;
583    };
584    DynamicSentryIgnoreErrorsManager.prototype.initialize = function () {
585        return __awaiter(this, void 0, void 0, function () {
586            return __generator(this, function (_a) {
587                if (this.initPromise) {
588                    return [2, this.initPromise];
589                }
590                this.initPromise = this.doInitialize();
591                return [2, this.initPromise];
592            });
593        });
594    };
595    DynamicSentryIgnoreErrorsManager.prototype.doInitialize = function () {
596        return __awaiter(this, void 0, void 0, function () {
597            var res, url, response, contentType, data, error_2;
598            return __generator(this, function (_a) {
599                switch (_a.label) {
600                    case 0:
601                        _a.trys.push([0, 4, , 5]);
602                        return [4, getConfig('sentry_ignore_list_url')];
603                    case 1:
604                        res = _a.sent();
605                        url = (res === null || res === void 0 ? void 0 : res.data) || '';
606                        if (!url) {
607                            return [2];
608                        }
609                        return [4, fetch(url)];
610                    case 2:
611                        response = _a.sent();
612                        if (!response.ok) {
613                            return [2];
614                        }
615                        contentType = response.headers.get('content-type');
616                        if (!contentType || !contentType.includes('application/json')) {
617                            return [2];
618                        }
619                        return [4, response.json()];
620                    case 3:
621                        data = _a.sent();
622                        if (Array.isArray(data)) {
623                            this.ignoreErrors = data;
624                        }
625                        return [3, 5];
626                    case 4:
627                        error_2 = _a.sent();
628                        console.error('DynamicSentryIgnoreErrorsManager initialize error', error_2);
629                        return [3, 5];
630                    case 5: return [2];
631                }
632            });
633        });
634    };
635    DynamicSentryIgnoreErrorsManager.prototype.getIgnoreErrors = function () {
636        return this.ignoreErrors;
637    };
638    return DynamicSentryIgnoreErrorsManager;
639}());
640var beforeSend = function (event, hint) {
641    if (window.location.protocol === 'file:') {
642        return null;
643    }
644    var ignoreErrorList = ['domtoimage: Error while reading CSS rules from', '/editor/editor'].concat(DynamicSentryIgnoreErrorsManager.getInstance().getIgnoreErrors());
645    var e = (event && event.exception && event.exception.values && event.exception.values[0]) || {};
646    var exceptionMessage = e.value || '';
647    if (ignoreErrorList.some(function (error) { return exceptionMessage.indexOf(error) > -1; })) {
648        return null;
649    }
650    return event;
651};
652var initSentry = function (tracesSampleRate, replaysSessionSampleRate, replaysOnErrorSampleRate) {
653    try {
654        if (Sentry.Integrations.BrowserTracing && Sentry.Integrations.GlobalHandlers) {
655            integrations.push(new Sentry.Integrations.BrowserTracing());
656            integrations.push(new Sentry.Integrations.GlobalHandlers({ onunhandledrejection: true, onerror: true }));
657        }
658        if (Sentry.browserTracingIntegration) {
659            integrations.push(Sentry.browserTracingIntegration());
660        }
661        if (Sentry.globalHandlersIntegration) {
662            integrations.push(Sentry.globalHandlersIntegration({ onunhandledrejection: true, onerror: true }));
663        }
664        if (Sentry.captureConsoleIntegration) {
665            integrations.push(Sentry.captureConsoleIntegration({ levels: ['error'] }));
666        }
667        DynamicSentryIgnoreErrorsManager.getInstance().initialize();
668        Sentry.init({
669            environment: getEnvironment(tracesSampleRate),
670            dsn: dsn,
671            integrations: integrations,
672            ignoreErrors: tracesSampleRate === 1 ? [] : ignoreErrors,
673            denyUrls: [
674                /^chrome:/i,
675                /chrome-extension:/i,
676                /extension:\/\//i,
677                /^webkit-masked-url:/i,
678                /\/statics\/js\/vendor\/kity-formula\/kityformula-editor\.all\.js/i,
679                /\/cdn\/js\/jquery\/jquery(-[\d.]+)?(\.min)?\.js/i,
680                /https:\/\/www\.gstatic\.com\/recaptcha\/releases\//i,
681                /https:\/\/www\.recaptcha\.net\//i,
682                /^[A-Z]:\/.*\.(js|html)/i
683            ],
684            release: release,
685            tracesSampleRate: tracesSampleRate,
686            replaysSessionSampleRate: replaysSessionSampleRate,
687            replaysOnErrorSampleRate: replaysOnErrorSampleRate,
688            beforeSend: tracesSampleRate === 1
689                ? function (event, hint) {
690                    attachNetworkTags(event);
691                    if (isBotTraffic())
692                        return null;
693                    return event;
694                }
695                : function (event, hint) {
696                    attachNetworkTags(event);
697                    if (isBotTraffic())
698                        return null;
699                    return beforeSend(event, hint);
700                },
701            beforeSendTransaction: function (event) {
702                attachNetworkTags(event);
703                if (!event.tags)
704                    event.tags = {};
705                var txStartMs = (event.start_timestamp || 0) * 1000;
706                var wasHiddenDuringTx = _lastHiddenTimestamp > 0 && _lastHiddenTimestamp >= txStartMs;
707                var ttfb = event.measurements && event.measurements.ttfb && event.measurements.ttfb.value;
708                var navTiming = getNavigationTiming();
709                event.tags['page.wasBackgrounded'] = String(wasHiddenDuringTx);
710                event.tags['network.connectTime'] = String(navTiming.connectTime);
711                event.tags['network.dnsTime'] = String(navTiming.dnsTime);
712                if (isBotTraffic()) {
713                    console.log('[Sentry] Bot 流量,丢弃性能事务:', navigator.userAgent);
714                    return null;
715                }
716                if (wasHiddenDuringTx || (typeof ttfb === 'number' && ttfb > 10000)) {
717                    console.log('[Sentry] 疑似后台标签页,丢弃性能事务');
718                    return null;
719                }
720                if (isWeakNetwork()) {
721                    console.log('[Sentry] 弱网环境,丢弃性能事务:', getNetworkInfo());
722                    return null;
723                }
724                if (navTiming.connectTime > 3000 || navTiming.dnsTime > 3000) {
725                    console.log('[Sentry] 网络连接异常(connect/DNS > 3s),丢弃性能事务:', navTiming);
726                    return null;
727                }
728                var lcpMeasurement = event.measurements && (event.measurements['lcp'] || event.measurements['largest-contentful-paint']);
729                var lcp = lcpMeasurement && lcpMeasurement.value;
730                if (typeof lcp === 'number' && lcp > 15000) {
731                    console.log('[Sentry] LCP 异常(> 15s),丢弃性能事务:', lcp);
732                    return null;
733                }
734                return event;
735            }
736        });
737        Sentry.setUser(params);
738        Sentry.setTags(params);
739    }
740    catch (err) {
741        console.error('init sentry failed: ', err);
742    }
743};
744var initSentryWithTracesSampleRate = function () {
745    if (!window.Sentry) {
746        return;
747    }
748    var tracesSampleRate = getDefaultTracesSampleRate();
749    var replaysSessionSampleRate = 0;
750    var replaysOnErrorSampleRate = 0;
751    if (!window.fetch || !window.Promise) {
752        initSentry(tracesSampleRate, replaysSessionSampleRate, replaysOnErrorSampleRate);
753    }
754    else {
755        getConfig('sentry_all_log_open')
756            .then(function (res) {
757            if (!res || !res.data) {
758                return;
759            }
760            try {
761                var data = JSON.parse(res.data);
762                var uId = params.uId;
763                if (data && uId && data[uId]) {
764                    var value = data[uId];
765                    tracesSampleRate = value;
766                    replaysSessionSampleRate = value;
767                    replaysOnErrorSampleRate = value;
768                }
769            }
770            catch (parseErr) {
771                console.error('parse traces sample rate failed: ', parseErr);
772            }
773        })
774            .catch(function (err) {
775            console.error('get traces sample rate failed: ', err);
776        })
777            .finally(function () {
778            initSentry(tracesSampleRate, replaysSessionSampleRate, replaysOnErrorSampleRate);
779        });
780    }
781};
782initSentryWithTracesSampleRate();
783
784            })({"version":"\"1a1b95d\"","tracesSampleRate":0.5,"sentryDSN":"https://[email protected]/5"})</script>
784<script src="https://statics-cdn-cn.umucdn.cn/twww/cn/editor/editor.e1e09945.js"></script>
784<script src="https://statics-cdn-cn.umucdn.cn/twww/cn/cropper/cropper.48613f7c.js"></script>
784<script>$(function(){
785                $('.site-loading-holder').remove();
786            })
787
788            window.Lang = 'zh-cn';window.SYSTEM = 'CN';
789            
790        (function () {
791            var id = '';
792            
793            id = ''
794        ;
795            
796        })();</script>
796<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/umu_pc_webpack_runtime/umu_pc_webpack_runtime.2eaa0b77.js"></script>
vendor: 1 bytes, line 796
796
797<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/u_design_umu_pc/u_design_umu_pc.d9905e53.js"></script>
vendor: 1 bytes, line 797
797
798<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/lodash_umu_pc/lodash_umu_pc.939d9b72.js"></script>
vendor: 1 bytes, line 798
798
799<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/a_design_umu_pc/a_design_umu_pc.48240c8c.js"></script>
vendor: 1 bytes, line 799
799
800<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/common_header_umu_pc/common_header_umu_pc.1ba70c27.js"></script>
vendor: 1 bytes, line 800
800
801<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/umu_search_umu_pc/umu_search_umu_pc.88db1c86.js"></script>
vendor: 1 bytes, line 801
801
802<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/libs_common_umu_pc/libs_common_umu_pc.46725451.js"></script>
vendor: 1 bytes, line 802
802
803<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/libs_business_common_umu_pc/libs_business_common_umu_pc.02df24e8.js"></script>
vendor: 1 bytes, line 803
803
804<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/umu_vendors_umu_pc/umu_vendors_umu_pc.e9a99602.js"></script>
vendor: 1 bytes, line 804
804
805<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/pc_common_umu_pc/pc_common_umu_pc.a96e4158.js"></script>
vendor: 1 bytes, line 805
805
806<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/third_vendors_umu_pc/third_vendors_umu_pc.11de5363.js"></script>
vendor: 1 bytes, line 806
806
807<script type="text/javascript" src="https://statics-cdn-cn.umucdn.cn/twww/cn/accountLogin/accountLogin.5d6160bc.js"></script>
807<script>var _hmt = _hmt || [];
808        (function() {
809            // 参考 https://docs.google.com/document/d/1tT8phqsLFJEadH_kQ9hZTnGHttXtrEj1vgzuI3_2m1g/edit?tab=t.0
810            // www.umu.cn 使用 0dda0edb8e4fbece1e49e12fc49614dc
811            // m.umu.cn 使用 bbf1c0b388094948c606c69ac34f024c
812            const isMobileHost = /^m\.|\.m\./i.test(location.host);
813            const tagId = isMobileHost ? 'bbf1c0b388094948c606c69ac34f024c' : '0dda0edb8e4fbece1e49e12fc49614dc';
814            var hm = document.createElement("script");
815            hm.src = "//hm.baidu.com/hm.js?" + tagId;
816            var s = document.getElementsByTagName("script")[0];
817            s.parentNode.insertBefore(hm, s);
818        })();</script>
818<script>const tagId = "GTM-KLDVBZRM";
819
820
821
822
823        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
824        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
825        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
826        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
827        })(window,document,'script','dataLayer', tagId);</script>
vendor: 67 bytes, line 827
827<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
827GTM-KLDVBZRM
vendor: 82 bytes, line 827
827" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
827<script>window.version = "1a1b95d"</script>
827<script>(function() {
828                        var s = document.createElement('script');
829                        s.src = 'https://cdn.beschannels.com/js-sdk/collect-0.0.5.min.js';
830                        s.onload = function() {
831                            try {
832                                window.myCollect = new window.Collect({
833                                    org_id: 'org9c62775d12ec259ade7473e6b65f951c',
834                                    event_props: {
835                                        source: 'web'
836                                    }
837                                });
838                                if (window.myCollect) {
839                                    window.myCollect.init({
840                                        page_view_auto: false,
841                                        element_click_auto: false,
842                                        events: ['BUTTON', 'input[type="submit"]', 'IMG', 'A']
843                                    });
844                                }
845                            } catch (error) {
846                                console.log(error);
847                            }
848                        };
849                        s.onerror = function() {
850                            console.log('Failed to load collect SDK');
851                        };
852                        document.body.appendChild(s);
853                    })();</script>
853</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.