CINXE.COM
MrDoc: MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步
<!DOCTYPE html> <html lang='zh-CN'> <head> <title>MrDoc: MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步</title> <meta content='on' http-equiv='x-dns-prefetch-control'> <link href='//e.gitee.com' rel='dns-prefetch'> <link href='//files.gitee.com' rel='dns-prefetch'> <link href='//toscode.gitee.com' rel='dns-prefetch'> <link href='https://cn-assets.gitee.com' rel='dns-prefetch'> <link href='https://portrait.gitee.com' rel='dns-prefetch'> <link rel="shortcut icon" type="image/vnd.microsoft.icon" href="https://cn-assets.gitee.com/assets/favicon-9007bd527d8a7851c8330e783151df58.ico" /> <link rel="canonical" href="https://gitee.com/zmister/MrDoc" /> <meta content='gitee.com/zmister/MrDoc git https://gitee.com/zmister/MrDoc.git' name='go-import'> <meta charset='utf-8'> <meta content='always' name='referrer'> <meta content='Gitee' property='og:site_name'> <meta content='Object' property='og:type'> <meta content='https://gitee.com/zmister/MrDoc' property='og:url'> <meta content='https://foruda.gitee.com/avatar/1676984084156042875/1703473_zmister_1606697065.png' itemprop='image' property='og:image'> <meta content='州的先生/MrDoc' itemprop='name' property='og:title'> <meta content='MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步' property='og:description'> <meta content='MrDoc,Python' name='Keywords'> <meta content='MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步' itemprop='description' name='Description'> <meta content='pc,mobile' name='applicable-device'> <meta content="IE=edge" http-equiv="X-UA-Compatible" /> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="GwQI1ncJPlwS0CebcY47MJPO+eOJKCunAlhiZwhAihos71gA1w+kQ9yzl+0zkqd6/ATh2eFmdfi/oQJ1YnrJZw==" /> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/assets/application-dd3fda160256112913699f4fc9a0b540.css" /> <script> //<![CDATA[ window.gon = {};gon.locale="zh-CN";gon.sentry_dsn=null;gon.baidu_register_hm_push=null;gon.info={"controller_path":"projects","action_name":"show","current_user":false};gon.tour_env={"current_user":null,"action_name":"show","original_url":"https://gitee.com/zmister/MrDoc","controller_path":"projects"};gon.http_clone="https://gitee.com/zmister/MrDoc.git";gon.user_project="zmister/MrDoc";gon.manage_branch="管理分支";gon.manage_tag="管理标签";gon.enterprise_id=0;gon.create_reaction_path="/zmister/MrDoc/reactions";gon.ipipe_base_url="https://go-api.gitee.com";gon.artifact_base_url="https://go-repo.gitee.com";gon.gitee_go_remote_url="https://go.gitee.com/assets";gon.gitee_go_active=false;gon.current_project_is_mirror=false;gon.show_repo_comment=false;gon.diagram_viewer_path="https://diagram-viewer.giteeusercontent.com";gon.ent_host="e.gitee.com";gon.cp="点击复制";gon.aready_cp="已复制";gon.is_fork=false;gon.is_admin_domain=false;gon.ref="master"; //]]> </script> <script src="https://cn-assets.gitee.com/assets/application-1a4bf2ba7b1e19f0f3f7b1bf63122b0b.js"></script> <script src="https://cn-assets.gitee.com/assets/lib/jquery.timeago.zh-CN-4a4818e98c1978d2419ab19fabcba740.js"></script> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/assets/projects/application-46b94c31ba11ae8c37eacce2bdb5603e.css" /> <script src="https://cn-assets.gitee.com/assets/projects/app-7ece8b97f8abb02ddf4a8d6d72a4ed2d.js"></script> <script type='text/x-mathjax-config'> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [["$$","$$"],["\\[","\\]"]], processEscapes: true, skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], ignoreClass: "container|files", processClass: "markdown-body" } }); </script> <script src="https://cn-assets.gitee.com/uploads/resources/MathJax-2.7.2/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script> (function () { var messages = { 'zh-CN': { addResult: '增加 <b>{term}</b>', count: '已选择 {count}', maxSelections: '最多 {maxCount} 个选择', noResults: '未找到结果', serverError: '连接服务器时发生错误' }, 'zh-TW': { addResult: '增加 <b>{term}</b>', count: '已選擇 {count}', maxSelections: '最多 {maxCount} 個選擇', noResults: '未找到結果', serverError: '連接服務器時發生錯誤' } } if (messages[gon.locale]) { $.fn.dropdown.settings.message = messages[gon.locale] } }()); </script> <script> var userAgent = navigator.userAgent; var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1; if(isLessIE11){ var can_access = "" if (can_access != "true"){ window.location.href = "/incompatible.html"; } } document.addEventListener("error", function (ev) { var elem = ev.target; if (elem.tagName.toLowerCase() === 'img') { elem.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAAAAACIM/FCAAACh0lEQVR4Ae3ch5W0OgyG4dt/mQJ2xgQPzJoM1m3AbALrxzrf28FzsoP0HykJEEAAAUQTBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEkKK0789+GK/I2ezfQB522PnS1qc8pGgXvr4tE4aY0XOUWlGImThWgyCk6DleixzE7qwBkg/MGiDPlVVAyp1VQGrPKiACDhFI6VkF5LmzCki+sg7IwDoglnVAil0IMkeG9CyUiwsxLFUVFzJJOQaKCjFCDN9RXMjIX7W6ztZXZDKKCyn8sWJvH+nca7WHDN9lROlAliPH9iRKCPI4cswFJQWxB46toLQgQ9jhn5QYZA9DOkoMUoQde5YapAxDWkoNYsOQR3KQd9CxUnIQF4S49CB9ENKlBxmDEKsFUgMCCCCAAHIrSF61f6153Ajy8nyiPr8L5MXnmm4CyT2fzN4DUvHZ+ntA2tOQBRBAAAEEEEAAAQQQ7ZBaC6TwSiDUaYHQ2yuB0MN+ft+43whyrs4rgVCjBUKTFshLC6TUAjGA3AxSaYFYLZBOC2RUAsk8h5qTg9QcbEoOsoQhQ2qQhsO5xCD5dgB5JQaZ+KBKGtKecvR81Ic0ZDjByKdDx0rSEDZ/djQbH+bkIdvfJFm98BfV8hD2zprfVdlu9PxVeyYAkciREohRAplJCaRSAplJCcQogTjSAdlyHRBvSAekJR0QRzogA+mADJkOiCPSAPEtqYBshlRAXC43hxix2QiOuEZkVERykGyNo9idIZKE0HO7XrG6OiMShlDWjstVzdPgXtUH9v0CEidAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQP4HgjZxTpdEii0AAAAASUVORK5CYII="; } }, true); </script> </head> <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script> var title = document.title.replace(/( - Gitee| - 码云)$/, '') imgUrl = ''; document.addEventListener('DOMContentLoaded', function(event) { var imgUrlEl = document.querySelector('.readme-box .markdown-body > img, .readme-box .markdown-body :not(a) > img'); imgUrl = imgUrlEl && imgUrlEl.getAttribute('src'); if (!imgUrl) { imgUrlEl = document.querySelector('meta[itemprop=image]'); imgUrl = imgUrlEl && imgUrlEl.getAttribute('content'); imgUrl = imgUrl || "https://gitee.com/static/images/logo_themecolor.png"; } wx.config({ debug: false, appId: "wxff219d611a159737", timestamp: "1742777297", nonceStr: "ad6a8a540a9cdf463d0f2df28b952bd0", signature: "d54f39668d2993f4438af05535b14c9b2c23bf0f", jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); wx.ready(function () { wx.onMenuShareTimeline({ title: title, // 分享标题 link: "https://gitee.com/zmister/MrDoc", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl // 分享图标 }); wx.onMenuShareAppMessage({ title: title, // 分享标题 link: "https://gitee.com/zmister/MrDoc", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 desc: document.querySelector('meta[name=Description]').getAttribute('content'), imgUrl: imgUrl // 分享图标 }); }); wx.error(function(res){ console.error('err', res) }); }) </script> <body class='git-project lang-zh-CN'> <header class='common-header fixed noborder' id='git-header-nav'> <div class='ui container'> <div class='ui menu header-menu header-container'> <div class='git-nav-expand-bar'> <i class='iconfont icon-mode-table'></i> </div> <div class='gitee-nav__sidebar'> <div class='gitee-nav__sidebar-container'> <div class='gitee-nav__sidebar-top'> <div class='gitee-nav__avatar-box'></div> <div class='gitee-nav__buttons-box'> <a class="ui button small fluid orange" href="/login">登录</a> <a class="ui button small fluid basic is-register" href="/signup">注册</a> </div> </div> <div class='gitee-nav__sidebar-middle'> <div class='gitee-nav__sidebar-list'> <ul> <li class='gitee-nav__sidebar-item'> <a href="/explore"><i class='iconfont icon-ic-discover'></i> <span class='gitee-nav__sidebar-name'>开源</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/enterprises"><i class='iconfont icon-ic-enterprise'></i> <span class='gitee-nav__sidebar-name'>企业版</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/education"><i class='iconfont icon-ic-education'></i> <span class='gitee-nav__sidebar-name'>高校版</span> </a></li> <li class='gitee-nav__sidebar-item split-line'></li> <li class='gitee-nav__sidebar-item'> <a href="/search"><i class='iconfont icon-ic-search'></i> <span class='gitee-nav__sidebar-name'>搜索</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/help"><i class='iconfont icon-help-circle'></i> <span class='gitee-nav__sidebar-name'>帮助中心</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/terms"><i class='iconfont icon-file'></i> <span class='gitee-nav__sidebar-name'>使用条款</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/about_us"><i class='iconfont icon-issuepx'></i> <span class='gitee-nav__sidebar-name'>关于我们</span> </a></li> </ul> </div> </div> <div class='gitee-nav__sidebar-bottom'> <div class='gitee-nav__sidebar-close-button'> <i class='fa fa-angle-double-left'></i> </div> </div> </div> </div> <!-- /todo 10周年活动结束后 恢复 --> <div class='item gitosc-logo'> <a href="https://gitee.com"><img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline image' height='28' src='/static/images/logo.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='95'> <img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline black image' height='28' src='/static/images/logo-black.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='95'> </a></div> <a title="开源" class="item " href="/explore">开源 </a><a title="企业版" class="item " href="/enterprises">企业版 </a><a title="高校版" class="item " href="/education">高校版 </a><a title="私有云" class="item" target="_blank" href="https://gitee.cn?utm_source=giteecom">私有云 </a><a title="Gitee AI" class="item mr-3" id="gitee-blog" target="_blank" href="https://ai.gitee.com/?utm_sources=site_nav">模力方舟 <sup class='ui red label' style='right:-36px !important'> Gitee AI </sup> </a><div class='center responsive-logo'> <a href="https://gitee.com"><img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline image' height='24' src='/static/images/logo.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='85'> <img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline black image' height='24' src='/static/images/logo-black.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='85'> </a></div> <div class='right menu userbar right-header' id='git-nav-user-bar'> <form class="ui item" id="navbar-search-form" data-text-require="搜索关键字不能少于1个" data-text-filter="搜索格式不正确" action="/search" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓" /> <input type="hidden" name="type" id="navbar-search-type" /> <input type="hidden" name="fork_filter" id="fork_filter" value="on" /> <div class='ui search header-search'> <input type="text" name="q" id="navbar-search-input" value="" class="prompt" placeholder="搜开源" /> </div> </form> <script> var can_search_in_repo = 1, repo = "VG1wTmVFOUVUWHBPVjBVelRtcE9iV0UzTmpObWE3NjNm", reponame = "zmister/MrDoc"; $(function() { var $search = $('#navbar-search-form .ui.search'); $search.search({ apiSettings: { url: '/search/relative_project?q={query}', onResponse: function (res) { if (res && res.status === 200 && res.data) { var query = htmlSafe($search.search('get value')); res.data.map(function (item) { item.path_ns = '/' + item.path_ns; item.icon = 'iconfont icon-project-public'; }); res.data.unshift({ name_ns: "在全站搜索 <b class='hl'>" + query +"</b> 相关项目", path_ns: '/search?fork_filter=on&q=' + query, icon: 'iconfont icon-search' }); return res; } else { return { data: [] }; } } }, fields: { results: 'data', description: 'name_ns', url: 'path_ns', icon: 'icon' }, minCharacters: 1, maxResults: 10, searchDelay: 250, showNoResults: false, transition: 'fade' }); }); </script> <div class='ui item' id='feature-update-notice'> <div class='notice-update-icon'> <a class="notice-update-popup click-knowed" title="" href="javascript:void(0)"><img alt="功能更新" title="" class="bubl_icon bubl-off-icon" src="https://cn-assets.gitee.com/assets/bulb_off-24ee940be20998aace89a3f040cbc704.svg" /> <img alt="功能更新" title="" class="bubl_icon bubl-on-icon" src="https://cn-assets.gitee.com/assets/bulb_on-3986b1dc417285398e3d15671bd8f261.svg" /> </a></div> <div class='feature-update-notice-panel menu'> <div class='notice-img'> <img alt="" title="" class="notice-img-show" src="" /> </div> <div class='notice-update-title'></div> <div class='notice-update-des'></div> <div class='notice-btn-list d-flex-between'> <button name="button" type="button" class="ui basic orange button btn-notice btn-knowed click-knowed" style="margin-right: 0">我知道了</button> <a class="ui button orange btn-notice btn-details click-knowed" target="_blank" href="">查看详情</a> </div> </div> </div> <a class="item git-nav-user__login-item" href="/login">登录 </a><a class="item git-nav-user__register-item" href="/signup">注册 </a><script> $('.destroy-user-session').on('click', function() { $.cookie('access_token', null, { path: '/' }); }) </script> </div> </div> </div> </header> <script> Gitee.initNavbar() Gitee.initRepoRemoteWay() $.cookie('user_locale',null) </script> <script> var userAgent = navigator.userAgent; var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1; if(isLessIE11){ var can_access = "" if (can_access != "true"){ window.location.href = "/incompatible.html"; } } </script> <div class='fixed-notice-infos'> <div class='all-messages'> <div class='ui info message' id='git-bulletin'> <a href=https://www.oschina.net/event/8595459 target='_blank'>4月12日模力方舟 AI 应用沙龙 · 杭州站报名开放,产研前线第一手干货,AI 开发者必冲!</a> <i class='icon remove' id='remove-bulletin'></i> </div> </div> <div class='ui container'> <div class='flash-messages' id='messages-container'></div> </div> <script> (function() { $(function() { var $error_box, alertTip, notify_content, notify_options, template; template = '<div data-notify="container" class="ui {0} message" role="alert">' + '<i data-notify="dismiss" class="close icon"></i>' + '<span data-notify="message">{2}</span>' + '</div>'; notify_content = null; notify_options = {}; alertTip = ''; $error_box = $(".flash_error.flash_error_box"); if (notify_options.type === 'error' && $error_box.length > 0 && !$.isEmptyObject(notify_content.message)) { if (notify_content.message === 'captcha_fail') { alertTip = "验证码不正确"; } else if (notify_content.message === 'captcha_expired') { alertTip = "验证码已过期,请点击刷新"; } else if (notify_content.message === 'not_found_in_database') { alertTip = "帐号或者密码错误"; } else if (notify_content.message === 'not_found_and_show_captcha') { alertTip = "帐号或者密码错误"; } else if (notify_content.message === 'phone_captcha_fail') { alertTip = "手机验证码不通过"; } else { alertTip = notify_content.message; } return $error_box.html(alertTip).show(); } else if (notify_content) { if ("show" === 'third_party_binding') { return $('#third_party_binding-message').html(notify_content.message).addClass('ui message red'); } notify_options.delay = 3000; notify_options.template = template; notify_options.offset = { x: 10, y: 30 }; notify_options.element = '#messages-container'; return $.notify(notify_content, notify_options); } }); }).call(this); </script> </div> <script> (function() { $(function() { var setCookie; setCookie = function(name, value) { $.cookie(name, value, { path: '/', expires: 365 }); }; $('#remove-bulletin, #remove-bulletin-dashboard').on('click', function() { setCookie('remove_bulletin', "gitee-maintain-1742526988"); $('#git-bulletin').hide(); }); $('#remove-member-bulletin').on('click', function() { setCookie('remove_member_bulletin', "gitee_member_bulletin"); $(this).parent().hide(); }); return $('#remove-gift-bulletin').on('click', function() { setCookie('remove_gift_bulletin', "gitee-gift-bulletin"); $(this).parent().hide(); }); }); }).call(this); </script> <script> function closeMessageBanner(pthis, type, val) { var json = {} val = typeof val === 'undefined' ? null : val $(pthis).parent().remove() if (type === 'out_of_enterprise_member') { json = {type: type, data: val} } else if (type === 'enterprise_overdue') { json = {type: type, data: val} } $.post('/profile/close_flash_tip', json) } </script> <div class='site-content'> <div class='git-project-header'> <div class='fixed-notice-infos'> <div class='ui info icon floating message green' id='fetch-ok' style='display: none'> <div class='content'> <div class='header status-title'> <i class='info icon status-icon'></i> 代码拉取完成,页面将自动刷新 </div> </div> </div> <div class='ui info icon floating message error' id='fetch-error' style='display: none'> <div class='content'> <div class='header status-title'> <i class='info icon status-icon'></i> <span class='error_msg'></span> </div> </div> </div> </div> <div class='ui container'> <div class='git-project-categories'> <a href="/explore">开源项目</a> <span class='symbol'>></span> <a href="/explore/develop-tools">开发工具</a> <span class='symbol'>></span> <a href="/explore/doc-tools">Wiki/文档工具</a> <span class='symbol and-symbol'>&&</span> </div> <div class='git-project-header-details'> <div class='git-project-header-container'> <div class='git-project-header-actions'> <div class='ui tiny modal project-donate-modal' id='project-donate-modal'> <i class='iconfont icon-close close'></i> <div class='header'>捐赠</div> <div class='content'> 捐赠前请先登录 </div> <div class='actions'> <a class='ui blank button cancel'>取消</a> <a class='ui orange ok button' href='/login'>前往登录</a> </div> </div> <div class='ui small modal wepay-qrcode'> <i class='iconfont icon-close close'></i> <div class='header'> 扫描微信二维码支付 <span class='wepay-cash'></span> </div> <div class='content weqcode-center'> <img id='wepay-qrcode' src=''> </div> <div class='actions'> <div class='ui cancel blank button'>取消</div> <div class='ui ok orange button'>支付完成</div> </div> </div> <div class='ui mini modal' id='confirm-alipay-modal'> <div class='header'>支付提示</div> <div class='content'> 将跳转至支付宝完成支付 </div> <div class='actions'> <div class='ui approve orange button'>确定</div> <div class='ui blank cancel button'>取消</div> </div> </div> <span class='ui buttons basic watch-container'> <div class='ui dropdown button js-project-watch' data-watch-type='unwatch'> <input type='hidden' value=''> <i class='iconfont icon-watch'></i> <div class='text'> Watch </div> <i class='dropdown icon'></i> <div class='menu'> <a data-value="unwatch" class="item" rel="nofollow" data-method="post" href="/zmister/MrDoc/unwatch"><i class='iconfont icon-msg-read'></i> 不关注 </a><a data-value="watching" class="item" rel="nofollow" data-method="post" href="/zmister/MrDoc/watch"><i class='iconfont icon-msg-read'></i> 关注所有动态 </a><a data-value="releases_only" class="disabled item" rel="nofollow" data-method="post" href="/zmister/MrDoc/release_only_watch"><i class='iconfont icon-msg-read'></i> 仅关注版本发行动态 </a><a data-value="ignoring" class="item" rel="nofollow" data-method="post" href="/zmister/MrDoc/ignoring_watch"><i class='iconfont icon-msg-read'></i> 关注但不提醒动态 </a></div> </div> <style> .js-project-watch .text .iconfont { display: none; } .js-project-watch a, .js-project-watch a:hover { color: #000; } .js-project-watch .item > .iconfont { visibility: hidden; margin-left: -10px; } .js-project-watch .selected .iconfont { visibility: visible; } .js-project-watch .menu { margin-top: 4px !important; } </style> <script> $('.js-project-watch').dropdown({ action: 'select', onChange: function(value, text, $selectedItem) { var type = value === 'unwatch' ? 'Watch' : 'Watching'; $(this).children('.text').text(type); $(this).dropdown('set selected', value) } }); </script> <a class="ui button action-social-count" title="399" href="/zmister/MrDoc/watchers">399 </a></span> <span class='basic buttons star-container ui'> <a class="ui button star" href="/login"><i class='iconfont icon-star'></i> Star </a><a class="ui button action-social-count " title="3736" href="/zmister/MrDoc/stargazers">3.7K </a></span> <span class='ui basic buttons fork-container' title='无权 Fork 此仓库'> <a class="ui button fork" title="你必须登录后才可以fork一个仓库" href="/login"><i class='iconfont icon-fork'></i> Fork </a><a class="ui button action-social-count disabled-style" title="1121" href="/zmister/MrDoc/members">1.1K </a></span> </div> <h2 class='git-project-title mt-0 mb-0'> <a title="GVP - Gitee 最有价值开源项目" class="ui small label git-project-gvp-badge" target="_blank" href="/gvp">GVP</a><a title="州的先生" class="author" href="/zmister">州的先生</a>/<a title="MrDoc" class="repository" target="" style="padding-bottom: 0px; margin-right: 4px" href="/zmister/MrDoc">MrDoc</a> <input type="hidden" name="recomm_at" id="recomm_at" value="2019-10-04 21:02" /> <input type="hidden" name="project_title" id="project_title" value="州的先生/MrDoc" /> </h2> </div> </div> </div> <script> var title_import_url = "false"; var title_post_url = "/zmister/MrDoc/update_import"; var title_fork_url = "/zmister/MrDoc/sync_fork"; var title_project_path = "MrDoc"; var title_p_name = "MrDoc"; var title_p_id= "6318335"; var title_description = "MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步"; var title_form_authenticity_token = "KneU0x2L+shDhNzYxSpLPVEhTB1LOUFwXJfek42y+IkdnMQFvY1g143nbK6HNtd3PutUJyN3Hy/hbr6B54i79A=="; var watch_type = "unwatch"; var checkFirst = false; $('.js-project-watch').dropdown('set selected', watch_type); $('.checkbox.sync-wiki').checkbox(); $('.checkbox.sync-prune').checkbox(); $('.checkbox.team-member-checkbox').checkbox(); </script> <style> i.loading, .icon-sync.loading { -webkit-animation: icon-loading 1.2s linear infinite; animation: icon-loading 1.2s linear infinite; } .qrcode_cs { float: left; } .check-sync-wiki { float: left; height: 28px; line-height: 28px; } .sync-wiki-warn { color: #e28560; } </style> <div class='git-project-nav'> <div class='ui container'> <div class='ui secondary pointing menu'> <a class="item active " href="/zmister/MrDoc"><i class='iconfont icon-code'></i> 代码 </a><a class="item " href="/zmister/MrDoc/issues"><i class='iconfont icon-task'></i> Issues <span class='ui mini circular label'> 51 </span> </a><a class="item " href="/zmister/MrDoc/pulls"><i class='iconfont icon-pull-request'></i> Pull Requests <span class='ui mini circular label'> 2 </span> </a><a class="item " href="/zmister/MrDoc/graph/master"><i class='iconfont icon-statistics'></i> 统计 </a><a class="item " href="/zmister/MrDoc/gitee_go"><i class='iconfont icon-workflow'></i> 流水线 </a><div class='item'> <div class='ui pointing top right dropdown git-project-service'> <div> <i class='iconfont icon-service'></i> 服务 <i class='dropdown icon'></i> </div> <div class='menu' style='display:none'> <a class="item" href="/zmister/MrDoc/pages"><img src="/static/images/logo-en.svg" alt="Logo en" /> <div class='item-title'> Gitee Pages </div> </a><a class="item" href="/zmister/MrDoc/quality_analyses?platform=sonar_qube"><img src="https://cn-assets.gitee.com/assets/sonar_mini-5e1b54bb9f6c951d97fb778ef623afea.png" alt="Sonar mini" /> <div class='item-title'> 质量分析 </div> </a><a class="item" target="_blank" href="https://gitee.com/help/articles/4193"><img src="https://cn-assets.gitee.com/assets/jenkins_for_gitee-554ec65c490d0f1f18de632c48acc4e7.png" alt="Jenkins for gitee" /> <div class='item-title'> Jenkins for Gitee </div> </a><a class="item" target="_blank" href="https://gitee.com/help/articles/4318"><img src="https://cn-assets.gitee.com/assets/cloudbase-1197b95ea3398aff1df7fe17c65a6d42.png?20200925" alt="Cloudbase" /> <div class='item-title'> 腾讯云托管 </div> </a><a class="item" target="_blank" href="https://gitee.com/help/articles/4330"><img src="https://cn-assets.gitee.com/assets/cloud_serverless-686cf926ced5d6d2f1d6e606d270b81e.png" alt="Cloud serverless" /> <div class='item-title'> 腾讯云 Serverless </div> </a><a class="item" href="/zmister/MrDoc/open_sca"><img src="https://cn-assets.gitee.com/assets/open_sca/logo-9049ced662b2f9936b8001e6f9cc4952.png" alt="Logo" /> <div class='item-title'> 悬镜安全 </div> </a><a class="item" target="_blank" href="https://help.gitee.com/devops/connect/Aliyun-SAE"><img src="https://cn-assets.gitee.com/assets/SAE-f3aa9366a1e2b7fff4747402eb8f10c3.png" alt="Sae" /> <div class='item-title'> 阿里云 SAE </div> </a><a class="item" id="update-codeblitz-link" target="_blank" href="https://codeblitz.cloud.alipay.com/gitee/zmister/MrDoc/tree/master/"><img style="width:100px;margin-top:4px" src="https://cn-assets.gitee.com/assets/Codeblitz-8824e38875a106e16e29ff57ec977b08.png" alt="Codeblitz" /> <div class='item-title'> Codeblitz </div> </a><button class='ui orange basic button quit-button' id='quiting-button'> 我知道了,不再自动展开 </button> </div> </div> </div> </div> </div> </div> <script> $('.git-project-nav .ui.dropdown').dropdown({ action: 'nothing' }); var gitee_reward_config = JSON.parse(localStorage.getItem('gitee_reward_config') || null) || false var $settingText = $('.setting-text') // 如果没有访问过 if(!gitee_reward_config) $settingText.addClass('red-dot') $('.git-project-service').dropdown({ on: 'click', action: 'nothing', onShow: function () { const branch = 'master' let newUrl = `https://codeblitz.cloud.alipay.com/gitee/zmister/MrDoc/tree/` const url = decodeURIComponent(window.location.pathname); const startIndex = url.indexOf('master'); if (startIndex !== -1) { newUrl = newUrl + url.substring(startIndex); // 从分支名开始截取 }else{ newUrl = newUrl + branch } const linkElement = document.getElementById("update-codeblitz-link"); linkElement.setAttribute("href", newUrl); }, }) </script> <style> .git-project-nav i.checkmark.icon { color: green; } #quiting-button { display: none; } .git-project-nav .dropdown .menu.hidden:after { visibility: hidden !important; } </style> <script> isSignIn = false isClickGuide = false $('#git-versions.dropdown').dropdown(); $.ajax({ url:"/zmister/MrDoc/access/add_access_log", type:"GET" }); $('#quiting-button').on('click',function() { $('.git-project-service').click(); if (isSignIn) { $.post("/projects/set_service_guide") } $.cookie("Serve_State", true, { expires: 3650, path: '/'}) $('#quiting-button').hide(); }); if (!(isClickGuide || $.cookie("Serve_State") == 'true')) { $('.git-project-service').click() $('#quiting-button').show() } </script> </div> <div class='ui container'> <div class='register-guide'> <div class='register-container'> <div class='regist'> 加入 Gitee </div> <div class='description'> 与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :) </div> <a class="ui orange button free-registion" href="/signup?from=project-guide">免费加入</a> <div class='login'> 已有帐号? <a href="/login?from=project-guide">立即登录</a> </div> </div> </div> <div class='git-project-content-wrapper'> <div class='ui grid tree-bbb' id='project-wrapper'> <div class='project-left-side-contaner wide column' id='project-left-side-contaner' style='display: none;'> <script src="https://cn-assets.gitee.com/webpacks/vendors_lib-7ff466a6da368d391eda.js" defer="defer"></script> </div> <div class='twelve wide column right-wrapper'> <div id='git-project-search-panel' style='display: none;'> <a href='javascript: void(0);' id='back-to-list'> <i class='angle left icon'></i> 返回 </a> <div class='ui icon input search-input'> <i class='iconfont icon-search icon'></i> <input id='search-name' maxlength='40' placeholder='搜索文件' type='text'> </div> </div> <div class='git-project-content' id='git-project-content'> <div class='git-project-desc-wrapper'> <script> $('.git-project-desc-wrapper .ui.dropdown').dropdown(); if (false) { gon.project_new_blob_path = "/zmister/MrDoc/new/master" bindShowModal({ el: $('.no-license .project-license__create'), complete: function(data, modal) { if (!data.haveNoChoice && !data.data) { Flash.show('请选择一项开源许可证') } else { location.href = gon.project_new_blob_path + '?license=' + data.data } }, skip: function () { location.href = gon.project_new_blob_path + '?license' } }); } $(".project-admin-action-box .reject").click(function() { var reason = $('[name=review-reject-reason]').val(); if (!reason) { Flash.error('请选择不通过理由') return } $.ajax({ type: 'POST', url: "/admin/shumei_content/shumei_check/reject_project_public", data: { reason: reason, status: 'rejected', project_id: 6318335 }, success: function(result){ if(result.status == 'success'){ window.location.reload(); }else{ Flash.error(result.message) } } }) }) $(".project-admin-action-box .approve").click(function(){ $.ajax({ type: 'POST', url: "/admin/shumei_content/shumei_check/reject_project_public", data: { status: 'approved', project_id: 6318335 }, success: function(result){ if(result.status == 'success'){ window.location.reload(); }else{ Flash.error(result.message) } } }) }) $(".project-admin-action-box .waiting").click(function(){ $.ajax({ type: 'POST', url: "/admin/shumei_content/shumei_check/reject_project_public", data: { status: 'waiting', project_id: 6318335 }, success: function(result){ if(result.status == 'success'){ window.location.reload(); }else{ Flash.error(result.message) } } }) }) $('i.help.circle.icon').popup({ popup: '.no-license .ui.popup', position: 'right center' }); $('#remove-no-license-message').on('click', function() { $.cookie("skip_repo_no_license_message_6318335", 'hide', { expires: 365 }); $('#user-no-license-message').hide(); return; }); </script> </div> <div class='git-project-bread' id='git-project-bread'> <div class='ui horizontal list mr-1' id='git-branch-dropdown' style=''> <div class='item git-project-branch-item'> <input type="hidden" name="path" id="path" value="" /> <div class='ui top left pointing dropdown gradient button dropdown-has-tabs' id='git-project-branch'> <input type="hidden" name="ref" id="ref" value="master" /> <div class='default text'> master </div> <i class='dropdown icon'></i> <div class='menu'> <div class='ui left icon input'> <i class='iconfont icon-search dropdown-search-icon'></i> <input class='search-branch' placeholder='搜索分支' type='text'> </div> <div class='tab-menu project-branch-tab-menu d-flex'> <div class='tab-menu-item' data-placeholder='搜索分支' data-tab='branches'> 分支 (3) </div> <div class='tab-menu-item' data-placeholder='搜索标签' data-tab='tags'> 标签 (68) </div> <div class='d-align-center' style='flex:1;justify-content:end;'> <div class='tab-menu-action' data-tab='branches'> <a class="ui link button" href="/zmister/MrDoc/branches">管理</a> </div> <div class='tab-menu-action' data-tab='tags'> <a class="ui link button" href="/zmister/MrDoc/tags">管理</a> </div> </div> </div> <div class='tab scrolling menu' data-tab='branches' id='branches_panel'> <div data-value="master" class="item" title="master"><span>master</span> <i class="iconfont icon-shieldlock protected-branch-popup" data-title="受保护分支" data-content="保护规则: master"></i></div> <div data-value="feature/pep8" class="item" title="feature/pep8"><span>feature/pep8</span></div> <div data-value="develop" class="item" title="develop"><span>develop</span> <i class="iconfont icon-shieldlock protected-branch-popup" data-title="受保护分支" data-content="保护规则: develop"></i></div> </div> <div class='tab scrolling menu' data-tab='tags' id='tags_panel'> <div class='item' data-value='v0.9.5'>v0.9.5</div> <div class='item' data-value='v0.9.4'>v0.9.4</div> <div class='item' data-value='v0.9.3'>v0.9.3</div> <div class='item' data-value='v0.9.2'>v0.9.2</div> <div class='item' data-value='v0.9.1'>v0.9.1</div> <div class='item' data-value='v0.9.0'>v0.9.0</div> <div class='item' data-value='v0.8.9'>v0.8.9</div> <div class='item' data-value='v0.8.8'>v0.8.8</div> <div class='item' data-value='v0.8.7'>v0.8.7</div> <div class='item' data-value='v0.8.6'>v0.8.6</div> <div class='item' data-value='v0.8.5'>v0.8.5</div> <div class='item' data-value='v0.8.4'>v0.8.4</div> <div class='item' data-value='v0.8.3'>v0.8.3</div> <div class='item' data-value='v0.8.2'>v0.8.2</div> <div class='item' data-value='v0.8.1'>v0.8.1</div> <div class='item' data-value='v0.8.0'>v0.8.0</div> <div class='item' data-value='v0.7.9'>v0.7.9</div> <div class='item' data-value='v0.7.8'>v0.7.8</div> <div class='item' data-value='v0.7.7'>v0.7.7</div> <div class='item' data-value='v0.7.6'>v0.7.6</div> </div> </div> </div> <style> .iconfont.icon-shieldlock { color: #8c92a4; } .dropdown-search-icon { position: absolute; top: 8px; left: 11px; } </style> <style> #git-project-branch .project-branch-tab-menu, .project-branch-item .project-branch-tab-menu { padding-left: 0px !important; padding-right: 0px !important; margin: 0 11px !important; border-bottom: 1px solid #dfe3e9 !important; } #git-project-branch .ui.dropdown .menu, .project-branch-item .ui.dropdown .menu { width: 360px !important; } #git-project-branch .ui.dropdown .menu .item, .project-branch-item .ui.dropdown .menu .item { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } #git-project-branch .tab-menu-actions, .project-branch-item .tab-menu-actions { position: absolute; right: 0px !important; bottom: 0.357em; } #git-project-branch .tab-menu-action, .project-branch-item .tab-menu-action { position: relative !important; right: 0px !important; bottom: 0px !important; } #git-project-branch .menu::after, .project-branch-item .menu::after { display: none !important; } </style> <script> var $branchesDropdown = $('#branches_panel'); var $tagsDropdown = $('#tags_panel'); var $searchNameInput = $('.search-branch'); var concurrentRequestLock = false; var filterXSS = window.filterXSS; var search_text = ""; var branch_page_number = 1; var branch_total_pager = Math.ceil(3 / 20) || 1 var flag_is_loading = false; var flag_page_number = 1; var flag_total_pager = Math.ceil(68 / 20) || 1 $branchesDropdown.scroll(function() { var branchesPanel = document.getElementById('branches_panel'); var numOfBranches = $branchesDropdown.children().length; if (branchesPanel.clientHeight + branchesPanel.scrollTop + 37 > branchesPanel.scrollHeight && numOfBranches < 3) { debounceLoadMoreBranches.call(); } }); function resetFlagVal() { flag_is_loading = false; flag_page_number = 1; flag_total_pager = 1; concurrentRequestLock = false search_text = ""; branch_page_number = 1; branch_total_pager = 1 } $searchNameInput.on('input', window.globalUtils.debouce(function (e) { resetFlagVal() var $currentTab = $('.tab-menu-action.active'); var numOfBranches = $branchesDropdown.children().length; var searchWord = $searchNameInput.val().trim(); search_text = searchWord if($currentTab.data('tab') === 'branches') { if (searchWord !== "") { loadData(searchWord,1); } else { loadData(); } } var numOfTags = $tagsDropdown.children().length; if($currentTab.data('tab') === 'tags') { if (searchWord !== "") { fetchTags(searchWord,1); } else { fetchTags(); } } }, 500)); function toggleNoResultView($popPanel) { let no_data_html= `<div class='mt-1 mb-1 d-flex-center'> <span>暂无数据</span> </div>` $popPanel.append(no_data_html) } var debounceLoadMoreBranches = window.globalUtils.debouce(function () { if (concurrentRequestLock) return; branch_page_number += 1; if (branch_page_number > branch_total_pager) return; loadData(search_text, branch_page_number); }, 350); function loadData(search, page) { if (concurrentRequestLock) { return; } concurrentRequestLock = true; var searchParams = search || ""; var pageParams = page || 1; $.ajax({ url: "/" + gon.user_project + "/branches/names.json", type: 'GET', data: { search: searchParams, page: pageParams, }, dataType: 'json', success: function (data) { branch_total_pager = data.total_pages; var html = ''; if (pageParams === 1) { $branchesDropdown.empty(); } data.branches.forEach(function (branch) { var protectRule = ''; var branchName = filterXSS(branch.name); if(branch.branch_type.value === 1) { var rule = filterXSS(branch.protection_rule.wildcard); protectRule = `<i class="iconfont icon-shieldlock protected-branch-popup" data-title="受保护分支" data-content='保护规则: ${rule}' > </i>` } html += `<div data-value='${branchName}' class="item"> <span>${branchName}</span> ${protectRule} </div>` }); $branchesDropdown.append(html); $('.protected-branch-popup').popup() if (pageParams === 1 && data.count === 0) { toggleNoResultView($branchesDropdown); } }, complete: function () { concurrentRequestLock = false; } }); } $tagsDropdown.scroll(function() { var tagsPanel = document.getElementById('tags_panel'); var numOfTags = $tagsDropdown.children().length; if (tagsPanel.clientHeight + tagsPanel.scrollTop + 37 > tagsPanel.scrollHeight && numOfTags < 68) { debounceLoadMore.call(); } }); var debounceLoadMore = window.globalUtils.debouce(function () { if (flag_is_loading) return; flag_page_number += 1; if (flag_page_number > flag_total_pager) return; fetchTags(search_text, flag_page_number); }, 350); function fetchTags(search, page) { var searchParams = search || ""; var pageParams = page || 1; if (flag_is_loading) return; flag_is_loading = true; $.ajax({ url: "/" + gon.user_project + "/tags/names.json", data: { search: searchParams, page: pageParams, }, type: "GET", xhrFields: { withCredentials: true, }, success: function (data) { flag_total_pager = data.total_pages; if (pageParams === 1) { $tagsDropdown.html(''); } data.tags.forEach((tag) => { const itemDiv = document.createElement('div'); itemDiv.classList.add('item'); itemDiv.setAttribute('data-value', tag.name); itemDiv.innerText = window.filterXSS(tag.name); $tagsDropdown.append(itemDiv) }); if (pageParams === 1 && data.count === 0) { toggleNoResultView($tagsDropdown); } }, error: function () { }, complete: function () { flag_is_loading = false; }, }); } $('.project-branch-tab-menu').on('click','.tab-menu-item', function (e) { var $currentTab = $(this).data('tab') if($currentTab === 'branches') { $searchNameInput.val('') search_text = ''; loadData() } if($currentTab === 'tags') { $searchNameInput.val('') search_text = ''; fetchTags(); } }) </script> <script> $(function () { var curNode = $('.git-project-branch-item') if (false ){ curNode = $('.left-project-branch-item') }else { curNode = $('.git-project-branch-item') } Gitee.initTabsInDropdown(curNode.find('#git-project-branch').dropdown({ fullTextSearch: true, selectOnKeydown: false, direction: 'downward', action: function (text,value,el) { var oItemOrInitObject = el[0] || el var isNotSelect = oItemOrInitObject.dataset.tab && oItemOrInitObject.dataset.tab === 'branches' if(isNotSelect){ console.warn("You didn't choose a branch") return } var path = $('#path').val(); var href = ['/zmister/MrDoc/tree', encodeURIComponent(value), path].join('/'); window.location.href = href; return true }, onNoResults: function (searchTerm) { //未找到结果 return true }, })); $('.protected-branch-popup').popup() }) </script> </div> </div> <div class='git-project-right-actions pull-right'> <div class='ui orange button' id='btn-dl-or-clone'> 克隆/下载 <i class='dropdown icon'></i> </div> <div class='ui small modal' id='git-project-download-panel'> <i class='iconfont icon-close close'></i> <div class='header'> 克隆/下载 </div> <div class='content'> <div class='ui secondary pointing menu mb-2 menu-container'> <a class='item active' data-text='' data-type='http' data-url='https://gitee.com/zmister/MrDoc.git'>HTTPS</a> <a class='item' data-text='' data-type='ssh' data-url='git@gitee.com:zmister/MrDoc.git'>SSH</a> <a class='item' data-text="该仓库未启用SVN访问,请仓库管理员前往【<a target='_blank' href=/zmister/MrDoc/settings#function>仓库设置</a>】开启。" data-type='svn' data-url=''>SVN</a> <a class='item' data-text="该仓库未启用SVN访问,请仓库管理员前往【<a target='_blank' href=/zmister/MrDoc/settings#function>仓库设置</a>】开启。" data-type='svn_ssh' data-url=''>SVN+SSH</a> <a class="ui basic orange button button-box unlogin-download-btn" href="javascript:void(0);"><i class='icon download'></i> 下载ZIP </a><div class='ui custom popup popup'> <div class='popup-container actions'> <div class='content'> 该操作需登录 Gitee 帐号,请先登录后再操作。 </div> <a class="ui orange button ok icon" href="/login?from=download_repository_zip">立即登录 </a><a class="ui blank button cancel" href="/signup?from=download_repository_zip">没有帐号,去注册 </a></div> </div> </div> <div class='ui fluid right labeled small input download-url-panel mb-2'> <input type="text" name="project_url_clone" id="project_url_clone" value="https://gitee.com/zmister/MrDoc.git" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#project_url_clone' id='btn-copy-project_clone_url1'></i> </div> </div> <div class='tip-box mb-2'> 提示 </div> <div class='mb-1 clone-url-title'> 下载代码请复制以下命令到终端执行 </div> <div class='ui fluid right labeled small input download-url-panel mb-2'> <input type="text" name="project_clone_url" id="project_clone_url" value="https://gitee.com/zmister/MrDoc.git" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#project_clone_url' id='btn-copy-project_clone_url'></i> </div> </div> <div class='ui fluid right labeled warning-text forbid-warning-text'> </div> <div class='http-ssh-item mb-2'> <div> 为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置 </div> <div class='textarea-box mt-2'> <textarea class='textarea-content-box' id='global-config-clone' readonly>git config --global user.name userName 
git config --global user.email userEmail</textarea> <i class='icon iconfont icon-clone mr-2 btn-copy-clone text-dark' data-clipboard-target='#global-config-clone' id='btn-copy-global-config'></i> </div> </div> <div class='ssh-item item-panel-box'> <div class='mb-2'> 初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置 </div> <div class='mb-1'> <span>1</span> 生成 RSA 密钥 </div> <div class='ui fluid right labeled small input mb-2'> <input type="text" name="ssh_keygen_clone" id="ssh_keygen_clone" value="ssh-keygen -t rsa" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#ssh_keygen_clone' id='btn-copy-ssh_keygen'></i> </div> </div> <div class='mb-1'> <span>2</span> 获取 RSA 公钥内容,并配置到<a href='/profile/sshkeys' target="_blank"> SSH公钥 </a> 中 </div> <div class='ui fluid right labeled small input mb-2'> <input type="text" name="id_rsa_clone" id="id_rsa_clone" value="cat ~/.ssh/id_rsa.pub" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#id_rsa_clone' id='btn-copy-d_rsa'></i> </div> </div> </div> <div class='svn-item item-panel-box'> <div class='mb-1 mt-2'> 在 Gitee 上使用 SVN,请访问<a href='https://help.gitee.com/enterprise/code-manage/%E4%BB%A3%E7%A0%81%E6%89%98%E7%AE%A1/%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93/Gitee%20SVN%E6%94%AF%E6%8C%81' target="_blank"> 使用指南 </a> </div> </div> <div class='http-item item-panel-box'> <div class='mb-2 mt-2'> 使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议<a href='/profile/personal_access_tokens' target="_blank"> 配置并使用私人令牌 </a>替代登录密码进行克隆、推送等操作 </div> <div>Username for 'https://gitee.com': userName</div> <div class='mb-1'> <span>Password for 'https://userName@gitee.com':</span> <span>#</span> <span> 私人令牌 </span> </div> </div> </div> </div> <style> #git-project-download-panel { top: 90px !important; } #git-project-download-panel input { color: #40485b !important; } #git-project-download-panel .textarea-box { width: 100%; height: 60px; color: #9d9d9d; border-radius: 2px; background-color: #F5F5F5 !important; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } #git-project-download-panel .menu-container { font-weight: bold; border-color: rgba(0, 0, 0, 0.1) !important; border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; } #git-project-download-panel .menu-container .item { padding: 7px 12px !important; } #git-project-download-panel .hr-item { color: rgba(39, 41, 43, 0.15) !important; } #git-project-download-panel .textarea-content-box { width: 100%; height: 60px; resize: none; border: 0px !important; background-color: #F5F5F5 !important; color: #40485b !important; } #git-project-download-panel .btn-copy-clone { cursor: pointer; color: rgba(0, 0, 0, 0.87) !important; } #git-project-download-panel .copy-icon-box { background-color: #F5F5F5 !important; border-left: 0px !important; } #git-project-download-panel .button-box { border: 0px !important; float: right !important; padding-right: 0 !important; } #git-project-download-panel .tip-box { border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; padding-bottom: 4px; font-weight: 700; } #git-project-download-panel .popup-container { padding: 8px 12px 4px 12px; text-align: center; font-size: 14px; } #git-project-download-panel .popup-container .ok { margin: 12px auto; width: 25%; min-width: 125px; display: block; } #git-project-download-panel .popup-container .cancel { margin-left: 0; } </style> <script> $(function () { var $btnClone = $('#btn-dl-or-clone') var $modalDownload = $('#git-project-download-panel'); var $input = $('#project_clone_url') var $inputUrl = $('#project_url_clone') var cloneUrlTitle= $('.clone-url-title') $('#btn-dl-or-clone').on('click', function (e) { e.preventDefault(); $modalDownload.modal('show'); }) $modalDownload.find('.menu > .item').on('click', function(e) { var $item = $(this).addClass('active'); $item.siblings().removeClass('active'); var dataUrl = $item.attr('data-url'); var cloneUrl = $item.attr('data-url'); var dataType = $item.attr('data-type') var cloneToLocal = '下载代码请复制以下命令到终端执行' if(dataType=='http'){ $modalDownload.find('.http-item').show(); $('.content > .item-panel-box:not(.http-item)').hide(); $modalDownload.find('.http-ssh-item').show(); cloneUrl = 'git clone '+dataUrl }else if(dataType=='ssh'){ $modalDownload.find('.ssh-item').show(); $('.content > .item-panel-box:not(.ssh-item)').hide(); $modalDownload.find('.http-ssh-item').show(); cloneUrl = 'git clone '+dataUrl }else if(dataType=='svn') { $('.content > .item-panel-box:not(.svn-item)').hide(); $modalDownload.find('.svn-item').show(); $modalDownload.find('.http-ssh-item').hide(); cloneUrl = 'svn checkout '+dataUrl }else { $('.content > .item-panel-box:not(.svn-item)').hide(); $modalDownload.find('.svn-item').show(); $modalDownload.find('.http-ssh-item').hide(); cloneUrl = 'svn checkout '+dataUrl } if (dataUrl) { $modalDownload.find('.download-url-panel').show(); $input.val(cloneUrl); $inputUrl.val(dataUrl) cloneUrlTitle.show(); $modalDownload.find('.forbid-warning-text').html(''); } else { $modalDownload.find('.download-url-panel').hide(); //$modalDownload.find('.svn-item').hide(); cloneUrlTitle.hide(); $modalDownload.find('.forbid-warning-text').html($item.attr('data-text') || ''); } $.cookie('remote_way', $item.attr('data-type'), { expires: 365, path: '/' }); }).filter('[data-type="' + ($.cookie('remote_way') || 'http') + '"]').trigger('click'); $('.btn-copy-clone').popup({ content: '点击复制', }).on('click', function(e) { e.stopPropagation(); return false; }).each(function(_, btnCopy) { var $btnCopy = $(btnCopy); new Clipboard(btnCopy).on('success', function() { $btnCopy.popup('destroy').popup({ content: '已复制', on: 'manual' }).popup('show'); setTimeout(function() { $btnCopy.popup('destroy').popup({ content: '点击复制' }); }, 2000); }); }); var $downloadBtn= $('.unlogin-download-btn') var $popupContainer = $('.popup-container') $downloadBtn.popup({ popup : $('.custom.popup'), position : 'bottom right', }).on('click', function(e) { $downloadBtn.popup('destroy').popup({ popup : $('.custom.popup'), on: 'manual', position : 'bottom right', }).popup('show'); setTimeout(function() { $downloadBtn.popup('hide'); }, 2000); }) }) </script> </div> <div class='d-inline pull-right' id='git-project-root-actions'> <div class='ui horizontal list repo-action-list d-flex d-align-center repo-action-list-right'> <div class='item search-box-container'> <div class='ui icon input search-input' id='search-box'> <input class='search-file-name' maxlength='40' placeholder='搜索文件' type='text'> </div> <a class='d-flex d-align-center head-search-file-btn' id='search-file-btn'> <span class='iconify' data-icon='gitee:search' style='font-size: 16px;color:#979CAC;margin-right:10px'></span> </a> <div class='filter-file-container' style='display: none;'></div> </div> <div class='item plus-box'> <div class='ui pointing right top dropdown git-project-file' id='git-project-file'> <span class='iconify' data-icon='gitee:plus' style='font-size: 16px;color:#979CAC'></span> <div class='menu repo-dropdown-box pt-1 pb-1'> <div class='disabled item'>新建文件</div> <div class='disabled item d-flex d-align-center'> <span class='iconify' data-icon='gitee:folder-sub' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建子模块 </span> </div> <div class='disabled item d-flex d-align-center'> <span class='iconify' data-icon='gitee:upload' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 上传文件 </span> </div> </div> </div> </div> </div> <script> $('.git-project-file').dropdown({ action: 'hide', onHide: function () { $('.plus-box').removeClass('click-active') }, onShow: function () { $('.plus-box').addClass('click-active') } }); </script> <script> $('.webIDE-box').popup() </script> <script src="https://cn-assets.gitee.com/assets/file_search/app-89100712b3bd4fbc0b0eb0aa7d7bf62e.js"></script> <style> .filter-file-container-hide { display: none !important; } </style> </div> <div class='breadcrumb_path path-breadcrumb-contrainer' id='git-project-breadcrumb'> </div> <div class='ui horizontal list repo-action-list branches-tags' style=''> <div class='item'> <a class="ui blank button" href="/zmister/MrDoc/branches"><i class='iconfont icon-branches'></i> 分支 3 </a></div> <div class='item mr-3'> <a class="ui blank button" href="/zmister/MrDoc/tags"><i class='iconfont icon-tag'></i> 标签 68 </a></div> </div> </div> <script src="https://cn-assets.gitee.com/webpacks/parse_blob_form_scheme-ea7503b4330a77e025e6.bundle.js"></script> <script> if(window.gon.locale == 'en') $('.branches-tags').css('margin-top', '12px') // 仓库页面切换路径时: 刷新 yaml 错误检查 $(window).on('pjax-complete:file-show', function () { window.parseBlobFormScheme && window.parseBlobFormScheme($('.js-blob-data').data('blob')); }); </script> <style> .ui.dropdown .menu > .header { text-transform: none; } </style> <script> $(function () { var $tip = $('#apk-download-tip'); if (!$tip.length) { return; } $tip.find('.btn-close').on('click', function () { $tip.hide(); }); }); (function(){ function pathAutoRender() { var $parent = $('#git-project-bread'), $child = $('#git-project-bread').children('.ui.horizontal.list'), mainWidth = 0; $child.each(function (i,item) { mainWidth += $(item).width() }); $('.breadcrumb.path.fork-path').remove(); if (mainWidth > 995) { $('#path-breadcrumb').hide(); $parent.append('<div class="ui breadcrumb path fork-path">' + $('#path-breadcrumb').html() + '<div/>') } else { $('#path-breadcrumb').show(); } } window.pathAutoRender = pathAutoRender; pathAutoRender(); })(); </script> <div class='branch-diff-notice-bar hide'> <div class='left-section'></div> <div class='right-section'> <div class='ui button gradient contribute'> 贡献代码 <i class='dropdown icon'></i> </div> <div class='ui button gradient branch-sync hide'> 同步代码 <i class='dropdown icon'></i> </div> </div> </div> <div class='ui popup contribute branch-diff-pop-panel contribute-pop'> <div class='notice-title'></div> <div class='notice-sub-title'></div> <div class='notice-content'></div> <a class='ui button orange fluid disabled create-pr' href='/' target='_blank'> 创建 Pull Request </a> </div> <div class='ui popup branch-diff-pop-panel branch-sync-pop'> <div class='notice-title'></div> <div class='notice-content'></div> <div class='known-more'> <a href='/help/articles/4395' target='_blank'> 了解更多 </a> </div> <div class='btn-group'> <div class='ui button basic red discard-btn hide'></div> <a class='ui button orange basic diff-btn hide' href='/' target='_blank'> 对比差异 </a> <a class='ui button gradient pr-sync-btn hide' href='/' target='_blank'> 通过 Pull Request 同步 </a> <div class='ui buttons basic dropdown-group-btn hide'> <div class='ui button branch-sync-btn'> 同步更新到分支 </div> <div class='ui button dropdown dropdown-create-pr'> <i class='icon dropdown'></i> <div class='menu'> <div class='disabled item'> <div> 通过 Pull Request 同步 <div class='text-muted fs-12 mt-1'> 将会在向当前分支创建一个 Pull <br/>Request,合入后将完成同步 </div> </div> </div> </div> </div> </div> </div> </div> <script> (function () { const i18_compare_current_branch = `当前分支与 <a href="URL">BRANCH</a> 相比` const i18_branch_ahead_commit = `,领先 <a href="URL">NUM 个 Commit</a>` const i18_branch_behind_commit = `,落后 <a href="URL">NUM 个 Commit</a>` const i18_contribute_ahead_title = `当前分支比 BRANCH 领先了 NUM 次提交。` const i18_contribute_pr_create = `创建一个 Pull Request 贡献代码。` const i18_contribute_has_pr = `已创建了 Pull Request` const i18_contribute_no_ahead = `这个分支没有领先于 BRANCH 的代码提交。` const i18_branch_sync_behind = `这个分支已落后于 BRANCH 分支` const i18_branch_sync_behind_desc = `从 BRANCH 分支同步 NUM 个提交来更新分支以保持当前分支代码是最新的。` const i18_branch_sync_out_of_date = `此分支已过时` const i18_branch_sync_out_of_date_desc = `你可以将 BRANCH 分支中的最新更改合并到此分支中。或丢弃当前分支上的提交以使当前分支与 BRANCH 分支匹配。这将从当前分支中删除 NUM 个提交。` const i18_branch_discard_diff = `丢弃 NUM 个提交` const i18_branch_sync_success = `同步成功` const i18_branch_sync_fail = `同步失败` const i18_branch_discard_success = `丢弃成功` const i18_branch_discard_fail = `丢弃失败` window.locale_temple_branch_diff = { i18_compare_current_branch, i18_branch_ahead_commit, i18_branch_behind_commit, i18_contribute_ahead_title, i18_contribute_pr_create, i18_contribute_has_pr, i18_contribute_no_ahead, i18_branch_sync_behind, i18_branch_sync_behind_desc, i18_branch_sync_out_of_date, i18_branch_sync_out_of_date_desc, i18_branch_discard_diff, i18_branch_sync_success, i18_branch_sync_fail, i18_branch_discard_success, i18_branch_discard_fail } })(); </script> <div class='row column tree-holder' id='tree-holder'> <div class='tree-content-holder' id='tree-content-holder'> <div class='ui flat nopadding segment tree-content'> <div class='git-project-recent-commit' id='git-project-info'> <div class='recent-commit'> <a class="commit-author-link js-popover-card" data-username="null" href="mailto:zmister@qq.com"><img class="avatar circular ui image 20 mini" width="20" alt="" avatar="yangjian-" /> <span class="commit-author-name">yangjian</span></a> <span> <a class="repo-index-commit-msg" title="修复editormd编辑器工具栏插入分割线点击无效的问题" href="/zmister/MrDoc/commit/f6d1d03ccfc00dbfdc824b8d69b54a67903758a7">修复editormd编辑器工具栏插入分割线点击无效的问题</a> </span> <span>f6d1d03</span> <span class='timeago' datetime='2025-03-23 22:20' title='2025-03-23 22:20:52 +0800'></span> <check-runs branch='master' commit-id='f6d1d03ccfc00dbfdc824b8d69b54a67903758a7' project-path='zmister/MrDoc'></check-runs> <build-status commit-id='f6d1d03ccfc00dbfdc824b8d69b54a67903758a7'></build-status> </div> <div class='all-commits'> <a href="/zmister/MrDoc/commits/master"><i class='iconfont icon-commit'></i> 887 次提交 </a></div> </div> <div class='grid list selection table_da39a3ee5e6b4b0d3255bfef95601890afd80709 tree-table ui' id='tree-slider'> <div class='create-folder-form form ui'> <form id="folder_form-edit" action="/zmister/MrDoc/new/master" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="+r71+9LHzg3nCePgLMsPp6/2pkInvBYBckXTGfecKWPNVaUtcsFUEilqU5Zu15PtwDy+eE/ySF7PvLMLnaZqHg==" /> <div class='fields'> <div class='field'> <input type="hidden" name="new_file_path" id="new_file_path" /> <input type="hidden" name="content" id="content" /> <input id='new_folder_path' name='new_folder_path' placeholder='新建文件夹' type='text'> </div> <div class='field'> <button name="button" type="submit" class="ui primary button orange submit field-init-btn js-submit-btn">提交</button> <a class="ui basic white button cancel field-init-btn" href="javascript:void(0)">取消</a> </div> <div class='ui mid-center small message notice'> <strong>提示:</strong> 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件 </div> </div> </form> </div> <div class='file_4c40eab00f24304ca400313319c58d461788ff5e row tree-item' data-branch='master' data-type='folder' file_hex='file_4c40eab00f24304ca400313319c58d461788ff5e'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='.github' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title=".github" data-path=".github" href="/zmister/MrDoc/tree/master/.github"><span class='simplified-path'></span>.github <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_4c40eab00f24304ca400313319c58d461788ff5e row tree-item tree-item-rename' file_hex='file_4c40eab00f24304ca400313319c58d461788ff5e' style='display:none'> <div class='ui column form' path='tree/master/.github'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='.github'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_bbd29eac0af09104f479f8231395dc0281f3d86b row tree-item' data-branch='master' data-type='folder' file_hex='file_bbd29eac0af09104f479f8231395dc0281f3d86b'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='MrDoc' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="MrDoc" data-path="MrDoc" href="/zmister/MrDoc/tree/master/MrDoc"><span class='simplified-path'></span>MrDoc <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_bbd29eac0af09104f479f8231395dc0281f3d86b row tree-item tree-item-rename' file_hex='file_bbd29eac0af09104f479f8231395dc0281f3d86b' style='display:none'> <div class='ui column form' path='tree/master/MrDoc'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='MrDoc'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_6b193db277082974e08994e15ed1aeb1457be742 row tree-item' data-branch='master' data-type='folder' file_hex='file_6b193db277082974e08994e15ed1aeb1457be742'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='app_admin' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="app_admin" data-path="app_admin" href="/zmister/MrDoc/tree/master/app_admin"><span class='simplified-path'></span>app_admin <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_6b193db277082974e08994e15ed1aeb1457be742 row tree-item tree-item-rename' file_hex='file_6b193db277082974e08994e15ed1aeb1457be742' style='display:none'> <div class='ui column form' path='tree/master/app_admin'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='app_admin'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_e7f6deda4377df6647f2b88eb0f98e95a9bfaf27 row tree-item' data-branch='master' data-type='folder' file_hex='file_e7f6deda4377df6647f2b88eb0f98e95a9bfaf27'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='app_api' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="app_api" data-path="app_api" href="/zmister/MrDoc/tree/master/app_api"><span class='simplified-path'></span>app_api <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_e7f6deda4377df6647f2b88eb0f98e95a9bfaf27 row tree-item tree-item-rename' file_hex='file_e7f6deda4377df6647f2b88eb0f98e95a9bfaf27' style='display:none'> <div class='ui column form' path='tree/master/app_api'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='app_api'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_9f5eaf55baef7ab4174e34eebbeb390795c6ac06 row tree-item' data-branch='master' data-type='folder' file_hex='file_9f5eaf55baef7ab4174e34eebbeb390795c6ac06'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='app_doc' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="app_doc" data-path="app_doc" href="/zmister/MrDoc/tree/master/app_doc"><span class='simplified-path'></span>app_doc <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_9f5eaf55baef7ab4174e34eebbeb390795c6ac06 row tree-item tree-item-rename' file_hex='file_9f5eaf55baef7ab4174e34eebbeb390795c6ac06' style='display:none'> <div class='ui column form' path='tree/master/app_doc'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='app_doc'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_c1ac28e42d277e4a9affe5213e2edb30d72469a0 row tree-item' data-branch='master' data-type='folder' file_hex='file_c1ac28e42d277e4a9affe5213e2edb30d72469a0'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='captrue' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="captrue" data-path="captrue" href="/zmister/MrDoc/tree/master/captrue"><span class='simplified-path'></span>captrue <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_c1ac28e42d277e4a9affe5213e2edb30d72469a0 row tree-item tree-item-rename' file_hex='file_c1ac28e42d277e4a9affe5213e2edb30d72469a0' style='display:none'> <div class='ui column form' path='tree/master/captrue'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='captrue'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_dfba7aade0868074c2861c98e2a9a92f3178a51b row tree-item' data-branch='master' data-type='folder' file_hex='file_dfba7aade0868074c2861c98e2a9a92f3178a51b'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='config' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="config" data-path="config" href="/zmister/MrDoc/tree/master/config"><span class='simplified-path'></span>config <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_dfba7aade0868074c2861c98e2a9a92f3178a51b row tree-item tree-item-rename' file_hex='file_dfba7aade0868074c2861c98e2a9a92f3178a51b' style='display:none'> <div class='ui column form' path='tree/master/config'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='config'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_0e038a42cca30122c3324dfda646d3f079374dd5 row tree-item' data-branch='master' data-type='folder' file_hex='file_0e038a42cca30122c3324dfda646d3f079374dd5'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='locale' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="locale" data-path="locale" href="/zmister/MrDoc/tree/master/locale"><span class='simplified-path'></span>locale <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_0e038a42cca30122c3324dfda646d3f079374dd5 row tree-item tree-item-rename' file_hex='file_0e038a42cca30122c3324dfda646d3f079374dd5' style='display:none'> <div class='ui column form' path='tree/master/locale'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='locale'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_7babc233de26ab19ead1b9c278128d5c434910ee row tree-item' data-branch='master' data-type='folder' file_hex='file_7babc233de26ab19ead1b9c278128d5c434910ee'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='log' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="log" data-path="log" href="/zmister/MrDoc/tree/master/log"><span class='simplified-path'></span>log <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_7babc233de26ab19ead1b9c278128d5c434910ee row tree-item tree-item-rename' file_hex='file_7babc233de26ab19ead1b9c278128d5c434910ee' style='display:none'> <div class='ui column form' path='tree/master/log'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='log'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_bb362a46a483f3f8c993ec45978ae24e60b1ea4e row tree-item' data-branch='master' data-type='folder' file_hex='file_bb362a46a483f3f8c993ec45978ae24e60b1ea4e'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='media' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="media" data-path="media" href="/zmister/MrDoc/tree/master/media"><span class='simplified-path'></span>media <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_bb362a46a483f3f8c993ec45978ae24e60b1ea4e row tree-item tree-item-rename' file_hex='file_bb362a46a483f3f8c993ec45978ae24e60b1ea4e' style='display:none'> <div class='ui column form' path='tree/master/media'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='media'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_a381562afa0e16c5548e829b2f1a659a8c2e7c11 row tree-item' data-branch='master' data-type='folder' file_hex='file_a381562afa0e16c5548e829b2f1a659a8c2e7c11'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='static' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="static" data-path="static" href="/zmister/MrDoc/tree/master/static"><span class='simplified-path'></span>static <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_a381562afa0e16c5548e829b2f1a659a8c2e7c11 row tree-item tree-item-rename' file_hex='file_a381562afa0e16c5548e829b2f1a659a8c2e7c11' style='display:none'> <div class='ui column form' path='tree/master/static'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='static'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_3226ecbe650213a49cd03ae67140750e4f340083 row tree-item' data-branch='master' data-type='folder' file_hex='file_3226ecbe650213a49cd03ae67140750e4f340083'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='template' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="template" data-path="template" href="/zmister/MrDoc/tree/master/template"><span class='simplified-path'></span>template <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_3226ecbe650213a49cd03ae67140750e4f340083 row tree-item tree-item-rename' file_hex='file_3226ecbe650213a49cd03ae67140750e4f340083' style='display:none'> <div class='ui column form' path='tree/master/template'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='template'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_a5cc2925ca8258af241be7e5b0381edf30266302 row tree-item' data-branch='master' data-type='file' file_hex='file_a5cc2925ca8258af241be7e5b0381edf30266302'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='.gitignore' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title=".gitignore" data-path=".gitignore" href="/zmister/MrDoc/blob/master/.gitignore">.gitignore</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_a5cc2925ca8258af241be7e5b0381edf30266302 row tree-item tree-item-rename' file_hex='file_a5cc2925ca8258af241be7e5b0381edf30266302' style='display:none'> <div class='ui column form' path='blob/master/.gitignore'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='.gitignore'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_7facec255884dc55d3818e4dfbea89b1bdd7f49e row tree-item' data-branch='master' data-type='file' file_hex='file_7facec255884dc55d3818e4dfbea89b1bdd7f49e'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='CHANGES.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="CHANGES.md" data-path="CHANGES.md" href="/zmister/MrDoc/blob/master/CHANGES.md">CHANGES.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_7facec255884dc55d3818e4dfbea89b1bdd7f49e row tree-item tree-item-rename' file_hex='file_7facec255884dc55d3818e4dfbea89b1bdd7f49e' style='display:none'> <div class='ui column form' path='blob/master/CHANGES.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='CHANGES.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_48d967e37e3a8c22bf8de73ee641020ce0561e28 row tree-item' data-branch='master' data-type='file' file_hex='file_48d967e37e3a8c22bf8de73ee641020ce0561e28'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='DISCLAIMER.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="DISCLAIMER.md" data-path="DISCLAIMER.md" href="/zmister/MrDoc/blob/master/DISCLAIMER.md">DISCLAIMER.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_48d967e37e3a8c22bf8de73ee641020ce0561e28 row tree-item tree-item-rename' file_hex='file_48d967e37e3a8c22bf8de73ee641020ce0561e28' style='display:none'> <div class='ui column form' path='blob/master/DISCLAIMER.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='DISCLAIMER.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4 row tree-item' data-branch='master' data-type='file' file_hex='file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='Dockerfile' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="Dockerfile" data-path="Dockerfile" href="/zmister/MrDoc/blob/master/Dockerfile">Dockerfile</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4 row tree-item tree-item-rename' file_hex='file_6651ddff6eb82c840ced7c1dddee15c6e1913dd4' style='display:none'> <div class='ui column form' path='blob/master/Dockerfile'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='Dockerfile'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_a7dba5e55efffaeb51b45f9badfc7a86f255da40 row tree-item' data-branch='master' data-type='file' file_hex='file_a7dba5e55efffaeb51b45f9badfc7a86f255da40'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='Dockerfile-loongarch64' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="Dockerfile-loongarch64" data-path="Dockerfile-loongarch64" href="/zmister/MrDoc/blob/master/Dockerfile-loongarch64">Dockerfile-loongarch64</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_a7dba5e55efffaeb51b45f9badfc7a86f255da40 row tree-item tree-item-rename' file_hex='file_a7dba5e55efffaeb51b45f9badfc7a86f255da40' style='display:none'> <div class='ui column form' path='blob/master/Dockerfile-loongarch64'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='Dockerfile-loongarch64'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_0398ccd0f49298b10a3d76a47800d2ebecd49859 row tree-item' data-branch='master' data-type='file' file_hex='file_0398ccd0f49298b10a3d76a47800d2ebecd49859'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='LICENSE' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="LICENSE" data-path="LICENSE" href="/zmister/MrDoc/blob/master/LICENSE">LICENSE</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_0398ccd0f49298b10a3d76a47800d2ebecd49859 row tree-item tree-item-rename' file_hex='file_0398ccd0f49298b10a3d76a47800d2ebecd49859' style='display:none'> <div class='ui column form' path='blob/master/LICENSE'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='LICENSE'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_51c6e27f73fd83043324183223f372b31a1ae27e row tree-item' data-branch='master' data-type='file' file_hex='file_51c6e27f73fd83043324183223f372b31a1ae27e'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='README-zh.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="README-zh.md" data-path="README-zh.md" href="/zmister/MrDoc/blob/master/README-zh.md">README-zh.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_51c6e27f73fd83043324183223f372b31a1ae27e row tree-item tree-item-rename' file_hex='file_51c6e27f73fd83043324183223f372b31a1ae27e' style='display:none'> <div class='ui column form' path='blob/master/README-zh.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='README-zh.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d row tree-item' data-branch='master' data-type='file' file_hex='file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='README.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="README.md" data-path="README.md" href="/zmister/MrDoc/blob/master/README.md">README.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d row tree-item tree-item-rename' file_hex='file_8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d' style='display:none'> <div class='ui column form' path='blob/master/README.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='README.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_7c875fef54268bc433a7fc46aa5fd6e96d58f32f row tree-item' data-branch='master' data-type='file' file_hex='file_7c875fef54268bc433a7fc46aa5fd6e96d58f32f'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='SECURITY.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="SECURITY.md" data-path="SECURITY.md" href="/zmister/MrDoc/blob/master/SECURITY.md">SECURITY.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_7c875fef54268bc433a7fc46aa5fd6e96d58f32f row tree-item tree-item-rename' file_hex='file_7c875fef54268bc433a7fc46aa5fd6e96d58f32f' style='display:none'> <div class='ui column form' path='blob/master/SECURITY.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='SECURITY.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_35b8c13cf2eb2a194eada000eb310d65aed53b2a row tree-item' data-branch='master' data-type='file' file_hex='file_35b8c13cf2eb2a194eada000eb310d65aed53b2a'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='docker-compose.yml' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="docker-compose.yml" data-path="docker-compose.yml" href="/zmister/MrDoc/blob/master/docker-compose.yml">docker-compose.yml</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_35b8c13cf2eb2a194eada000eb310d65aed53b2a row tree-item tree-item-rename' file_hex='file_35b8c13cf2eb2a194eada000eb310d65aed53b2a' style='display:none'> <div class='ui column form' path='blob/master/docker-compose.yml'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='docker-compose.yml'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_fb270708655529ffd775aea7e5732bb57e3bcefc row tree-item' data-branch='master' data-type='file' file_hex='file_fb270708655529ffd775aea7e5732bb57e3bcefc'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='docker-update.sh' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="docker-update.sh" data-path="docker-update.sh" href="/zmister/MrDoc/blob/master/docker-update.sh">docker-update.sh</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_fb270708655529ffd775aea7e5732bb57e3bcefc row tree-item tree-item-rename' file_hex='file_fb270708655529ffd775aea7e5732bb57e3bcefc' style='display:none'> <div class='ui column form' path='blob/master/docker-update.sh'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='docker-update.sh'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_4180619e86eee782997736da7f0fedc0d345c933 row tree-item' data-branch='master' data-type='file' file_hex='file_4180619e86eee782997736da7f0fedc0d345c933'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='docker_mrdoc.sh' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="docker_mrdoc.sh" data-path="docker_mrdoc.sh" href="/zmister/MrDoc/blob/master/docker_mrdoc.sh">docker_mrdoc.sh</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_4180619e86eee782997736da7f0fedc0d345c933 row tree-item tree-item-rename' file_hex='file_4180619e86eee782997736da7f0fedc0d345c933' style='display:none'> <div class='ui column form' path='blob/master/docker_mrdoc.sh'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='docker_mrdoc.sh'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_3156ad13e4d695cd526bbb7b031016ecba842270 row tree-item' data-branch='master' data-type='file' file_hex='file_3156ad13e4d695cd526bbb7b031016ecba842270'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='manage.py' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="manage.py" data-path="manage.py" href="/zmister/MrDoc/blob/master/manage.py">manage.py</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_3156ad13e4d695cd526bbb7b031016ecba842270 row tree-item tree-item-rename' file_hex='file_3156ad13e4d695cd526bbb7b031016ecba842270' style='display:none'> <div class='ui column form' path='blob/master/manage.py'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='manage.py'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_19359a61ae2446b51b549167b014da2fcf265768 row tree-item' data-branch='master' data-type='file' file_hex='file_19359a61ae2446b51b549167b014da2fcf265768'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='requirements.txt' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="requirements.txt" data-path="requirements.txt" href="/zmister/MrDoc/blob/master/requirements.txt">requirements.txt</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_19359a61ae2446b51b549167b014da2fcf265768 row tree-item tree-item-rename' file_hex='file_19359a61ae2446b51b549167b014da2fcf265768' style='display:none'> <div class='ui column form' path='blob/master/requirements.txt'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='requirements.txt'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> </div> </div> <div class='ui tree_progress' data-logs-path='/zmister/MrDoc/refs/master/logs_tree/'> <div class='ui active inverted dimmer'> <div class='ui small text loader'>Loading...</div> </div> </div> <div class='readme-box' id='git-readme'> <div class='ui flat nopadding segment file_holder'> <div class='file_title d-flex-between file_readme_title'> <div class='d-flex'> <div class='file_title_readme mr-1 pb-1 active-title pr-1 pl-1'> <i class='iconfont icon-readme mr-05'></i> <span class='file_name'>README</span> </div> <div class='file_title_license pb-1 pl-1 pr-1'> <i class='iconfont icon-licence mr-05'></i> <span class='file_name'> GPL-3.0 </span> </div> </div> <div> </div> </div> <div class='readme-content'> <div class='file_catalog'> <div class='toggle'> <i class='icon angle left'></i> </div> <div class='scroll-container'> <div class='container'> <div class='skeleton'> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> </div> </div> </div> </div> <div class='file_content markdown-body'> <blob-markdown-renderer data-dir='' data-path-with-namespace='/zmister/MrDoc'>
<textarea class='content' style='display:none;'><h1 align="center">觅思文档开源版</h1>

<p align="center">个人和小型团队的云笔记、云文档、知识管理私有化部署方案</p>

<p align="center">
<a href="./README-zh.md">中文介绍</a> |
<a href="./README.md">English Description</a> 
</p>


<p align="center">
<img src="https://img.shields.io/badge/MrDoc-v0.9.5-brightgreen.svg" title="Mrdoc" />
<img src="https://img.shields.io/badge/Python-3.9+-blue.svg" title="Python" />
<img src="https://img.shields.io/badge/Django-v4.2-important.svg" title="Django" />
<a href="https://hellogithub.com/repository/6494f041e00d4b8481ed1114a0bd33c1" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=6494f041e00d4b8481ed1114a0bd33c1&claim_uid=3IU9mFeOVT0cXyw&theme=small" alt="Featured|HelloGitHub" /></a>
</p>

<p align="center">
<a href="https://mrdoc.pro">官网</a> | 
<a href="http://mrdoc.zmister.com/">演示站点</a> |
<a href="https://www.bilibili.com/video/BV1LF411u7NM/">零基础视频教程</a>
</p>

<p align="center">
<a href="https://doc.mrdoc.pro/p/deploy/">安装手册</a> | 
<a href="https://doc.mrdoc.pro/p/user-guide/">使用手册</a> |
<a href="https://doc.mrdoc.pro/p/example/">文档效果</a>
</p>

<p align="center">源码:<a href="https://gitee.com/zmister/MrDoc">码云</a> | 
<a href="https://github.com/zmister2016/MrDoc">GitHub</a>
</p>

## 简介

`MrDoc` 是基于`Python`开发的在线文档系统。

MrDoc 适合作为个人和中小型团队的私有云文档、云笔记和知识管理工具,致力于成为优秀的私有化在线文档部署方案。

你可以简单粗暴地将 MrDoc 视为「可私有部署的语雀」和「可在线编辑文档的GitBook」。

MrDoc 全系产品目前涵盖以下终端:

- 🌐Web端:开源版、专业版,[版本对比](https://doc.mrdoc.pro/doc/3441/)
- 💻浏览器扩展:支持 Chromium 系列浏览器、Firefox 浏览器,[下载地址](https://gitee.com/zmister/mrdoc-webclipper)
- 🗔桌面客户端:支持 Windows、macOS、Linux,[下载地址](https://gitee.com/zmister/mrdoc-desktop-release/releases/)
- 📱移动客户端:支持 Android,[下载地址](https://gitee.com/zmister/mrdoc-app-release)
- Obsidian 同步插件:[使用教程](https://doc.mrdoc.pro/doc/45650/)

## 演示站点

开源版 - [http://mrdoc.zmister.com](http://mrdoc.zmister.com)

专业版 - [https://doc.mrdoc.pro](https://doc.mrdoc.pro)

开源版与专业版对比 - [https://doc.mrdoc.pro/doc/3441/](https://doc.mrdoc.pro/doc/3441/)

用户名:test1 密码:123456

## 适用场景

个人云笔记、在线产品手册、团队内部知识库、在线电子教程等私有化部署场景。

## 功能特性

- **⚙站点管理**
 - 用户管理
 - 图片管理
 - 附件管理
 - 文档管理
 - 文集管理
 - 注册邀请码配置
 - 登录验证码配置
 - 全站禁止注册配置
 - 全站强制登录配置
 - 广告代码配置
 - 统计代码配置
 - 站点信息配置
 - 备案号配置
 - 附件配置

- **🧑个人管理**
 - 文集管理
 - 文档管理:新建、删除、回收站、历史版本
 - 文档模板管理:新建、删除
 - 图片管理:上传、分组、删除
 - 附件管理:上传、删除
 - Token管理:借助Token API 接口高效新建和获取文档;
 - 个人信息管理:修改昵称、修改电子邮箱、切换文档编辑器;

- **📚文集控制**
 - 文集图标配置
 - 文字水印配置
 - 文集权限配置:公开、私密、指定用户可见、访问码可见
 - 下载配置:PDF、EPUB文件生成和下载
 - 文集协作成员配置
 - 文集文档拖拽排序
 - 文集导出
 - 文集转让
 
- **✍文档书写**
 - 文本文档、表格文档两种文档类型,`Markdown` 、富文本两种编辑模式,`Editor.md`、`Vditor`、`iceEditor`三种编辑器加持,自由选择、自由切换;
 - 图片、附件、科学公式、音视频、思维导图、流程图、Echart图表;
 - 文档排序、文档上级设置、文档模板插入;
 - 文档标签设置;

- **📖文档阅读**
 - 两栏式布局,三级目录层级显示,左侧文集大纲,右侧文档正文;
 - 文档阅读字体缩放、字体类型切换、日间夜间模式切换、页面社交分享、移动端阅读优化;
 - 文档 Markdown 文件下载;
 - 标签关系网络图;
 - 文档全文搜索;
 - 文档分享码分享;
 - 文档收藏;
 
- **其他特性**
 - 搜索引擎收录支持;
 - sitemap站点地图;
 - 无限用户限制;
 - 无限空间限制;

完整更新记录详见:[CHANGES.md](./CHANGES.md)

## 简明运行教程

### 1、安装依赖库
```
pip install -r requirements.txt
```

### 2、初始化数据库

在安装完所需的第三方库并配置好数据库信息之后,我们需要对数据库进行初始化。

在项目路径下打开命令行界面,运行如下命令生成数据库迁移:

```
python manage.py makemigrations 
```

运行如下命令执行数据库迁移:

```
python manage.py migrate
```
执行完毕之后,数据库就初始化完成了。

### 3、创建管理员账户
在初始化完数据库之后,需要创建一个管理员账户来管理整个MrDoc,在项目路径下打开命令行终端,运行如下命令:
```
python manage.py createsuperuser
```
按照提示输入用户名、电子邮箱地址和密码即可。

### 4、测试运行
在完成上述步骤之后,即可运行使用MrDoc。

在测试环境中,可以使用Django自带的服务器运行MrDoc,其命令为:

```
python manage.py runserver
```

## 部署工具

- [Docker 官方镜像](https://hub.docker.com/r/zmister/mrdoc)
- [Docker镜像 By jonnyan404 ](https://registry.hub.docker.com/r/jonnyan404/mrdoc-nginx)
- [Linux 一键部署脚本 By jonnyan404](https://gitee.com/jonnyan404/oh-my-mrdoc)
- [Windows 部署面板 By 小肥羊](https://gitee.com/debj031634/win-django)
- [VirtualBox/VmWare 虚拟机镜像 By 无名](https://gitee.com/nicktf/tinycore-mrdoc)

## 文档导入工具

- [觅思文档导入工具箱](https://gitee.com/zmister/mrdoc-import-toolbox)
 - 觅思文档导出的文集
 - 语雀知识库
 - 印象笔记
 - Joplin

## 其他工具

- [本地文档同步工具 By Atyin](https://gitee.com/atyin/mrdocTools)

## 交流

<p align="center">
<img src="https://doc.mrdoc.pro/media/202203/20220331121926_20220331122015390193.png" width="50%">
</p>

## 依赖

觅思文档基于以下开源项目进行开发,在此表示感谢:

- Python
- Django
- Jquery
- LayUI
- PearAdminLayui
- Editor.md
- Marked
- CodeMirror
- Echarts
- Viewer.js
- Sortable.js
- Vditor
- iceEditor

## 协议

<a href="./LICENSE">GPL-3.0</a>

开源版的使用者必须保留 MrDoc 和觅思文档相关版权标识,禁止对 MrDoc 和 觅思文档相关版权标识进行修改和删除。

如果违反,开发者保留对侵权者追究责任的权利。

其他相关协议亦可参考《[免责声明](https://gitee.com/zmister/MrDoc/blob/master/DISCLAIMER.md)》。

商业授权(专业版)请微信咨询:

<img src="https://doc.mrdoc.pro/media/202212/wechatwork_qrcode_20221201165203490192.png" width="200px" /></textarea>
<div class='loader-wrapper'>
<div class='ui inline mini active loader'></div>
</div></blob-markdown-renderer>
</div> <div class='file_line'></div> </div> <div class='hide lisence-content'> <div class='file_content code'> <div class='d-block lines mb-1 ml-3 mr-3 mt-1 white'> <div class='preformatted'>
 GNU GENERAL PUBLIC LICENSE
 Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

 Preamble

 The GNU General Public License is a free, copyleft license for
software and other kinds of works.

 The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.

 When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

 To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

 For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.

 Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

 For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

 Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

 Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

 The precise terms and conditions for copying, distribution and
modification follow.

 TERMS AND CONDITIONS

 0. Definitions.

 "This License" refers to version 3 of the GNU General Public License.

 "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

 "The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.

 To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

 A "covered work" means either the unmodified Program or a work based
on the Program.

 To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

 To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

 An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

 1. Source Code.

 The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.

 A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

 The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

 The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

 The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

 The Corresponding Source for a work in source code form is that
same work.

 2. Basic Permissions.

 All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

 You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

 Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.

 3. Protecting Users' Legal Rights From Anti-Circumvention Law.

 No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

 When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

 4. Conveying Verbatim Copies.

 You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

 You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

 5. Conveying Modified Source Versions.

 You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

 a) The work must carry prominent notices stating that you modified
 it, and giving a relevant date.

 b) The work must carry prominent notices stating that it is
 released under this License and any conditions added under section
 7. This requirement modifies the requirement in section 4 to
 "keep intact all notices".

 c) You must license the entire work, as a whole, under this
 License to anyone who comes into possession of a copy. This
 License will therefore apply, along with any applicable section 7
 additional terms, to the whole of the work, and all its parts,
 regardless of how they are packaged. This License gives no
 permission to license the work in any other way, but it does not
 invalidate such permission if you have separately received it.

 d) If the work has interactive user interfaces, each must display
 Appropriate Legal Notices; however, if the Program has interactive
 interfaces that do not display Appropriate Legal Notices, your
 work need not make them do so.

 A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

 6. Conveying Non-Source Forms.

 You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

 a) Convey the object code in, or embodied in, a physical product
 (including a physical distribution medium), accompanied by the
 Corresponding Source fixed on a durable physical medium
 customarily used for software interchange.

 b) Convey the object code in, or embodied in, a physical product
 (including a physical distribution medium), accompanied by a
 written offer, valid for at least three years and valid for as
 long as you offer spare parts or customer support for that product
 model, to give anyone who possesses the object code either (1) a
 copy of the Corresponding Source for all the software in the
 product that is covered by this License, on a durable physical
 medium customarily used for software interchange, for a price no
 more than your reasonable cost of physically performing this
 conveying of source, or (2) access to copy the
 Corresponding Source from a network server at no charge.

 c) Convey individual copies of the object code with a copy of the
 written offer to provide the Corresponding Source. This
 alternative is allowed only occasionally and noncommercially, and
 only if you received the object code with such an offer, in accord
 with subsection 6b.

 d) Convey the object code by offering access from a designated
 place (gratis or for a charge), and offer equivalent access to the
 Corresponding Source in the same way through the same place at no
 further charge. You need not require recipients to copy the
 Corresponding Source along with the object code. If the place to
 copy the object code is a network server, the Corresponding Source
 may be on a different server (operated by you or a third party)
 that supports equivalent copying facilities, provided you maintain
 clear directions next to the object code saying where to find the
 Corresponding Source. Regardless of what server hosts the
 Corresponding Source, you remain obligated to ensure that it is
 available for as long as needed to satisfy these requirements.

 e) Convey the object code using peer-to-peer transmission, provided
 you inform other peers where the object code and Corresponding
 Source of the work are being offered to the general public at no
 charge under subsection 6d.

 A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

 A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

 "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

 If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

 The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

 Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

 7. Additional Terms.

 "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

 When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

 Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

 a) Disclaiming warranty or limiting liability differently from the
 terms of sections 15 and 16 of this License; or

 b) Requiring preservation of specified reasonable legal notices or
 author attributions in that material or in the Appropriate Legal
 Notices displayed by works containing it; or

 c) Prohibiting misrepresentation of the origin of that material, or
 requiring that modified versions of such material be marked in
 reasonable ways as different from the original version; or

 d) Limiting the use for publicity purposes of names of licensors or
 authors of the material; or

 e) Declining to grant rights under trademark law for use of some
 trade names, trademarks, or service marks; or

 f) Requiring indemnification of licensors and authors of that
 material by anyone who conveys the material (or modified versions of
 it) with contractual assumptions of liability to the recipient, for
 any liability that these contractual assumptions directly impose on
 those licensors and authors.

 All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

 If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

 Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

 8. Termination.

 You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

 However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

 Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

 Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

 9. Acceptance Not Required for Having Copies.

 You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

 10. Automatic Licensing of Downstream Recipients.

 Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.

 An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

 You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

 11. Patents.

 A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".

 A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

 Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

 In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

 If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

 If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

 A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

 Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

 12. No Surrender of Others' Freedom.

 If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

 13. Use with the GNU Affero General Public License.

 Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

 14. Revised Versions of this License.

 The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

 Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

 If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

 Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

 15. Disclaimer of Warranty.

 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

 16. Limitation of Liability.

 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

 17. Interpretation of Sections 15 and 16.

 If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

 END OF TERMS AND CONDITIONS

 How to Apply These Terms to Your New Programs

 If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

 To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

 {one line to give the program's name and a brief idea of what it does.}
 Copyright (C) {year} {name of author}

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

 If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

 {project} Copyright (C) {year} {fullname}
 This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 This is free software, and you are welcome to redistribute it
 under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

 You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

 The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
</div></div> </div> </div> </div> </div> <script> "use strict"; if ($('.markdown-body').children("style").length != 0) { var i, array = $('.markdown-body').children("style"); array.first().attr('scoped',''); $.scoped(); } $('.appeal_message').removeClass('text-center') $(".file_title_readme").click(function(event) { $('.lisence-content').hide() $('.readme-content').show() $('.lisence-edit').hide() $('.readme-edit').show() $('.file_title_readme').addClass('active-title') $('.file_title_license').removeClass('active-title') }); $(".file_title_license").click(function(event) { $('.lisence-content').show() $('.readme-content').hide() $('.lisence-edit').show() $('.readme-edit').hide() $('.file_title_license').addClass('active-title') $('.file_title_readme').removeClass('active-title') }); try { if((gon.wait_fork!=undefined && gon.wait_fork==true) || (gon.wait_fetch!=undefined && gon.wait_fetch==true)){ $('.edit-blob').popup({content:"当前仓库正在后台处理中,暂时无法编辑", on: 'hover', delay: { show: 200, hide: 200 }}); $('.edit-blob').click(function(e){ e.preventDefault(); }) } }catch (error) {} $('.disabled-edit-readonly').popup({ content: "只读文件不可编辑", className: { popup: 'ui popup', }, position: 'bottom center', }) $('.disabled-edit-readonly, .disabled-edit-status').click(function() { return false }) $('.has_tooltip').popup({ position: 'top center' }); </script> <style> .txt-style { background: #FFF !important; padding: 0 !important; } .file_readme_title { padding-bottom: 0 !important; cursor: pointer; } .active-title { border-bottom: 2px solid #fe7300; } .preformatted { font-family: monospace; word-wrap: break-word; white-space: pre-wrap; word-break: keep-all; } .disabled-edit-readonly, .has_tooltip { color: #40485b !important; cursor: default !important; opacity: 0.3 !important; } </style> </div> <div class='project__footer-container'> <div class='actions'> <div class='item star-container'> <div class='unstar'> <a href="/login"><div class='circle'> <i class='iconfont icon-star-solid'></i> </div> </a><a class="content" href="/zmister/MrDoc/stargazers"><div class='title'> Starred </div> <div class='desc action-social-count'> 3.7K </div> </a></div> <div class='star'> <a href="/login"><div class='circle'> <i class='iconfont icon-star'></i> </div> </a><a class="content" href="/zmister/MrDoc/stargazers"><div class='title'> Star </div> <div class='desc action-social-count'> 3.7K </div> </a></div> </div> <div class='item fork-container'> <a href="/login"><div class='circle'> <i class='iconfont icon-fork'></i> </div> </a><a href="/zmister/MrDoc/members"><div class='content'> <div class='title'> Fork </div> <div class='desc'> 1.1K </div> </div> </a></div> <div class='item donate-container'> <div class='circle'> <i class='iconfont icon-donate'></i> </div> <div class='content'> <div class='title'>捐赠</div> <div class='desc'> 4 人次 </div> </div> <a class="donate-detail" href="javascript: void(0);">详情</a> </div> </div> <div class='project-donate-list hide'> <div class='title'>最近捐赠记录</div> <div class='container'></div> <a class="btn-load-more" href="javascript: void(0);">查看更多</a> <div class='tip-loading' style='display: none'> <div class='ui active mini inline loader'></div> 正在加载... </div> </div> </div> <script> var $donateModal = $('.project-donate-modal'); $('.donate-container').on('click', '.circle, .content', function () { $donateModal.modal('show'); }); </script> <script> (function() { var $btnLoad, $donateDetail, $donateList, $list, $tipLoading, isFirstLoaded, isLoading, loadDonates, page, setDonates; page = 0; isLoading = false; isFirstLoaded = false; $donateDetail = $('.donate-detail'); $donateList = $('.project-donate-list'); $list = $donateList.find('.container'); $btnLoad = $donateList.find('.btn-load-more'); $tipLoading = $donateList.find('.tip-loading'); setDonates = function(list) { var html, i, item, len; html = '<div>'; for (i = 0, len = list.length; i < len; i++) { item = list[i]; if (item.donator_avatar_url.indexOf('no_portrait.png') === 0) { item.donator_avatar_url = LetterAvatar(item.donator_name); } html += "<div class=\"item\">\n <span class=\"donate-info\">\n <img src=\"" + item.donator_avatar_url + "\" class=\"ui inline circular image\" alt=\"" + item.donator_name + "\" />\n </span>\n <div class=\"ui popup text-center\">\n <div class=\"header\">\n " + item.donator_name + "\n <span class=\"ui mini yellow circular label\">¥ " + item.money + "</span>\n </div>\n " + (item.message != null ? "<div class=\'content\'>" + item.message + "</div>" : '') + "\n </div>\n</div>"; } html += '</div>'; $list.append(html); return $list.find('.donate-info').popup({ inline: true, position: 'bottom center' }); }; loadDonates = function() { if (isLoading) { return; } page += 1; isLoading = true; $btnLoad.hide(); $tipLoading.show(); return $.getJSON('/zmister/MrDoc/donates.json', { page: page }, function(list) { setDonates(list); isLoading = false; isFirstLoaded = true; if (page * 12 < 4) { $btnLoad.show(); return $tipLoading.hide(); } else { $btnLoad.remove(); return $tipLoading.remove(); } }); }; $btnLoad.on('click', loadDonates); $donateDetail.on('click', function() { $donateList.toggleClass('hide'); if (!isFirstLoaded) { return loadDonates(); } }); }).call(this); </script> <script id='tree-item-context-menu-template' type='text/plain'> <div class='ui menu compact vertical tree-context'> <a class='btn-open-new-tab item tree-operation'> <i class='file outline icon'></i> 新标签打开 </a> <a class='btn-copy item tree-operation'> <i class='copy icon'></i> 复制 </a> <a class='btn-rename item tree-operation'> <i class='edit icon'></i> 重命名 </a> <a class='btn-delete item tree-operation'> <i class='trash icon'></i> 删除 </a> </div> </script> <script id='tree-item-submodule-context-menu-template' type='text/plain'> <div class='ui menu compact vertical tree-context'> <a class='btn-copy item tree-operation'> <i class='copy icon'></i> 复制 </a> <a class='btn-compact-edit item tree-operation submodule_item'> <i class='edit icon'></i> 编辑 </a> <a class='btn-submodule-delete item tree-operation submodule_item'> <i class='trash icon'></i> 删除 </a> </div> </script> <script src="/static/javascripts/file-icons.js"></script> <script> $(function() { $(".tree-list-item").each(function(){ $this = $(this) var path = $this.attr('data-path') var type = $this.attr('data-type') $icon = $this.find('i') if(type==='file'){ let iconClass=''; try { iconClass = FileIcons.getClassWithColor(path) || 'file-generic'; } catch (err) {} if(iconClass) $icon.attr('class', "file-icon-item iconfont icon-file ".concat(iconClass)); } }) var $createFolderForm = $('.create-folder-form'), $createFolderSubmitBtn = $('.create-folder-form .js-submit-btn') $folderPath = $('#new_folder_path'), $message = $('.create-folder-form .notice'), folders = [".github","MrDoc","app_admin","app_api","app_doc","captrue","config","locale","log","media","static","template"], folderReg = new RegExp(/\/+/); var INDEX_BEGIN_WITH_READONLY_DIR = 0 var gitGCModal = new GiteeModalHelper({ approveText: "确认", cancelText: "取消", okText: "确认", }) function checkFolder(folder) { var i, itemArr; if (folder == '') { return false; } for (i = 0; i< folders.length; i++) { itemArr = folders[i].split('/'); if (itemArr[0] == folder){ return true } } return false; } function createFolderShow () { $createFolderForm.show(); $folderPath.focus(); } $('.create-folder-form .cancel').click(function () { $createFolderForm.hide(); }) $folderPath.on('input', function (e) { if($(this).parent().hasClass('error')) { $message.removeClass('warn').html("<strong>提示:</strong> 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件"); $(this).parent().removeClass('error'); } $createFolderSubmitBtn.removeClass('disabled'); }) $createFolderForm.submit(function (e) { var value = $folderPath.val(); if (!folderReg.test(value) && !checkFolder(value) && value) { $('#new_file_path').val(value + '/.keep'); } else { $message.addClass('warn').html("文件夹名不为空,不含有字符(/)且不能与当前目录文件夹同名"); $folderPath.parent().addClass('error'); e.preventDefault(); } $createFolderSubmitBtn.addClass('disabled'); }) $('.create-folder').click(createFolderShow) $('#create-folder').click(createFolderShow); window.createFolderShow = createFolderShow; window.hasTreeContextMenu = false; var contextMenuTemplate = $('#tree-item-context-menu-template').html(); var submoduleContextMenuTemplate = $("#tree-item-submodule-context-menu-template").html(); if ("true" == "false" || "true" == "false" || "false" == "false") { return; } function createContextMenu($item, x, y) { if (hasTreeContextMenu) { $('.tree-context').remove(); hasTreeContextMenu = false; return; } hasTreeContextMenu = true; var isSubmodule = $item.hasClass('tree-item-submodule-name') var path = $item.parent().find('a').attr('href'); var $menu = isSubmodule ? $(submoduleContextMenuTemplate).appendTo('body') : $(contextMenuTemplate).appendTo('body'); var readonly = $item.attr('data-readonly') !== undefined var submoduleEditUrl = $item.closest('.tree-item').attr('edit_url') var submoduleDeleteUrl = $item.closest('.tree-item').attr('delete_url') var hasNormal = $item.closest('.tree-item')[0].hasAttribute('normal') if ($('.btn-readonly')[0]) { if (readonly) { $('.btn-readonly')[0].children[0].className = 'icon unlock' $('.btn-readonly')[0].lastChild.data = "取消只读" } else { $('.btn-readonly')[0].lastChild.data = "标记为只读" } } $menu.css({ left: x, top: y , 'min-width': '90px'}); $menu.find('.btn-open-new-tab').attr({ href: path, target: '_blank' }); window.Clipboard && new Clipboard('.btn-copy', { text: function () { return $item.text().trim(); } }); // submodule 菜单事件 // 编辑子模块 if (!hasNormal) { $menu.find('.btn-compact-edit').addClass('disabled') } $menu.find('.btn-compact-edit').on('click', function(event) { if (!hasNormal) { return } window.location.href = submoduleEditUrl }); // 删除子模块 $menu.find('.btn-submodule-delete').on('click', function(event) { removeSubmodule(submoduleDeleteUrl, $item) }); // 普通文件 菜单事件 $menu.find('.btn-rename').on('click', function(event) { rename($item.parent().attr('file_hex')); }); $menu.find('.btn-delete').on('click', function(event) { removeFile($item.parent().next().find('.ui.form').attr('path').replace(/\+/g, '%20'), $item.find('a').text()); }) $menu.find('.btn-readonly').on('click', function(event) { var obj = $item.parent().next().find('.ui.form').attr('path').replace(/\+/g, '%20') var readonly = $item.attr('data-readonly') !== undefined if (readonly) { removeReadonlyMark(obj, $item) } else { addReadonlyMark(obj, $item) } }) $menu.find('.btn-readonly-is-uncharged-enterprise').popup({ content: "仅付费企业版可使用文件只读功能", className: { popup: 'ui popup', }, position: 'bottom center' }) $menu.find('.btn-readonly-is-open-svn').popup({ content: "仓库已开启 SVN 支持,无法标记只读文件/目录", className: { popup: 'ui popup', }, position: 'bottom center' }) } // submodule 右键菜单事件 var editing = false $(document).on('click',function(event){ if (hasTreeContextMenu && event.button !== 2) { setTimeout(function () { $('.tree-context').remove(); hasTreeContextMenu = false; }, 200); } }) $('.tree-item').on('click',function(event){ if (hasTreeContextMenu) { event.preventDefault(); } }) function isReadonly(path) { if (!gon.readonlyItems) { return false } else { var item_path = getItemPath(path, 'folder') return isTreeItemReadonly(item_path, gon.readonlyItems) } } function isParentsReadonly(path) { var self_path = path.replace(/\/$/, '') var parentPathArray = self_path.split('/') if (parentPathArray.length < 2) { return false } parentPathArray.pop() var parentPath = parentPathArray.join('/') + '/' return isReadonly(parentPath) } // 删除只读标记 function removeReadonlyMark(path, $item) { var $icon = $($item.context.children[0]) var $parent = $item.parent('.tree-item') var type = $parent.data('type') var branch = $parent.data('branch') var readonly_item = $item.data('path') if (type !== 'file') { readonly_item += "/" } var confirmString = "\n <p>所属分支: <code class=\"readonly-branch\">".concat(htmlSafe(branch), "</code></p> <p>文件路径: <code class=\"readonly-path\">").concat(htmlSafe(readonly_item), "</code></p> <strong>确认取消分支上这个路径的只读标记?</strong>\n "); gitGCModal.confirm("取消只读", confirmString, function() { var parentsReadonly = isParentsReadonly(readonly_item) if (parentsReadonly) { return gitGCModal.alert('提示', '只读记录不存在,或父级目录为只读',function () { location.reload() }) } $.ajax({ url: "/zmister/MrDoc/readonly", type: 'DELETE', data: { branch: branch, path: readonly_item }, success: function(res) { if (res.code !== 0) { gitGCModal.alert("提示", res.msg, function() { location.reload(); }) }else { $parent.removeClass('readonly-item') if (gon.readonlyItems) { gon.readonlyItems.splice(gon.readonlyItems.indexOf(readonly_item), 1) } if (type === 'file') { $icon.removeClass('icon-file-readonly readonly-icon') $icon.addClass('icon-file') } else { $icon.removeClass('icon-folder-readonly readonly-icon') $icon.addClass('icon-folders') } $icon.popup('destroy') $item.removeAttr('data-readonly') location.reload(); } } }) }) } // 只读过滤 function isTreeItemReadonly(path, readonlyItems) { var item = readonlyItems.find(function(item) { if (item.slice(-1) === '/') { return path.indexOf(item) === INDEX_BEGIN_WITH_READONLY_DIR } else { return path === item } }) return item !== undefined } function getItemPath(path) { var path_type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'file'; return path_type === 'file' ? path : "".concat(path, "/"); } // 启用异步只读差异化的次数 var is_can_readonly = false // 异步对文件树进行只读差异化显示 function markTree() { $.ajax({ url: "/zmister/MrDoc/readonly", method: 'get', data: { "branch": "master" }, success:function(result) { var readonlyItems = result.readonly_items gon.readonlyItems = readonlyItems $(".tree-list-item").each(function(){ $this = $(this) var path = $this.attr('data-path') var type = $this.attr('data-type') var item_path = getItemPath(path, type) var readonly = isTreeItemReadonly(item_path, readonlyItems) $icon = $this.find('i') $parent = $this.parent('.tree-item') if (readonly) { $parent.addClass('readonly-item') $this.attr('data-readonly', '') $icon.attr('class', "iconfont icon-".concat(type, "-readonly readonly-icon")); $icon.attr('data-readonly', '') $icon.popup({ content: "只读", className : { popup: 'ui popup dark', }, position: 'top center' }) } else { var className = type === 'file' ? 'file' : 'folders' $this.removeAttr('data-readonly') $icon.attr('class', "iconfont icon-".concat(className)); $icon.removeAttr('data-readonly') } }) } }) } // 若已开启只读功能,对目录进行只读差异化标记 if (is_can_readonly) { markTree() } // 添加只读标记 function addReadonlyMark(path, $item) { var $icon = $($item.context.children[0]) var $parent = $item.parent('.tree-item') var type = $parent.data('type') var branch = $parent.data('branch') var readonly_item = $item.data('path') if (type !== 'file') { readonly_item += "/" } var confirmString = "\n <p>所属分支: <code class=\"readonly-branch\">".concat(htmlSafe(branch), "</code></p> <p>文件路径: <code class=\"readonly-path\">").concat(htmlSafe(readonly_item), "</code></p> <strong>确认将分支上的这个路径标记为只读?</strong>\n "); gitGCModal.confirm("标记只读", confirmString,function (){ $.ajax({ url: "/zmister/MrDoc/readonly", type: 'POST', data: { branch: branch, path: readonly_item, }, success: function(res) { if (res.code !== 0) { gitGCModal.alert("提示", res.msg,function (){ location.reload(); }) } else { // 之前未开启只读功能 if (!is_can_readonly) { is_can_readonly = true return markTree() } $parent.addClass('readonly-item') var existReadonlyItems = gon.readonlyItems || [] existReadonlyItems.push(readonly_item) gon.readonlyItems = existReadonlyItems $icon.popup({ content: "只读", className : { popup: 'ui popup dark', }, position: 'top center' }) if (type === 'file') { $icon.removeClass('icon-file') $icon.addClass('icon-file-readonly readonly-icon') } else { $icon.removeClass('icon-folders') $icon.addClass('icon-folder-readonly readonly-icon') } $item.attr('data-readonly', '') location.reload(); } } }) }) } function removeFile(path, file_name) { var file_name = file_name || path var content = "确定要删除 %{name} 吗?".replace('%{name}', htmlSafe(file_name)); gitGCModal.confirm("删除", content, function() { $.ajax({ type: "DELETE", dataType: "JSON", url: "/zmister/MrDoc/delete/" + path, success: function(res) { if (res.status != 1) { var alert_message = res.message || "删除失败" return gitGCModal.alert("提示", alert_message) } if ($('.tree-item-file-name').length == 2) { window.location.href = '/' + gon.user_project; if(file_name.toUpperCase()==='LICENSE'){ window.location.reload(); } } else { window.location.href = window.location.pathname; if(file_name.toUpperCase()==='LICENSE'){ window.location.reload(); } } } }); }) } // 删除子模块 function removeSubmodule(deleteUrl, $item) { if (!deleteUrl) return var file_name = $item.text().trim() var content = "此操作无法恢复,确定要删除子模块%{name}?".replace('%{name}', htmlSafe(file_name)); new GiteeModalHelper({ approveText: "删除并提交推送", cancelText: "取消", okText: "删除并提交推送", }).confirm("删除", content, function() { $.ajax({ type: "DELETE", dataType: "JSON", url: deleteUrl, success: function(res) { if (res.status == 200) { $item.closest('.row.tree-item').remove(); window.location.reload(); } else { Flash.error(res.message, 5000) } }, error: function (err) { err.responseJSON && Flash.error(err.responseJSON.message); }, }); }) } function rename(file_hex) { $(".row.tree-item").show(); $(".tree-item-rename").hide(); if($("."+file_hex).is(':hidden') == true) return; $("."+file_hex).hide(); var _t = $(".rename-"+file_hex); src = _t.attr('src_text') if(src==undefined){ newName = _t.find("[name='new_filename']").val() _t.attr('src_text',newName) }else{ _t.find("[name='new_filename']").val(_t.attr('src_text')) } $(".rename-"+file_hex).css("display",""); } setTimeout(function(){ $(".popup-save").click(function(){ form = $(this).parents(".ui.form") file_hex = $(this).parents(".row.tree-item").attr("file_hex"); new_filename = $.trim(form.find("[name='new_filename']").val()) overwrite = false $('.tree-item-file-name').find('a').each(function(a){ title = $(this).attr('title'); if(title != undefined){ if (title.split('/')[0] == new_filename) { overwrite = true; } } }); if(overwrite){ form.find("[name='new_filename']").focus(); gitGCModal.alert("提示", "存在相同的文件名,请修改后重试") return; } $.ajax({ type: 'POST', url: "/zmister/MrDoc/rename/"+ form.attr('path').replace(/\+/g, '%20'), data: { new_filename: new_filename }, success: function(o){ if(o.status == 1){ href = window.location.href.split('?')[0] window.location.href = href; }else { var alert_message = o.message || "重命名失败" gitGCModal.alert("提示", alert_message) } }, dataType: "json" }); }) $(".popup-close").click(function(){ $(".row.tree-item").show(); $(".tree-item-rename").hide(); }) $('.tree-item-file-name, .tree-item-submodule-name').each(function() { var $this = $(this); if (typeof $this.parent().attr('file_hex') === 'undefined') { return; } $this.on('contextmenu', function(event) { event.preventDefault(); createContextMenu($this, event.pageX, event.pageY); }) }) },1000) }) </script> <style> .readonly-item { background-color: #FBFBFB !important; } .readonly-path,.readonly-branch { display: block; white-space: normal; word-break: break-word; line-height: 1.8; margin-top: 1em; } .btn-readonly-is-uncharged-enterprise, .btn-readonly-is-open-svn { background-color: #f5f5f5 !important; color: #757575 !important; } </style> <div class='complaint'> <div class='ui modal small form' id='landing-comments-complaint-modal'> <i class='iconfont icon-close close'></i> <div class='header'> 举报 </div> <div class='content'> <div class='appeal-success-tip hide'> <i class='iconfont icon-ic_msg_success'></i> <div class='appeal-success-text'> 举报成功 </div> <span> 我们将于2个工作日内通过站内信反馈结果给你! </span> </div> <div class='appeal-tip'> 请认真填写举报原因,尽可能描述详细。 </div> <div class='ui form appeal-form'> <div class='inline field'> <label class='left-part appeal-type-wrap'> 举报类型 </label> <div class='ui dropdown selection' id='appeal-comments-types'> <div class='text default'> 请选择举报类型 </div> <i class='dropdown icon'></i> <div class='menu'></div> </div> </div> <div class='inline field'> <label class='left-part'> 举报原因 </label> <textarea class='appeal-reason' id='appeal-comment-reason' name='msg' placeholder='请说明举报原因' rows='3'></textarea> </div> <div class='ui message callback-msg hide'></div> <div class='ui small error text message exceeded-size-tip'></div> </div> </div> <div class='actions'> <div class='ui button blank cancel'> 取消 </div> <div class='ui orange icon button disabled ok' id='complaint-comment-confirm'> 发送 </div> </div> </div> <script> var $complaintCommentsModal = $('#landing-comments-complaint-modal'), $complainCommentType = $complaintCommentsModal.find('#appeal-comments-types'), $complaintModalTip = $complaintCommentsModal.find('.callback-msg'), $complaintCommentsContent = $complaintCommentsModal.find('.appeal-reason'), $complaintCommentBtn = $complaintCommentsModal.find('#complaint-comment-confirm'), complaintSending = false, initedCommentsType = false; function initCommentsTypeList() { if (!initedCommentsType) { $.ajax({ url: "/appeals/fetch_types", method: 'get', data: {'type': 'comment'}, success: function (data) { var result = ''; for (var i = 0; i < data.length; i++) { result = result + "<div class='item' data-value='" + data[i].id + "'>" + data[i].name + "</div>"; } $complainCommentType.find('.menu').html(result); } }); $complainCommentType.dropdown({showOnFocus: false}); initedCommentsType = true; } } $complainCommentType.on('click', function() { $complaintCommentsModal.modal({ autofocus: false, onApprove: function() { return false; }, onHidden: function() { restoreCommonentDefault(); } }).modal('show'); }); $complaintCommentsContent.on('change keyup', function(e) { var content = $(this).val(); if ($.trim(content).length > 0 && $complainCommentType.dropdown('get value').length > 0 ) { $complaintCommentBtn.removeClass('disabled'); return; } $complaintCommentBtn.addClass('disabled'); }); $complainCommentType.dropdown({ showOnFocus: false, onChange: function(value, text, $selectedItem) { if (value.length > 0 && $.trim($complaintCommentsContent.val()).length > 0) { $complaintCommentBtn.removeClass('disabled'); return } $complaintCommentBtn.addClass('disabled'); } }); function restoreCommonentDefault() { $complainCommentType.dropdown('restore defaults'); $complaintCommentsContent.val(''); $('.exceeded-size-tip').text('').hide(); $complaintModalTip.text('').hide(); setTimeout(function() { setCommentSendTip(false); }, 1500); } $complaintCommentBtn.on('click',function(e){ var reason = $complaintCommentsContent.val(); var appealableId = $('#landing-comments-complaint-modal').attr('data-id'); if (complaintSending) { return; } var appealType = $complainCommentType.dropdown('get value'); var formData = new FormData(); formData.append('appeal_type_id', appealType); formData.append('reason', reason); formData.append('appeal_type','Note'); formData.append('target_id',appealableId); $.ajax({ type: 'POST', url: "/appeals", cache: false, contentType: false, processData: false, data: formData, beforeSend: function() { setCommentSendStatus(true); }, success: function(res) { if (res.status == 200) { setCommentSendTip(true); setTimeout(function() { $complaintCommentsModal.modal('hide'); restoreCommonentDefault(); }, 3000); } setCommentSendStatus(false); }, error: function(err) { showCommonTips(err.responseJSON.message, 'error'); setCommentSendStatus(false); } }) }); function showCommonTips(text, type) { $complaintModalTip.text(text).show(); if (type == 'error') { $complaintModalTip.removeClass('success').addClass('error'); } else { $complaintModalTip.removeClass('error').addClass('success'); } } function setCommentSendStatus(value) { complaintSending = value; if (complaintSending) { $complaintCommentBtn.addClass('loading'); $complaintCommentsContent.attr('readonly', true); $complainCommentType.attr('readonly', true); } else { $complaintCommentBtn.removeClass('loading'); $complaintCommentsContent.attr('readonly', false); $complainCommentType.attr('readonly', false); } } function setCommentSendTip(value) { if (value) { $('.appeal-success-tip').removeClass('hide'); $('.appeal-tip').addClass('hide'); $('.appeal-form').addClass('hide'); $('#landing-comments-complaint-modal .actions').addClass('hide'); } else { $('.appeal-success-tip').addClass('hide'); $('.appeal-tip').removeClass('hide'); $('.appeal-form').removeClass('hide'); $('#landing-comments-complaint-modal .actions').removeClass('hide'); } } </script> <div class='ui small modal' id='misjudgment_appeal_modal'> <i class='close icon'></i> <div class='header dividing ui'> 误判申诉 </div> <div class='content'> <p>此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。</p> <p>如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。</p> <div class='buttons'> <div class='ui button blank cancel'>取消</div> <div class='ui button orange submit'>提交</div> </div> </div> </div> <style> #misjudgment_appeal_modal .buttons { float: right; margin-top: 30px; margin-bottom: 20px; } #misjudgment_appeal_modal .buttons .cancel { margin-right: 20px; } </style> <script> var $misjudgmentAppealModal = $('#misjudgment_appeal_modal'); $('.cancel').on('click',function(){ $misjudgmentAppealModal.modal('hide'); }); var $jsSubmitAppeal = $misjudgmentAppealModal.find('.submit') $jsSubmitAppeal.on('click', function(e) { e.preventDefault(); $(this).addClass('loading').addClass('disabled'); var type = $(this).attr('data-type'); var id = $(this).attr('data-id'); var projectId = $(this).attr('data-project-id'); var appealType = $(this).attr('data-appeal-type'); $.ajax({ type: "PUT", url: "/misjudgment_appeal", data: { type: type, id: id, project_id: projectId, appeal_type: appealType }, success: function(data) { Flash.info('提交成功'); $jsSubmitAppeal.removeClass('loading'); $misjudgmentAppealModal.modal('hide'); location.reload() }, error: function(e) { Flash.error('提交失败:'+e.responseText); $jsSubmitAppeal.removeClass('loading').removeClass('disabled'); location.reload() } }); }) </script> </div> <script> "use strict"; $('.js-check-star').checkbox('set unchecked') </script> </div> <script> (function() { $(function() { Tree.init(); return TreeCommentActions.init(); }); }).call(this); </script> </div> </div> <div class='four wide column' style=''> <div class='project__right-side'> <div class='side-item intro'> <div class='header'> <h4>简介</h4> </div> <div class='content'> <span class='git-project-desc-text'>MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步</span> <a class='hide spread' href='javascript:void(0);'> 展开 <i class='caret down icon'></i> </a> <a class='retract hide' href='javascript:void(0);'> 收起 <i class='caret up icon'></i> </a> <div class='intro-list'> <div class='d-flex d-flex-between dropdown item js-project-label_show label-list-line-feed project-label-list ui' data-labels='[{"id":328,"name":"Markdown","related_name":"Markdown","author_id":1,"ident":"Markdown","label_type":1,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-01T20:10:55+08:00","updated_at":"2021-07-01T20:10:55+08:00"},{"id":7,"name":"Python","related_name":"Python","author_id":1,"ident":"Python","label_type":1,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-01T20:10:53+08:00","updated_at":"2021-07-01T20:10:53+08:00"},{"id":3146,"name":"在线文档系统","related_name":"在线文档系统","author_id":1703473,"ident":"在线文档系统","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-04T09:46:47+08:00","updated_at":"2021-08-04T09:46:47+08:00"},{"id":3147,"name":"知识库","related_name":"知识库","author_id":1703473,"ident":"知识库","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-04T09:46:48+08:00","updated_at":"2021-08-04T09:46:48+08:00"},{"id":3148,"name":"云笔记","related_name":"云笔记","author_id":1703473,"ident":"云笔记","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-04T09:46:48+08:00","updated_at":"2021-08-04T09:46:48+08:00"}]' data-url='/zmister/MrDoc/update_description'> <div class='mixed-label'> <a title="Markdown" class="project-label-item-box" target="_blank" href="/explore/topic/Markdown"><div class='project-label-item'>Markdown</div> </a><a title="Python" class="project-label-item-box" target="_blank" href="/explore/topic/Python"><div class='project-label-item'>Python</div> </a><a title="在线文档系统" class="project-label-item-box" target="_blank" href="/explore/topic/%E5%9C%A8%E7%BA%BF%E6%96%87%E6%A1%A3%E7%B3%BB%E7%BB%9F"><div class='project-label-item'>在线文档系统</div> </a><a title="知识库" class="project-label-item-box" target="_blank" href="/explore/topic/%E7%9F%A5%E8%AF%86%E5%BA%93"><div class='project-label-item'>知识库</div> </a><a title="云笔记" class="project-label-item-box" target="_blank" href="/explore/topic/%E4%BA%91%E7%AC%94%E8%AE%B0"><div class='project-label-item'>云笔记</div> </a></div> <div class='default'>暂无标签</div> </div> <div class='item'> <i class='iconfont icon-link'></i> <span class='git-project-homepage'> <a rel="nofollow" id="homepage" target="_blank" href="https://gitee.com/link?target=https%3A%2F%2Fmrdoc.pro%2F">https://mrdoc.pro/</a> </span> </div> <div class='item'> <i class='iconfont icon-tag-program'></i> <span class='summary-languages'> Python <span class='text-muted'> 等 5 种语言 <i class='icon dropdown'></i> </span> </span> <div class='ui popup summary-languages-popup'> <div class='row'> <div class='lang'> <a href="/explore/all?lang=JavaScript">JavaScript</a> </div> <div class='lang-bar'> <div class='bar' style='width: 85.0%;'></div> </div> <a class="percentage" href="/explore/all?lang=JavaScript">85.0%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=CSS">CSS</a> </div> <div class='lang-bar'> <div class='bar' style='width: 8.2%;'></div> </div> <a class="percentage" href="/explore/all?lang=CSS">8.2%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=HTML">HTML</a> </div> <div class='lang-bar'> <div class='bar' style='width: 4.0%;'></div> </div> <a class="percentage" href="/explore/all?lang=HTML">4.0%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=Python">Python</a> </div> <div class='lang-bar'> <div class='bar' style='width: 2.8%;'></div> </div> <a class="percentage" href="/explore/all?lang=Python">2.8%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=Other">Other</a> </div> <div class='lang-bar'> <div class='bar' style='width: 0.0%;'></div> </div> <a class="percentage" href="/explore/all?lang=Other">0.0%</a> </div> </div> </div> <div class='item box-licence'> <i class='iconfont icon-licence'></i> <span id='license-popup'> GPL-3.0 </span> <div class='ui popup dark'>使用 GPL-3.0 开源许可协议</div> </div> <!-- - page = @project.page --> <!-- - if page&.status? --> <!-- .item --> <!-- %i.iconfont.icon-giteepage --> <!-- Pages: --> <!-- = link_to page.domain_url, page.domain_url, target: '_blank' --> </div> </div> <div class='content intro-form'> <div class='ui small input'> <textarea name='project[description]' placeholder='描述' rows='5'></textarea> </div> <div class='ui small input'> <input data-regex-value='(^$)|(^(http|https):\/\/(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).*)|(^(http|https):\/\/[a-zA-Z0-9]+([_\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,10}(:[0-9]{1,10})?(\?.*)?(\/.*)?$)' name='project[homepage]' placeholder='主页(eg: https://gitee.com)' type='text'> </div> <button class='ui orange button mt-1 btn-save'> 保存更改 </button> <div class='ui blank button btn-cancel-edit'> 取消 </div> </div> </div> <div class='side-item release'> <div class='header'> <h4> 发行版 <span class='text-muted'> (14) </span> </h4> <a class="ui link button pull-right" href="/zmister/MrDoc/releases">全部</a> </div> <div class='content ml-3'> <i class='iconfont icon-release'></i> <div class='desc'> <a href="/zmister/MrDoc/releases/tag/v0.9.5">v0.9.5</a> </div> <span class='timeago' datetime='2025-02-17 11:29' title='2025-02-17 11:29:55 +0800'></span> </div> </div> <div class='side-item compass'> <div class='header mb-1 d-align-center'> <h4 class='limit-length compass-label mr-1'></h4> <a class="ui link button compass-qa" href="https://compass.gitee.com/zh/docs/dimensions-define"><i class='iconfont icon-help-circle'></i> </a></div> <div class='content'> <div class='compass-echart-container'> <div data-url='/zmister/MrDoc/compass/chart_data' id='compass-metrics'> <div class='wrap'></div> <div class='ui popup radar-popup'> <h4 class='title'>开源评估指数源自 OSS-Compass 评估体系,评估体系围绕以下三个维度对项目展开评估:</h4> <div class='project-radar-list'> <div class='descript-contianer'> <div class='descript-title'> <p class='mb-1'>1. 开源生态</p> <ul class='mb-1 mt-1'> <li>生产力:来评估开源项目输出软件制品和开源价值的能力。</li> <li>创新力:用于评估开源软件及其生态系统的多样化程度。</li> <li>稳健性:用于评估开源项目面对多变的发展环境,抵御内外干扰并自我恢复的能力。</li> </ul> <p>2. 协作、人、软件</p> <ul> <li>协作:代表了开源开发行为中协作的程度和深度。</li> <li>人:观察开源项目核心人员在开源项目中的影响力,并通过第三方视角考察用户和开发者对开源项目的评价。</li> <li>软件:从开源项目对外输出的制品评估其价值最终落脚点。也是开源评估最“古老”的主流方向之一“开源软件” 的具体表现。</li> </ul> <p>3. 评估模型</p> <ul> 基于“开源生态”与“协作、人、软件”的维度,找到与该目标直接或间接相关的可量化指标,对开源项目健康与生态进行量化评估,最终形成开源评估指数。 </ul> </div> </div> </div> <div class='finaltime'></div> </div> <div class='legend-box ml-1'> <div class='dimension d-flex'></div> <div class='compass-type d-flex'></div> </div> </div> </div> <script src="/static/javascripts/echarts.min.js"></script> <script src="/static/javascripts/echarts-gl.min.js"></script> <script src="https://cn-assets.gitee.com/assets/skill_radar/rep_compass_chart-a170f1ecfff8cd448229c0a3b82b074a.js"></script> </div> </div> <div class='side-item contrib' data-url='/zmister/MrDoc/contributors_count?ref=master' id='contributor'> <div class='header'> <h4> 贡献者 <span class='text-muted' id='contributor-count'></span> </h4> <a class="ui link button pull-right" href="/zmister/MrDoc/contributors?ref=master">全部</a> </div> <div class='content' id='contributor-list'></div> <div class='ui active centered inline loader' id='contributor-loader'></div> </div> <div class='side-item events' data-url='/zmister/MrDoc/events.json' id='proj-events'> <div class='header'> <h4>近期动态</h4> </div> <div class='content'> <div class='ui comments' id='event-list'></div> <a class="loadmore hide" href="javascript:void(0);">加载更多 <i class='icon dropdown'></i> </a><center> <div class='text-muted nomore hide'>不能加载更多了</div> <div class='ui inline loader active'></div> </center> </div> </div> </div> <div class='ui modal tiny' id='edit-project-description'> <i class='iconfont icon-close close'></i> <div class='header'>编辑仓库简介</div> <div class='content'> <div class='item mb-2'> <div class='title label'>简介内容</div> <div class='ui small input'> <textarea maxlength='200' name='project[description]' placeholder='描述' rows='5'>MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步</textarea> </div> </div> <div class='item mb-2'> <div class='title label'>主页</div> <div class='ui small input'> <input data-regex-value='(^$)|(^(http|https):\/\/(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).*)|(^(http|https):\/\/[a-zA-Z0-9]+([_\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,10}(:[0-9]{1,10})?(\?.*)?(\/.*)?$)' name='project[homepage]' placeholder='主页(eg: https://gitee.com)' type='text' value='https://mrdoc.pro/'> </div> </div> </div> <div class='actions'> <button class='ui button blank cancel'>取消</button> <button class='ui button orange btn-save'>保存更改</button> </div> </div> <style> #license-popup { color: #005980; cursor: pointer; } </style> <script> window.gon.projectRightSide = { homepage: "https://mrdoc.pro/", description: "MrDoc觅思文档,适合于个人和中小型团队的在线文档、知识库管理私有化部署方案,全面支持跨平台(Windows、macOS、Linux)和跨终端(Web、PC、手机)同步", url: '/zmister/MrDoc/update_description', i18n: { invalidHomepage: '不是有效的 http 地址', descriptionLimitExceeded: '简介长度不得超过%{limit}个字符', noDescription: '暂无描述', noPermission: '无权限操作!', requestError: '修改发生错误,请稍后重试!' } } window.gon.cloneArrSelectedLabel = [{"id":328,"name":"Markdown","related_name":"Markdown","author_id":1,"ident":"Markdown","label_type":1,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-01T20:10:55+08:00","updated_at":"2021-07-01T20:10:55+08:00"},{"id":7,"name":"Python","related_name":"Python","author_id":1,"ident":"Python","label_type":1,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-01T20:10:53+08:00","updated_at":"2021-07-01T20:10:53+08:00"},{"id":3146,"name":"在线文档系统","related_name":"在线文档系统","author_id":1703473,"ident":"在线文档系统","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-04T09:46:47+08:00","updated_at":"2021-08-04T09:46:47+08:00"},{"id":3147,"name":"知识库","related_name":"知识库","author_id":1703473,"ident":"知识库","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-04T09:46:48+08:00","updated_at":"2021-08-04T09:46:48+08:00"},{"id":3148,"name":"云笔记","related_name":"云笔记","author_id":1703473,"ident":"云笔记","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-04T09:46:48+08:00","updated_at":"2021-08-04T09:46:48+08:00"}] || [] $(function () { var $editModal = $('#edit-project-description') $editModal.modal({ onShow: function () { window.globalUtils.getFocus($editModal.find('textarea')) } }) $('.project__right-side').on('click', '.header .btn-edit', function () { $editModal.modal('show') }) $('#license-popup').popup({ position: 'bottom center', lastResort: 'bottom center' }) $('.js-project-label_show').projectLabel({ i18n: { empty: "标签名不能为空", verify: "标签名只允许包含中文、字母、数字或者中划线(-),不能以中划线开头,且长度少于35个字符", max: "最多选择 5 个标签" } }) }) </script> </div> <div class='project-right-side-contaner' id='code-parsing'> <div class='d-flex-between mb-2'> <div class='title fs-16 d-align-center'> <img class='mr-1' height='32' src='/static/images/mjc_icon@2x.png' width='32'> <span class='ai-file-name'>马建仓 AI 助手</span> </div> <div> <i class='iconfont icon-close close gitee-icon-close'></i> </div> </div> <div class='code-parsing-content'> <div class='sub_title'></div> <div class='markdown-body'></div> <div class='bottom-content'> <div class='js-code-parsing-img'></div> <div class='ai_code_btns_simple'> <div class='ai_code_btns_simple_container'> <div class='mr-1 test-more'>尝试更多</div> <div class='btn_box' data-text='代码解读' data-value='parsing'> <div class='btn_box_title'>代码解读</div> </div> <div class='btn_box' data-text='代码找茬' data-value='analysis'> <div class='btn_box_title'>代码找茬</div> </div> <div class='btn_box' data-text='代码优化' data-value='optimize'> <div class='btn_box_title'>代码优化</div> </div> </div> </div> </div> </div> <div class='skeleton'> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line4'></div> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line4'></div> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line4'></div> </div> <div class='resize-handle'> <div class='resize-handle-line'></div> </div> <script src="/static/javascripts/markdown-it.min.js"></script> <script src="https://cn-assets.gitee.com/assets/ai_code_parsing/app-667254dc80e793cb047ec2e07574f422.js"></script> <script> $(function() { var maxWidthPercentage = 0.5; $("#code-parsing").resizable({ handles: 'e, w', // 通过左边调整大小 minWidth: 350, // 设置 代码解析框 的最小宽度 resize: function(event, ui) { var parentWidth = $(this).parent().width(); var newWidthDiv2 = ui.size.width; var newWidthDiv1 = parentWidth - newWidthDiv2; // 计算最大宽度 var maxWidthDiv2 = parentWidth * maxWidthPercentage; // 确保 代码解析框 不超过最大宽度 newWidthDiv2 = Math.min(newWidthDiv2, maxWidthDiv2); // 确保 文件详情 至少有最小宽度 newWidthDiv1 = Math.max(parentWidth - newWidthDiv2, 750); var percentageCode = (newWidthDiv2 / parentWidth) * 100; var percentageProject = (newWidthDiv1 / parentWidth) * 100; $('#code-parsing').css('width',percentageCode+"%") $('.git-project-content-wrapper').find('#sixteen').attr('style', 'width: ' + percentageProject + '% !important;'); $('.right-wrapper').attr('style', 'width: ' + percentageProject + '% !important;'); $('.project-conter-container').attr('style', 'width: ' + percentageProject + '% !important;'); } }); }) </script> </div> </div> </div> <style> .team-member-checkbox .ui.radio.checkbox.checked label:after { top: 7px !important; } </style> <script> function scrollToReadmeBox() { var readmeBox = document.getElementById('git-readme'); if (readmeBox) { const topPos = readmeBox.offsetTop; window.scrollTo({ top: topPos, behavior: "smooth" }); } } $(".box-licence").click(function(event) { $('.lisence-content').show() $('.lisence-edit').show() $('.readme-content').hide() $('.readme-edit').hide() $('#git-readme').removeClass('unshow') $('.file_title_license').addClass('active-title') $('.file_title_readme').removeClass('active-title') scrollToReadmeBox() }); // 防止二次挂载 if (false) { window.gon.tree_left_side_loaded = true; } </script> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/assets/markdown_preview-001478f1b12f2725f1b1f76f36b9ce4e.css" /> <script src="https://cn-assets.gitee.com/assets/markdown_preview-772822b3442a45aaf94af83c38fdbaf4.js"></script> <script src="https://cn-assets.gitee.com/webpacks/markdown_render-13d3d4c9beaea8f7006b.bundle.js" defer="defer"></script> </div> <script> (function() { var donateModal; Gitee.modalHelper = new GiteeModalHelper({ alertText: '提示', okText: '确定' }); donateModal = new ProjectDonateModal({ el: '#project-donate-modal', alipayUrl: '/zmister/MrDoc/alipay', wepayUrl: '/zmister/MrDoc/wepay', nameIsBlank: '名称不能为空', nameTooLong: '名称过长(最多为 36 个字符)', modalHelper: Gitee.modalHelper }); if (null === 'true') { donateModal.show(); } $('#project-donate').on('click', function() { return donateModal.show(); }); }).call(this); </script> <script> Tree.initHighlightTheme('white') </script> </div> <div class='gitee-project-extension'> <div class='extension lang'>Python</div> <div class='extension public'>1</div> <div class='extension https'>https://gitee.com/zmister/MrDoc.git</div> <div class='extension ssh'>git@gitee.com:zmister/MrDoc.git</div> <div class='extension namespace'>zmister</div> <div class='extension repo'>MrDoc</div> <div class='extension name'>MrDoc</div> <div class='extension branch'>master</div> </div> <script> $(function() { GitLab.GfmAutoComplete.dataSource = "/zmister/MrDoc/autocomplete_sources" GitLab.GfmAutoComplete.Emoji.assetBase = '/assets/emoji' GitLab.GfmAutoComplete.setup(); }); </script> <footer id='git-footer-main'> <div class='ui container'> <div class='logo-row'> <a href="https://gitee.com"><img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='logo-img' src='/static/images/logo-black.svg?t=158106666'> </a></div> <div class='name-important'> 深圳市奥思网络科技有限公司版权所有 </div> <div class='ui two column grid d-flex-center'> <div class='eight wide column git-footer-left'> <div class='ui four column grid' id='footer-left'> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/all-about-git">Git 大全</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://help.gitee.com/learn-Git-Branching/">Git 命令学习</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://copycat.gitee.com/">CopyCat 代码克隆检测</a> </div> <div class='item'> <a class="item" href="/appclient">APP与插件下载</a> </div> </div> </div> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/gitee_reward">Gitee Reward</a> </div> <div class='item'> <a class="item" href="/gitee-stars">Gitee 封面人物</a> </div> <div class='item'> <a class="item" href="/gvp">GVP 项目</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://blog.gitee.com/">Gitee 博客</a> </div> <div class='item'> <a class="item" href="/enterprises#nonprofit-plan">Gitee 公益计划</a> </div> <div class='item'> <a class="item" href="https://gitee.com/features/gitee-go">Gitee 持续集成</a> </div> </div> </div> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/api/v5/swagger">OpenAPI</a> </div> <div class='item'> <a class="item" href="https://help.gitee.com">帮助文档</a> </div> <div class='item'> <a class="item" href="/self_services">在线自助服务</a> </div> <div class='item'> <a class="item" href="/help/articles/4378">更新日志</a> </div> </div> </div> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/about_us">关于我们</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://www.oschina.net/news/131099/oschina-hiring">加入我们</a> </div> <div class='item'> <a class="item" href="/terms">使用条款</a> </div> <div class='item'> <a class="item" href="/oschina/git-osc/issues">意见建议</a> </div> <div class='item'> <a class="item" href="/links.html">合作伙伴</a> </div> </div> </div> </div> </div> <div class='eight wide column right aligned followus git-footer-right'> <div class='qrcode mr-1'> <div class='qrcode-box'> <img alt="技术交流QQ群" src="https://cn-assets.gitee.com/assets/contact_qr-5e2c2a8da453396590e56a545bce4974.jpg" /> </div> <p class='mt-1 mini_app-text'>技术交流QQ群</p> </div> <div class='qrcode'> <div class='qrcode-box'> <img alt="微信服务号" class="weixin-qr" src="https://cn-assets.gitee.com/assets/qrcode-weixin@2x-b74cc97a2ea80123ea53a737f709836d.png" /> </div> <p class='mt-1 weixin-text'>微信服务号</p> </div> <div class='phone-and-qq column'> <div class='ui list official-support-container'> <div class='item'></div> <div class='item mail-and-zhihu'> <a rel="nofollow" href="mailto: client@oschina.cn"><i class='iconfont icon-msg-mail'></i> <span id='git-footer-email'>client#oschina.cn</span> </a></div> <div class='item tel'> <a> <i class='iconfont icon-tel'></i> <span>企业版在线使用:400-606-0201</span> </a> </div> <div class='item tel'> <a class='d-flex'> <i class='iconfont icon-tel mt-05 mr-05'></i> <span>专业版私有部署:</span> <div> <div>13670252304</div> <div>13352947997</div> </div> </a> </div> </div> </div> </div> </div> </div> <div class='bottombar'> <div class='ui container'> <div class='ui d-flex d-flex-between'> <div class='seven wide column partner d-flex'> <div class='open-atom d-flex-center'> <img class="logo-openatom mr-1" alt="开放原子开源基金会" src="https://cn-assets.gitee.com/assets/logo-openatom-d083391cc8a54e283529f3fc11cc38ca.svg" /> <a target="_blank" rel="nofollow" href="https://www.openatom.org/">开放原子开源基金会</a> <div class='sub-title ml-1'>合作代码托管平台</div> </div> <div class='report-12377 d-flex-center ml-3'> <img class="report-12377__logo mr-1" alt="违法和不良信息举报中心" src="https://cn-assets.gitee.com/assets/12377@2x-1aa42ed2d2256f82a61ecf57be1ec244.png" /> <a target="_blank" rel="nofollow" href="https://12377.cn">违法和不良信息举报中心</a> </div> <div class='copyright ml-3'> <a rel="nofollow" href="http://beian.miit.gov.cn/">粤ICP备12009483号</a> </div> </div> <div class='nine wide column right aligned'> <i class='icon world'></i> <a href="/language/zh-CN">简 体</a> / <a href="/language/zh-TW">繁 體</a> / <a href="/language/en">English</a> </div> </div> </div> </div> </footer> <script> var officialEmail = $('#git-footer-email').text() $('#git-footer-main .icon-popup').popup({ position: 'bottom center' }) $('#git-footer-email').text(officialEmail.replace('#', '@')) window.gon.popover_card_locale = { follow:"关注", unfollow:"已关注", gvp_title: "GVP - Gitee 最有价值开源项目", project: "项目", org: "开源组织", member: "", author: "作者", user_blocked: "该用户已被屏蔽或已注销", net_error: "网络错误", unknown_exception: "未知异常" } window.gon.select_message = { placeholder: "请输入个人空间地址或完整的邮箱地址" } </script> <script src="https://cn-assets.gitee.com/webpacks/popover_card-ca6b9a20ba5353733d61.bundle.js"></script> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/webpacks/css/gitee_nps-ae0dbee40f6ddc72015a.css" /> <script src="https://cn-assets.gitee.com/webpacks/gitee_nps-30c2a3673b61c539fcf7.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/gitee_icons-0340f9dc8fc1dfbb9937.bundle.js"></script> <div class='side-toolbar'> <div class='button toolbar-help'> <i class='iconfont icon-help'></i> </div> <div class='ui popup left center dark'>点此查找更多帮助</div> <div class='toolbar-help-dialog'> <div class='toolbar-dialog-header'> <h3 class='toolbar-dialog-title'>搜索帮助</h3> <form class="toolbar-help-search-form" action="/help/load_keywords_data" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓" /> <div class='ui icon input fluid toolbar-help-search'> <input name='keywords' placeholder='请输入产品名称或问题' type='text'> <i class='icon search'></i> </div> </form> <i class='iconfont icon-close toolbar-dialog-close-icon'></i> </div> <div class='toolbar-dialog-content'> <div class='toolbar-help-hot-search'> <div class='toolbar-roll'> <a class="init active" title="Git 命令在线学习" href="https://oschina.gitee.io/learn-git-branching/?utm_source==gitee-help-widget"><i class='Blue icon icon-command iconfont'></i> <span>Git 命令在线学习</span> </a><a class="init " title="如何在 Gitee 导入 GitHub 仓库" href="https://gitee.com/help/articles/4261?utm_source==gitee-help-widget"><i class='icon icon-clipboard iconfont orange'></i> <span>如何在 Gitee 导入 GitHub 仓库</span> </a></div> <div class='toolbar-list'> <div class='toolbar-list-item'> <a href="/help/articles/4114">Git 仓库基础操作</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4166">企业版和社区版功能对比</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4191">SSH 公钥设置</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4194">如何处理代码冲突</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4232">仓库体积过大,如何减小?</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4279">如何找回被删除的仓库数据</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4283">Gitee 产品配额说明</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4284">GitHub仓库快速导入Gitee及同步更新</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4328">什么是 Release(发行版)</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4354">将 PHP 项目自动发布到 packagist.org</a> </div> </div> </div> <div class='toolbar-help-search-reseult'></div> </div> </div> <script> var opt = { position: 'left center'}; var $helpSideToolbar = $('.button.toolbar-help'); var $toolbarRoll = $('.toolbar-roll'); $(function() { if (false) { $helpSideToolbar.popup(opt).popup({lastResort:'left center'}) } else { $helpSideToolbar.popup({lastResort:'left center'}).popup('show', opt); setTimeout(function() { $helpSideToolbar.popup('hide', opt); }, 3000); } if ($toolbarRoll.length) { setInterval(function() { var $nextActiveLink = $toolbarRoll.find('a.active').next(); if (!$nextActiveLink.length) { $nextActiveLink = $toolbarRoll.find('a:first-child'); } $nextActiveLink.attr('class', 'active').siblings().removeClass('active init'); }, 5000); } }) </script> <div class='popup button' id='home-comment'> <i class='iconfont icon-comment'></i> </div> <div class='ui popup dark'>评论</div> <div class='toolbar-appeal popup button'> <i class='iconfont icon-report'></i> </div> <div class='ui popup dark'> 仓库举报 </div> <script> $('.toolbar-appeal').popup({ position: 'left center' }); </script> <div class='button gotop popup' id='gotop'> <i class='iconfont icon-top'></i> </div> <div class='ui popup dark'>回到顶部</div> </div> <div class='form modal normal-modal tiny ui' id='unlanding-complaint-modal'> <i class='iconfont icon-close close'></i> <div class='header'> 登录提示 </div> <div class='container actions'> <div class='content'> 该操作需登录 Gitee 帐号,请先登录后再操作。 </div> <div class='ui orange icon large button ok'> 立即登录 </div> <div class='ui button blank cancel'> 没有帐号,去注册 </div> </div> </div> <script> var $elm = $('.toolbar-appeal'); $elm.on('click', function() { var modals = $("#unlanding-complaint-modal.normal-modal"); if (modals.length > 1) { modals.eq(0).modal('show'); } else { modals.modal('show'); } }) $("#unlanding-complaint-modal.normal-modal").modal({ onDeny: function() { window.location.href = "/signup?from="; }, onApprove: function() { window.location.href = "/login?from="; } }) </script> <style> .side-toolbar .bdsharebuttonbox a { font-size: 24px; color: white !important; opacity: 0.9; margin: 6px 6px 0px 6px; background-image: none; text-indent: 0; height: auto; width: auto; } </style> <style> #udesk_btn a { margin: 0px 20px 167px 0px !important; } </style> <script> (function() { $('#project-user-message').popup({ position: 'left center' }); }).call(this); </script> <script> Gitee.initSideToolbar({ hasComment: true, commentUrl: '/zmister/MrDoc#tree_comm_title' }) </script> <style> .gitee-stars-main-widget { display: none; position: fixed; left: 0; bottom: 0; z-index: 106; } .gitee-stars-main-widget .close-icon { width: 20px; right: 10px; position: absolute; top: 0px; cursor: pointer; } .gitee-stars-main-widget .people-image { width: 200px; margin: 0 10px; } .gitee-stars-main-widget.gitee-stars-widget .close-icon { left: 20px; } </style> <div class='gitee-stars-main-widget pendan-widget'> <a target="_blank" href="https://www.oschina.net/event/8595459"><img class="people-image" src="https://foruda.gitee.com/images/1742526660229750692/371d5123_14472233.png" alt="371d5123 14472233" /> <img class="close-icon" src="https://foruda.gitee.com/images/1742526663983648370/46e8bd33_14472233.png" alt="46e8bd33 14472233" /> </a></div> <script> $(function () { var $giteeStarsWidget = $('.gitee-stars-main-widget') var cookieKey = "visit-gitee--2025-03-21" if ($.cookie(cookieKey) == 1) { $giteeStarsWidget.hide() } else { $giteeStarsWidget.show() } $giteeStarsWidget.on('click', '.close-icon', function (e) { e.preventDefault() $.cookie(cookieKey, 1, {path: '/', expires: 60}) $giteeStarsWidget.hide() }) }) </script> <script> (function() { this.__gac = { domain: 'www.oschina.net' }; }).call(this); </script> <script src="https://cn-assets.gitee.com/assets/bdstatic/app-070a9e339ac82bf2bf7ef20375cd4121.js"></script> <script src="https://hm.baidu.com/hm.js?71337e891e6dbfb00e5c6086c5cbc9ee" async="async"></script> <script src="https://cn-assets.gitee.com/webpacks/build_status-7effc7b22ddf8e90b34c.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/scan_status-7a19032286b03591b228.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/mermaid_render-669e055f02596b5d8886.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/check_runs-19ec228348982570119a.bundle.js"></script> </body> </html>