<!doctype html>
<html data-kumuhana="default">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="noindex">
    <meta name="robots" content="nofollow">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
    <link rel="apple-touch-icon" href="https://mdn.alipayobjects.com/huamei_0prmtq/afts/img/A*sRUdR543RjcAAAAAAAAAAAAADvuFAQ/original" />
    <meta http-equiv="X-UA-Compatible" content="edge">
    
    <meta name="pagetype" content="new_session">
    <meta name="pagename" content="new_session">
    <meta name="description" content="十万阿里人都在用的笔记与文档知识库，面向企业、组织或个人，提供全新的体系化知识管理，打造轻松流畅的工作协同。金融级数据安全、丰富的应用场景、强大的知识创作与管理，助力企业、个人轻松拥有云端知识库">
    <meta property="og:type" content="webpage">
    <meta property="og:url" content="https://www.yuque.com/login?goto=https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjava%2F670787%2F1595734635330-20c64ce7-d924-4d0c-a587-324db8d5ebda.java">
    <meta property="og:title" content="登录 · 语雀">
    <meta property="og:description" content="十万阿里人都在用的笔记与文档知识库，面向企业、组织或个人，提供全新的体系化知识管理，打造轻松流畅的工作协同。金融级数据安全、丰富的应用场景、强大的知识创作与管理，助力企业、个人轻松拥有云端知识库">
    <meta property="og:image" content="https://mdn.alipayobjects.com/huamei_0prmtq/afts/img/A*sRUdR543RjcAAAAAAAAAAAAADvuFAQ/original">
    <title>登录 · 语雀</title>
    <link type="image/png" href="https://mdn.alipayobjects.com/huamei_0prmtq/afts/img/A*vMxOQIh4KBMAAAAAAAAAAAAADvuFAQ/original" rel="shortcut icon" />
    <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="语雀" />
    <link rel="manifest" href="/manifest.json" />
    <meta name="theme-color" media="(prefers-color-scheme: dark)"  content="black">
    <meta name="theme-color" media="(prefers-color-scheme: light)" content="#E7E9E8">

    <link href="https://gw.alipayobjects.com" rel="dns-prefetch" />
<link href="https://mdap.alipay.com" rel="dns-prefetch" />
<link href="https://cdn.nlark.com" rel="dns-prefetch" />
<link href="https://cdn.yuque.com" rel="dns-prefetch" />
<link href="https://kcart.alipay.com" rel="dns-prefetch" />
<link href="https://cdn-pri.nlark.com" rel="dns-prefetch" />
<link href="https://g.yuque.com" rel="dns-prefetch" />



    
<link rel="stylesheet" href="https://gw.alipayobjects.com/os/chair-script/skylark/deps.49d14cd0.css" crossorigin="anonymous" />
<link rel="stylesheet" href="https://gw.alipayobjects.com/os/chair-script/skylark/larkui.c14af959.css" crossorigin="anonymous" />


    <link rel="stylesheet" href="https://gw.alipayobjects.com/os/chair-script/skylark/pc.0a82ad58.css" crossorigin="anonymous" />
    
    <meta name="renderer" content="webkit">
    <script src="//g.alicdn.com/frontend-lib/frontend-lib/2.3.74/antidom.js"></script><script src="//o.alicdn.com/frontend-lib/common-lib/jquery.min.js"></script><script nonce=d3XUZtJMM0utFC89aTpL>
  window._macaca_runtime_collector = [];
  var MaxErrorReportLimit = 100;
  var initialPageHref = window.location.href;

  // 简单的将错误采集上报到雨燕
  window.onerror = function(message, source, lineno, colno, error) {
    // 同一个页面最多上报100次错误，防止某个循环错误页面一直打开，不断的报错
    if (MaxErrorReportLimit-- < 0) return;
    if (!message) return; // 没有 message 不上报
    if (message === 'ResizeObserver loop limit exceeded' || message === 'ResizeObserver loop completed with undelivered notifications.') return; // 无意义的 message 不上报
    if (source && source.indexOf('chrome-extension://') === 0) return; // chrome 插件注入的不上报
    try {
      var data = {
        message: message,
        source: source,
        lineno: lineno,
        colno: colno,
        stack: error && error.stack,
        traceId: window.appData && window.appData.traceId,
        href: window.location.href
      };
      // Macaca 回归使用
      window._macaca_runtime_collector.push({
        type: 'onerror',
        data: data
      });

      // yuyanMonitor 记录错误堆栈
      if (window.yuyanMonitor) {
        yuyanMonitor.logError(error, {
          code: 1,
          msg: message
        });
      }

      if (window.appData
        && window.appData.isYuqueMobileApp
        && initialPageHref.indexOf('/r/mobile_app/skeleton_v2') > 0
        && message !== 'Script error.'
        && message.indexOf('lakex_editor_assert_error') < 0) {

        // App 骨架屏错误埋点
        data.instanceId = window.AlipayJSBridge
          && window.AlipayJSBridge.startupParams
          && window.AlipayJSBridge.startupParams.rctInstanceId;

        NativeBridges.monitorEvent({
          eventId: 'skeleton_onerror',
          extParams: data
        });
      }
    } catch (err) {
      console.log('report error', err);
    }
  };
  window.addEventListener('unhandledrejection', function(e) {
    var data = {
      message: e.reason && e.reason.message,
      stack: e.reason && e.reason.stack,
      href: window.location.href,
      traceId: window.appData && window.appData.traceId
    };
    // Macaca 回归使用
    window._macaca_runtime_collector.push({
      type: 'unhandledrejection',
      data: data
    });
  });
</script>

  </head>
  <body>
    
    
<script nonce=d3XUZtJMM0utFC89aTpL>
(function() {
  window.appData = JSON.parse(decodeURIComponent("%7B%22me%22%3A%7B%22avatar_url%22%3A%22https%3A%2F%2Fgw.alipayobjects.com%2Fzos%2Frmsportal%2FApEnVmpRbThmwJJukDlb.jpeg%22%2C%22avatar%22%3A%22https%3A%2F%2Fgw.alipayobjects.com%2Fzos%2Frmsportal%2FApEnVmpRbThmwJJukDlb.jpeg%22%2C%22language%22%3A%22zh-cn%22%2C%22is_admin%22%3Afalse%2C%22is_uirobot%22%3Afalse%7D%2C%22notification%22%3A%7B%7D%2C%22settings%22%3A%7B%22allowed_link_schema%22%3A%5B%22dingtalk%3A%22%5D%2C%22login_wechat_platform_type%22%3A%22wechat%22%2C%22enable_link_interception%22%3Atrue%2C%22enable_new_user_public_ability_forbid%22%3Atrue%2C%22user_registry_forbidden_level%22%3A%22%22%2C%22watermark_enable%22%3A%22%22%2C%22public_space_doc_search_enable%22%3Atrue%2C%22lake_enabled_groups%22%3A%22*%22%2C%22image_proxy_root%22%3A%22%22%2C%22max_import_task_count%22%3A1%2C%22enable_search%22%3Atrue%2C%22enable_serviceworker%22%3Atrue%2C%22enable_lazyload_card%22%3A%22codeblock%22%2C%22editor_canary%22%3A%7B%22card_lazy_init%22%3A100%2C%22retryOriginImage%22%3A100%7D%2C%22enable_attachment_multipart%22%3Atrue%2C%22enable_custom_video_player%22%3Atrue%2C%22conference_gift_num%22%3A0%2C%22intranet_safe_tip%22%3A%5B%22open%22%5D%2C%22publication_enable_whitelist%22%3A%5B%5D%2C%22foreign_phone_registry_enabled_organization_whitelist%22%3A%5B%2216014876%22%2C%2216022684%22%2C%2216052442%22%2C%2218041640%22%2C%221437%22%2C%221565%22%2C%221796%22%2C%222838%22%2C%2216052442%22%2C%22309%22%2C%2222614%22%2C%221780%22%2C%226001397%22%2C%2214481%22%2C%2214040138%22%2C%2216052442%22%2C%2214043106%22%2C%2214006688%22%2C%2216033469%22%2C%2218044074%22%2C%2211321%22%2C%222008%22%2C%2235721%22%2C%226001216%22%2C%22806%22%2C%2218041640%22%2C%2218100055%22%2C%2216022684%22%2C%2220013926%22%2C%2221004993%22%2C%221780%22%2C%2216040901%22%2C%2221008258%22%2C%2222004689%22%2C%2222007115%22%2C%2216019689%22%2C%2223010%22%2C%2222614%22%2C%2214051630%22%2C%2222490268%22%2C%2223080560%22%2C%2214059233%22%2C%2214013581%22%2C%222390%22%5D%2C%22disable_comment_socket%22%3Atrue%2C%22disabled_login_modal_pop_default%22%3Atrue%2C%22enable_open_in_mobile_app%22%3Atrue%2C%22enable_wechat_guide_qrcode%22%3Atrue%2C%22enable_blank_page_detect%22%3Atrue%2C%22zone_ant_auth_keepalive_enabled_domains%22%3A%5B%5D%2C%22enable_new_group_page_whitelist%22%3A%5B%5D%2C%22enable_web_ocr%22%3A%7B%22enable%22%3Atrue%2C%22disableBrowsersUpVersion%22%3A%7B%22mac%22%3A%7B%22chrome%22%3A%22128%22%7D%7D%2C%22enableBrowsers%22%3A%5B%22chrome%22%5D%2C%22_users%22%3A%5B106822%5D%2C%22percent%22%3A100%7D%2C%22customer_staff_dingtalk_id%22%3A%22%22%2C%22enable_desktop_force_local%22%3Atrue%2C%22side_third_app_config%22%3A%7B%7D%2C%22desktop_check_network_status_interval%22%3A30%2C%22debug_assistant_provider_url%22%3A%22%22%2C%22codefuse_assistant_provider_url%22%3A%22%22%2C%22opsgpt_assistant_provider_url%22%3A%22%22%2C%22enable_links%22%3A%22true%22%2C%22user_certifications_share_whitelist%22%3A%5B%22352135%22%2C%2239191355%22%2C%2295294%22%2C%2213012852%22%2C%2239187844%22%2C%2239195365%22%2C%2222303185%22%2C%2239199571%22%2C%2239200198%22%5D%2C%22user_certifications_share_scale%22%3A10%2C%22app_trusted_url_patterns%22%3A%5B%22%5Ehttps%3F%3A%5C%5C%2F%5C%5C%2F%5Ba-zA-Z0-9.-%5D%2B%5C%5C.yuque%5C%5C.com%22%2C%22%5Ehttps%3F%3A%5C%5C%2F%5C%5C%2F%5Ba-zA-Z0-9.-%5D%2B%5C%5C.nlark%5C%5C.com%22%2C%22%5Ealipays%3F%3A%5C%5C%2F%5C%5C%2F%22%5D%2C%22enable_mobile_appeal%22%3Atrue%2C%22member_buy_ad%22%3A%7B%7D%2C%22success_buy_ad%22%3A%7B%7D%2C%22doc_generator_type_blacklist%22%3A%5B%5D%2C%22ai_infer_daily_max_call%22%3A100%2C%22text_correction_config%22%3A%7B%7D%2C%22doc_arrangement_config%22%3Anull%2C%22enable_public_search%22%3A%7B%7D%2C%22site_beian_config%22%3A%7B%22nlark%22%3A%7B%22icp%22%3A%22%E5%90%88%E5%AD%97B2-20200098%22%2C%22icpBeian%22%3A%22%E6%B5%99ICP%E5%A4%8714032978%E5%8F%B7-12%22%2C%22policeBeian%22%3A%22%E6%B5%99%E5%85%AC%E7%BD%91%E5%AE%89%E5%A4%8733010602013485%22%7D%2C%22yuque%22%3A%7B%22icp%22%3A%22%E5%90%88%E5%AD%97B2-20200098%22%2C%22icpBeian%22%3A%22%E6%B5%99ICP%E5%A4%8714032978%E5%8F%B7-13%22%2C%22policeBeian%22%3A%22%E6%B5%99%E5%85%AC%E7%BD%91%E5%AE%89%E5%A4%8733010602012110%22%7D%7D%2C%22gray_scale%22%3A%7B%22enableDingtalkWorkMessageRobot%22%3Afalse%2C%22enableDingtalkWorkMessageRobotUseMQ%22%3Afalse%2C%22editorAudioPlugin%22%3Afalse%2C%22editorTodoPlugin%22%3Afalse%2C%22htmlDoc%22%3Afalse%2C%22htmlDocFineTuneEdit%22%3Afalse%2C%22aiDocPage%22%3Afalse%2C%22agiImage%22%3Afalse%2C%22askAi%22%3Afalse%2C%22docReferenceRag%22%3Afalse%2C%22tboxAgent%22%3Afalse%2C%22tboxAgentV2%22%3Afalse%2C%22inviteRead%22%3Afalse%2C%22intranetUserSearchOptimize%22%3Afalse%2C%22docMeta%22%3Afalse%2C%22masterMeta%22%3Afalse%2C%22desktopOnline%22%3Atrue%2C%22hrorgSearchUser%22%3Afalse%2C%22hrorgFetchDepartments%22%3Afalse%2C%22textDiagramAi%22%3Afalse%2C%22resourceLabeling%22%3Afalse%2C%22errorWording%22%3Afalse%2C%22errorWordingPopover%22%3Afalse%2C%22newSuperSidebar%22%3Afalse%2C%22docMaster%22%3Afalse%2C%22enabledDocMasterAutoTran%22%3Afalse%2C%22docMasterAll%22%3Afalse%2C%22dingtalkTab2%22%3Afalse%2C%22dingtalkGroupCollaborationMerge%22%3Afalse%2C%22filetransferDockerOsx%22%3Afalse%2C%22diffEntry%22%3Afalse%2C%22newToolbar%22%3Afalse%2C%22board%22%3Afalse%2C%22antDingLinkUnfurling%22%3Afalse%7D%2C%22enable_book_doc_pin%22%3Atrue%2C%22wexin_browser_video_play_config%22%3A%22%22%2C%22ai_page_styles%22%3A%5B%5D%2C%22ai_askai_config%22%3A%7B%7D%2C%22threadCommentReplyUseRichText%22%3Atrue%2C%22all_default_captcha_enable%22%3Atrue%2C%22support_extension_download_url%22%3Atrue%2C%22support_extension_download_assembly%22%3Atrue%2C%22user_communication_group_qrcode%22%3A%22https%3A%2F%2Fmdn.alipayobjects.com%2Fhuamei_0prmtq%2Fafts%2Fimg%2FA*5CiSRraBRL0AAAAAAAAAAAAADvuFAQ%2Foriginal%22%7D%2C%22cloudSettings%22%3A%7B%22disable_client_download%22%3Afalse%2C%22disable_issue%22%3Afalse%2C%22disable_office_preview%22%3Afalse%2C%22disable_site_tip%22%3Afalse%2C%22disable_super_assistant%22%3Afalse%2C%22disable_ai_doc_generator%22%3Afalse%2C%22disable_ai_doc_writer%22%3Afalse%2C%22disable_ai_doc_reader%22%3Afalse%7D%2C%22env%22%3A%22prod%22%2C%22space%22%3A%7B%22id%22%3A0%2C%22login%22%3A%22%22%2C%22name%22%3A%22%E8%AF%AD%E9%9B%80%22%2C%22short_name%22%3Anull%2C%22status%22%3A0%2C%22account_id%22%3A0%2C%22logo%22%3Anull%2C%22description%22%3A%22%22%2C%22created_at%22%3Anull%2C%22updated_at%22%3Anull%2C%22host%22%3A%22https%3A%2F%2Fwww.yuque.com%22%2C%22displayName%22%3A%22%E8%AF%AD%E9%9B%80%22%2C%22logo_url%22%3A%22https%3A%2F%2Fcdn.nlark.com%2Fyuque%2F0%2F2022%2Fpng%2F303152%2F1665994257081-avatar%2Fdcb74862-1409-4691-b9ce-8173b4f6e037.png%22%2C%22enable_password%22%3Atrue%2C%22enable_watermark%22%3Afalse%2C%22_serializer%22%3A%22web.space%22%7D%2C%22isYuque%22%3Atrue%2C%22isPublicCloud%22%3Atrue%2C%22isEnterprise%22%3Afalse%2C%22isUseAntLogin%22%3Afalse%2C%22defaultSpaceHost%22%3A%22https%3A%2F%2Fwww.yuque.com%22%2C%22timestamp%22%3A1784537943057%2C%22traceId%22%3A%220a223ca1178453794302481561083488%22%2C%22siteName%22%3A%22%E8%AF%AD%E9%9B%80%22%2C%22siteTip%22%3Anull%2C%22activityTip%22%3Anull%2C%22topTip%22%3Anull%2C%22readTip%22%3A%7B%7D%2C%22questionRecommend%22%3Anull%2C%22dashboardBannerRecommend%22%3Anull%2C%22imageServiceDomains%22%3A%5B%22cdn.yuque.com%22%2C%22cdn.nlark.com%22%2C%22img.shields.io%22%2C%22travis-ci.org%22%2C%22api.travis-ci.org%22%2C%22npm.packagequality.com%22%2C%22snyk.io%22%2C%22coveralls.io%22%2C%22badgen.now.sh%22%2C%22badgen.net%22%2C%22packagephobia.now.sh%22%2C%22duing.alibaba-inc.com%22%2C%22npm.alibaba-inc.com%22%2C%22web.npm.alibaba-inc.com%22%2C%22npmjs.com%22%2C%22npmjs.org%22%2C%22npg.dockerlab.alipay.net%22%2C%22private-alipayobjects.alipay.com%22%2C%22googleusercontent.com%22%2C%22blogspot.com%22%2C%22cdn.hk01.com%22%2C%22camo.githubusercontent.com%22%2C%22gw.daily.taobaocdn.net%22%2C%22cdn-images-1.medium.com%22%2C%22medium.com%22%2C%22i.stack.imgur.com%22%2C%22imgur.com%22%2C%22doc.ucweb.local%22%2C%22lh6.googleusercontent.com%22%2C%224.bp.blogspot.com%22%2C%22bp.blogspot.com%22%2C%22blogspot.com%22%2C%221.bp.blogspot.com%22%2C%222.bp.blogspot.com%22%2C%223.bp.blogspot.com%22%2C%22aliwork-files.oss-accelerate.aliyuncs.com%22%2C%22oss-accelerate.aliyuncs.com%22%2C%22work.alibaba.net%22%2C%22work.alibaba-inc.com%22%2C%22work-file.alibaba.net%22%2C%22work-file.alibaba-inc.com%22%2C%22pre-work-file.alibaba-inc.com%22%2C%22yuque.antfin.com%22%2C%22yuque.antfin-inc.com%22%2C%22intranetproxy.alipay.com%22%2C%22lark-assets-prod-aliyun.oss-accelerate.aliyuncs.com%22%2C%22lh1.googleusercontent.com%22%2C%22lh2.googleusercontent.com%22%2C%22lh3.googleusercontent.com%22%2C%22lh4.googleusercontent.com%22%2C%22lh5.googleusercontent.com%22%2C%22lh6.googleusercontent.com%22%2C%22lh7.googleusercontent.com%22%2C%22lh8.googleusercontent.com%22%2C%22lh9.googleusercontent.com%22%2C%22raw.githubusercontent.com%22%2C%22github.com%22%2C%22en.wikipedia.org%22%2C%22rawcdn.githack.com%22%2C%22pre-work-file.alibaba-inc.com%22%2C%22alipay-rmsdeploy-image.cn-hangzhou.alipay.aliyun-inc.com%22%2C%22antsys-align-files-management.cn-hangzhou.alipay.aliyun-inc.com%22%2C%22baiyan-pre.antfin.com%22%2C%22baiyan.antfin.com%22%2C%22baiyan.dev.alipay.net%22%2C%22marketing.aliyun-inc.com%22%2C%22lark-temp.oss-cn-hangzhou.aliyuncs.com%22%2C%22www.yuque.com%22%2C%22yuque.com%22%2C%22cdn.nlark.com%22%5D%2C%22sharePlatforms%22%3A%5B%22wechat%22%2C%22dingtalk%22%5D%2C%22locale%22%3A%22zh-cn%22%2C%22customTracertConfig%22%3A%7B%22spmBPos%22%3Anull%7D%2C%22login%22%3A%7B%22loginType%22%3A%22normal%22%2C%22enablePlatforms%22%3A%5B%22dingtalk%22%2C%22alipay%22%2C%22teambition%22%2C%22apple%22%2C%22wechat%22%5D%2C%22isWechatMobileApp%22%3Afalse%2C%22platform%22%3Anull%2C%22oauthURL%22%3A%22https%3A%2F%2Foapi.dingtalk.com%2Fconnect%2Fqrconnect%3Fscope%3Dsnsapi_login%26response_type%3Dcode%26appid%3Ddingoakbgng92btxiwpydr%26redirect_uri%3Dhttps%253A%252F%252Fwww.yuque.com%252Flogin%252Foauth%252Fnull%252Fcallback%26state%3Dbaa72873-9ff8-4405-8632-2f27f44349f5%22%2C%22oauthParams%22%3A%7B%22scope%22%3A%22snsapi_login%22%2C%22response_type%22%3A%22code%22%2C%22appid%22%3A%22dingoakbgng92btxiwpydr%22%2C%22redirect_uri%22%3A%22https%3A%2F%2Fwww.yuque.com%2Flogin%2Foauth%2Fnull%2Fcallback%22%2C%22state%22%3A%22baa72873-9ff8-4405-8632-2f27f44349f5%22%7D%2C%22twoFAContext%22%3Anull%7D%2C%22isDesktopInValidVersion%22%3Afalse%2C%22qrCodeUrl%22%3A%22%22%2C%22paymentInfo%22%3A%7B%22paymentBizInstId%22%3A%22Z69%22%7D%2C%22interest%22%3A%7B%22interests%22%3A%7B%7D%7D%2C%22captchaAppKey%22%3A%22FFFF000000000179A3AD%22%2C%22captchaConfig%22%3A%7B%22enabled%22%3Atrue%2C%22renderMode%22%3A%22embed%22%2C%22versions%22%3A%7B%22login%22%3A%22v2%22%2C%22register%22%3A%22v2%22%2C%22nc_login_h5%22%3A%22v2%22%2C%22nc_register_h5%22%3A%22v2%22%7D%2C%22prefix%22%3A%221buwf8%22%2C%22region%22%3A%22cn%22%2C%22scenes%22%3A%7B%22login%22%3A%22c69d7kwq%22%2C%22nc_login_h5%22%3A%22c69d7kwq%22%2C%22register%22%3A%2219tne5l5%22%2C%22nc_register_h5%22%3A%2219tne5l5%22%2C%22validation_code%22%3A%22%22%2C%22forgetPassword%22%3A%22%22%2C%22org_sms_invite%22%3A%22org_sms_invite%22%7D%7D%2C%22isDesktopApp%22%3Afalse%2C%22isAssistant%22%3Afalse%2C%22isAlipayApp%22%3Afalse%2C%22isDingTalkApp%22%3Afalse%2C%22isDingTalkMiniApp%22%3Afalse%2C%22isDingTalkDesktopApp%22%3Afalse%2C%22isYuqueMobileApp%22%3Afalse%2C%22tracertConfig%22%3A%7B%22spmAPos%22%3A%22a385%22%2C%22spmBPos%22%3Anull%7D%7D"));
})();
</script>


    <div id="ReactApp"></div>

    

    
    <script nonce=d3XUZtJMM0utFC89aTpL>window.__webpack_nonce__ = 'd3XUZtJMM0utFC89aTpL';</script>
    <script nonce=d3XUZtJMM0utFC89aTpL>
      performance && performance.mark && performance.mark("start-js-render");
    </script>
    
    
    
    
    
    <style type="text/css">
  .yq-blank-detection.module-error {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0 20px;
    flex-direction: column;
    text-align: center;
  }

  .yq-blank-detection.module-error h3 {
    font-size: 28px;
    font-weight: normal;
    color: #262626;
    margin-bottom: 16px;
  }

  .yq-blank-detection.module-error .error-message {
    color: #8c8c8c;
    font-size: 14px;
  }

  .yq-blank-detection.module-error .error-icon-1 {
    max-width: 45px;
    position: relative;
    left: 80px;
    top: -60px;
  }

  .yq-blank-detection.module-error .error-icon-2 {
    max-width: 54px;
    object-fit: contain;
    position: relative;
    left: -300px;
    top: 50px;
  }

  .yq-blank-detection.module-error .unknown-error {
    width: 100%;
    max-width: 1080px;
    margin-top: 50px;
  }

  .yq-blank-detection.module-error button {
    margin-top: 24px;
    color: white;
    background-color: rgb(83, 182, 114);
  }

  @media screen and (max-width: 768px) {
    .yq-blank-detection.module-error .unknown-error {
      max-width: 100%;
    }
    .yq-blank-detection.module-error .error-icon-2 {
      display: none;
    }
  }
</style>
<script nonce=d3XUZtJMM0utFC89aTpL>
  (function() {
    var rootNode = document.querySelector('#ReactApp');
    var appData = window.appData || {};
    var errorMessage = '';
    var BLANK_DETECTION_RELOAD = 'blankDetectionReload';

    var isSupportLocalStorage = (function() {
      var key = '__bd_check_storage';
      try {
        if (!window.localStorage) return false;

        window.localStorage.setItem(key, '1');
        window.localStorage.removeItem(key);
      } catch (e) {
        return false;
      }
      return true;
    })();

    function renderFeedBackTips() {
      // 反馈链接
      var feedBackUrl = window.location.origin + '/feedbacks/new';
      if (appData.traceId) {
        feedBackUrl += '?body=反馈信息：' + appData.traceId;
      }
      var isDesktopApp = window.appData.isDesktopApp;
      var feedback = window.appData.traceId ? '反馈信息：' + window.appData.traceId : '';
      var htmlList;
      if (isDesktopApp) {
        htmlList = [
          '<div id="yq-blank-detection" class="module-error yq-blank-detection">',
          '<div class="error-message">',
          '<h3>页面出错了</h3>',
          '<p>',
          '遇到一些未知错误，请尝试刷新页面、清除浏览器缓存或截图<a target="_blank" href="' + feedBackUrl + '">反馈</a>给我们',
          '</p>',
          '<p>' + feedback + '</p>',
          '<button class="ant-btn" id="yq-blank-detection-reload-button">重启客户端</button>'
        ];
      } else {
        htmlList = [
          '<div id="yq-blank-detection" class="module-error yq-blank-detection">',
          '<img class="error-icon-1" src="https://gw.alipayobjects.com/mdn/prod_resou/afts/img/A*lACSTZ9k73wAAAAAAAAAAAAAARQnAQ" />',
          '<img class="error-icon-2" src="https://gw.alipayobjects.com/mdn/prod_resou/afts/img/A*gVB8RJQlsQsAAAAAAAAAAAAAARQnAQ" />',
          '<div class="error-message">',
          '<h3>页面出错了</h3>',
          '<p>',
          '遇到一些未知错误，请尝试刷新页面、清除浏览器缓存或截图<a target="_blank" href="' + feedBackUrl + '">反馈</a>给我们',
          '</p>',
          '<p>' + feedback + '</p>',
          '</div>',
          '<div>',
          '<img class="unknown-error" src="https://gw.alipayobjects.com/mdn/prod_resou/afts/img/A*au01Tr2-h8oAAAAAAAAAAAAAARQnAQ" />',
          '</div>',
          '</div>'
        ];
      }
      rootNode.innerHTML = htmlList.join('');
      var reloadBtn = document.getElementById('yq-blank-detection-reload-button');
      if (reloadBtn) {
        reloadBtn.onclick = function() {
          if (window.YuqueDesktopJSBridge) {
            window.YuqueDesktopJSBridge.postMessage('app.relaunch');
          } else {
            window.location.reload();
          }
        };
      }
    }

    // 获取当前平台
    function getClientPlatform() {
      // 区分页面运行平台：蚂蚁钉桌面端/蚂蚁钉移动端/桌面端/移动端/default
      const platformMap = {
        isAntDingTalkDesktopApp: "antDingTalkDesktopApp",
        isAntDingTalkMobileApp: "antDingTalkMobileApp",
        isDesktopApp: "desktopApp",
        isYuqueMobileApp: "yuqueMobileApp"
      };
      const platformKey = Object.keys(platformMap).find(key => window.appData?.[key]);
      return platformKey ? platformMap[platformKey] : 'default';
    };

    function reportToYuYan() {
      if (!window.yuyanMonitor) return;

      var traceId = window.appData.traceId || '';
      const fromClient = getClientPlatform();

      // 「蚂蚁钉桌面端/蚂蚁钉移动端」的白屏报错单独记录在「蚂蚁钉页面加载白屏监控-9008」监控码
      if (['antDingTalkDesktopApp', 'antDingTalkMobileApp'].includes(fromClient)) {
        window.yuyanMonitor.logError(new Error('AntDing page is blank!'), {
          code: 9008,
          msg: 'antding_web_page_blank_error',
          d1: fromClient,
          d2: traceId,
          d3: errorMessage,
        });
      } else {
        // 其他白屏报错记录在「页面加载白屏监控-45」监控码
        window.yuyanMonitor.logError(new Error('Page is blank!'), {
          code: 45,
          msg: 'web_page_blank_error',
          d1: fromClient,
          d2: traceId,
          d3: errorMessage
        });
      }
    }

    function unregisterServiceWorker() {
      if ('serviceWorker' in navigator) {
        navigator.serviceWorker
          .getRegistrations()
          .then(function(registrations) {
            registrations.forEach(function(sw) {
              sw.unregister();
            });
        });
      }
    }

    function report() {
      try {
        // 清理掉 localStorage
        if (isSupportLocalStorage) {
          window.localStorage.removeItem(BLANK_DETECTION_RELOAD);
        }

        // 清理掉 serviceWorker
        unregisterServiceWorker();
        // 展示反馈
        renderFeedBackTips();
        // 上报雨燕
        reportToYuYan();
      } catch (e) {
        console.error(e);
      }
    }

    function checkRootNode() {
      if (rootNode && rootNode.innerHTML && rootNode.innerHTML !== '<div></div>') {
        return true;
      }
      return false;
    }

    function reload() {
      // 清理掉 serviceWorker
      unregisterServiceWorker();
      // 主动刷新一次
      window.localStorage.setItem(BLANK_DETECTION_RELOAD, true);
      if (window.localStorage.getItem(BLANK_DETECTION_RELOAD)) {
        window.location.reload(true);
      } else {
        report();
      }
    }

    function checkAndReport() {
      // 插入节点前再次检查是否白屏
      if (checkRootNode()) {
        if (isSupportLocalStorage) {
          window.localStorage.removeItem(BLANK_DETECTION_RELOAD);
        }
        return;
      }
      // 是否重新加载
      if (isSupportLocalStorage && !window.localStorage.getItem(BLANK_DETECTION_RELOAD)) {
        reload();
      } else {
        report();
      }
    }

    function onloadHandler() {
      if (checkRootNode()) {
        if (isSupportLocalStorage) {
          window.localStorage.removeItem(BLANK_DETECTION_RELOAD);
        }
        return;
      } else {
        // 10s 后检测白屏
        setTimeout(function() {
          errorMessage = 'INNERHTML_NOT_EXIST';
          checkAndReport();
        }, 10 * 1000);
      }
    }

    window.addEventListener('error', function(event) {
      if (event) {
        // 5s 后检测白屏
        setTimeout(function() {
          errorMessage = event.message;
          checkAndReport();
        }, 5 * 1000);
      }
    }, false);

    window.addEventListener('load', onloadHandler, false);
  })();
</script>

    
    <script nonce=d3XUZtJMM0utFC89aTpL>
  if ('serviceWorker' in navigator && navigator.serviceWorker) {
    if (!/[?&]enable_sw=false/.test(location.search)
      && window.appData
      && !window.appData.isYuqueMobileApp
      && window.appData.settings
      && window.appData.settings.enable_serviceworker
      && window.appData.me
      && window.appData.me.id) {
      if (typeof navigator.serviceWorker.register === 'function') {
        window.addEventListener('load', function() {
          navigator.serviceWorker.register('/serviceworker.js').catch(function(err) {
            console.error("service worker register error " + err.message);
          });
        });
      }
    } else {
      if (typeof navigator.serviceWorker.getRegistrations === 'function') {
        navigator.serviceWorker.getRegistrations().then(function (registrations) {
          registrations.forEach(function (sw) {
            sw.unregister();
          });
        });
      }
    }
  }
</script>

    <script crossorigin
  src="https://gw.alipayobjects.com/render/p/yuyan_npm/@alipay_yuyan-monitor-web/4.1.14/dist/index.umd.min.js"></script>
<script nonce=d3XUZtJMM0utFC89aTpL>
  if (window.YuyanMonitor) {
    window.yuyanMonitor = new YuyanMonitor({
      _appId: '589c123e2b89c03d127000da',
    
  env: '外网',
    
  
  userId: '',
    plugins: ['performance']
  });
}
</script>

    <!-- 雨燕前置错误捕获逻辑 -->
    <script nonce=d3XUZtJMM0utFC89aTpL>
      !function(){var e=window;function n(n){if(e.g_monitor&&e.g_monitor.events){var t=e.g_monitor.events;t.length<20&&t.push(n)}}e.g_monitor=e.g_monitor||{listener:{},events:[]};
      var r=e.g_monitor.listener;function t(t,n){try{e.addEventListener?e.addEventListener(t,n,!0):e.attachEvent?e.attachEvent("on"+t,n):e[t]=n,r[t]=n}catch(n){console.warn("Tracert 监控事件注册失败："+t,n)}}r.error||t("error",n),r.unhandledrejection||t("unhandledrejection",n)}();
    </script>
    <script crossorigin src="https://gw.alipayobjects.com/os/skylark/v3/polyfill.min.js"></script>
<script crossorigin src="https://gw.alipayobjects.com/os/lib/??react/16.13.1/umd/react.production.min.js,react-dom/16.13.1/umd/react-dom.production.min.js,react-dom/16.13.1/umd/react-dom-server.browser.production.min.js,moment/2.24.0/min/moment.min.js"></script>


<script nonce=d3XUZtJMM0utFC89aTpL>
window.globalThis = window.globalThis || window;
if (!Object.fromEntries) {
  Object.defineProperty(Object, 'fromEntries', {
    value(entries) {
      if (!entries || !entries[Symbol.iterator]) { throw new Error('Object.fromEntries() requires a single iterable argument'); }

      var o = {};

      Object.keys(entries).forEach(function(key){
        var [k, v] = entries[key];

        o[k] = v;
      });

      return o;
    },
  });
}
if (!Object.entries) {
  Object.entries = function( obj ){
    var ownProps = Object.keys( obj ),
        i = ownProps.length,
        resArray = new Array(i); // preallocate the Array
    while (i--)
      resArray[i] = [ownProps[i], obj[ownProps[i]]];
    
    return resArray;
  };
}
(function() {
  if (typeof globalThis.TransformStream !== 'undefined') {
    return;
  }

  class TransformStream {
    constructor(transformer = {}, writableStrategy = {}, readableStrategy = {}) {
      const start = transformer.start ? transformer.start.bind(transformer) : () => {};
      const transform = transformer.transform ? transformer.transform.bind(transformer) : (chunk, controller) => controller.enqueue(chunk);
      const flush = transformer.flush ? transformer.flush.bind(transformer) : () => {};

      let readableController;
      this.readable = new ReadableStream({
        async start(controller) {
          readableController = controller;
          await start(controller);
        },
        cancel(reason) {
          return this.writable.abort(reason);
        }
      }, readableStrategy);

      this.writable = new WritableStream({
        async write(chunk) {
          try {
            await transform(chunk, readableController);
          } catch (e) {
            readableController.error(e);
            throw e;
          }
        },
        async close() {
          try {
            await flush(readableController);
            readableController.close();
          } catch (e) {
            readableController.error(e);
            throw e;
          }
        },
        abort(reason) {
          readableController.error(reason);
        }
      }, writableStrategy);
    }
  }

  globalThis.TransformStream = TransformStream;
})();
</script>



    <!-- 通过开关结合当前请求的 url 对应路由的配置信息，来决定是否发送 preload_appData.js -->
    
    
    
    
    <script nonce=d3XUZtJMM0utFC89aTpL>
      window.routerBase = '/';
      window.resourceBaseUrl = 'https://gw.alipayobjects.com/os/chair-script/skylark/';
    </script>
    
    

    
<script nonce=d3XUZtJMM0utFC89aTpL>window.__webpack_public_path__ = '/os/chair-script/skylark/';</script><script crossorigin src="https://gw.alipayobjects.com/os/chair-script/skylark/deps.3c2b2e32.js"></script>
<script crossorigin src="https://gw.alipayobjects.com/os/chair-script/skylark/common.d114c29e.js"></script>
<script crossorigin src="https://gw.alipayobjects.com/os/chair-script/skylark/larkui.9c780393.js"></script>



    <script crossorigin src="https://gw.alipayobjects.com/os/chair-script/skylark/pc.e62168b0.js"></script>
    
      
      <script nonce=d3XUZtJMM0utFC89aTpL>
        // 加载九色鹿埋点脚本
        window.addEventListener('load', function() {
          !function(t,e,a,r,c){t.TracertCmdCache=t.TracertCmdCache||[],t[c]=window[c]||
            {_isRenderInit:!0,call:function(){t.TracertCmdCache.push(arguments)},
            start:function(t){this.call('start',t)}},t[c].l=new Date;
            var n=e.createElement(a),s=e.getElementsByTagName(a)[0];
            n.async=!0,n.src=r,s.parentNode.insertBefore(n,s)}

          
          (window,document,'script','https://ur.alipay.com/tracert_a385.js','Tracert');
          Tracert.start({
            spmAPos: 'a385',
            spmBPos: '',
            role_id: '',
            mdata: {
              
              
              
              
            },
          });

          
          
        });
      </script>
      
      
    
    

    

  </body>
</html>
