2 lines
57 KiB
JavaScript
2 lines
57 KiB
JavaScript
(function(t){function e(e){for(var c,n,r=e[0],l=e[1],a=e[2],h=0,d=[];h<r.length;h++)n=r[h],Object.prototype.hasOwnProperty.call(s,n)&&s[n]&&d.push(s[n][0]),s[n]=0;for(c in l)Object.prototype.hasOwnProperty.call(l,c)&&(t[c]=l[c]);u&&u(e);while(d.length)d.shift()();return i.push.apply(i,a||[]),o()}function o(){for(var t,e=0;e<i.length;e++){for(var o=i[e],c=!0,r=1;r<o.length;r++){var l=o[r];0!==s[l]&&(c=!1)}c&&(i.splice(e--,1),t=n(n.s=o[0]))}return t}var c={},s={app:0},i=[];function n(e){if(c[e])return c[e].exports;var o=c[e]={i:e,l:!1,exports:{}};return t[e].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=c,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var c in t)n.d(o,c,function(e){return t[e]}.bind(null,c));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="";var r=window["webpackJsonp"]=window["webpackJsonp"]||[],l=r.push.bind(r);r.push=e,r=r.slice();for(var a=0;a<r.length;a++)e(r[a]);var u=l;i.push([0,"chunk-vendors"]),o()})({0:function(t,e,o){t.exports=o("56d7")},"0a17":function(t,e,o){t.exports=o.p+"img/search.c77e1385.svg"},1423:function(t,e,o){"use strict";o("945b")},"2b42":function(t,e,o){"use strict";o("b23c")},"2df4":function(t,e,o){t.exports=o.p+"img/translate.fa0bf271.svg"},"4d66":function(t,e,o){t.exports=o.p+"img/user.6e444b4a.svg"},"56d7":function(t,e,o){"use strict";o.r(e);o("e260"),o("e6cf"),o("cca6"),o("a79d");var c=o("7a23"),s=(o("fb6a"),o("ac1f"),o("841c"),o("a5f7")),i=o.n(s),n=o("0a17"),r=o.n(n),l=o("b3c0"),a=o.n(l),u=o("e8ed"),h=o.n(u),d=o("2df4"),g=o.n(d),p=o("4d66"),m=o.n(p),b=o("fe3c"),f=o.n(b),v=Object(c["hb"])("data-v-5ebba4d0");Object(c["I"])("data-v-5ebba4d0");var j=Object(c["o"])("div",{class:"bg"},null,-1),y={id:"app"},O={class:"bookmark",id:"bookmark"},w={class:"tool-bar"},k=Object(c["o"])("div",{class:"tool-logo"},[Object(c["o"])("a",{href:"",target:"_blank"},[Object(c["o"])("img",{src:i.a,title:"感谢作者 是半夏鸭 设计的图标",class:"tool-icon"}),Object(c["n"])("红隼书签")])],-1),S={class:"search-box"},x=Object(c["o"])("img",{src:r.a},null,-1),V=Object(c["o"])("a",{title:"我的博客",href:"https://zhanhongzhu.top",target:"_blank"},[Object(c["o"])("img",{src:h.a,class:"tool-icon"})],-1),_=Object(c["o"])("a",{title:"在线翻译",href:"https://translate.google.cn",target:"_blank"},[Object(c["o"])("img",{src:g.a,class:"tool-icon"})],-1),J=Object(c["o"])("img",{src:m.a,class:"tool-icon"},null,-1),R={class:"box-m"},I={class:"left-box"},C={class:"left-box-item"},M=Object(c["o"])("img",{src:f.a},null,-1),A={class:"text-elipss"},N={class:"import-tool"},F=Object(c["o"])("span",{class:"import-text"},"导入/导出: ",-1),z={type:"file",ref:"filElem",id:"file"},D={class:"right-box"},T={class:"logo-img"},U={class:"logo-box"},B={class:"logo-box-tools"},E={class:"title"},P={class:"subtitle"},L={key:1,class:"card-item-nodata"},K=Object(c["o"])("div",null,[Object(c["o"])("svg",{width:"66",height:"68",viewBox:"0 0 66 68",class:"icon empty-icon","data-v-8739e5ce":""},[Object(c["o"])("g",{fill:"none","fill-rule":"evenodd",transform:"translate(4 3)","data-v-8739e5ce":""},[Object(c["o"])("g",{fill:"#F7F7F7","data-v-8739e5ce":""},[Object(c["o"])("path",{d:"M9 10h23.751v3.221H9zM9 16.494h41.083v4.026H9zM9 26.104h23.751v3.221H9zM9 42.208h23.751v3.221H9zM9 33.351h41.083v4.026H9zM9 49.455h41.083v4.026H9z","data-v-8739e5ce":""})]),Object(c["o"])("rect",{width:"56",height:"60",x:"1.139",y:"1.338",stroke:"#EBEBEB","stroke-width":"2",rx:"6","data-v-8739e5ce":""})])]),Object(c["o"])("span",{class:"empty-text","data-v-8739e5ce":""},"暂无数据")],-1);Object(c["G"])();var q=v((function(t,e,o,s,i,n){var r=Object(c["O"])("Dialog"),l=Object(c["O"])("Login");return Object(c["F"])(),Object(c["k"])(c["b"],null,[j,Object(c["o"])("div",y,[Object(c["o"])("div",O,[Object(c["o"])("div",w,[k,Object(c["o"])("div",null,[Object(c["o"])("div",S,[x,Object(c["eb"])(Object(c["o"])("input",{type:"text",placeholder:"请输入书签名称","onUpdate:modelValue":e[1]||(e[1]=function(e){return t.searchVal=e})},null,512),[[c["Z"],t.searchVal]])]),Object(c["o"])("img",{src:a.a,class:"tool-icon",onClick:e[2]||(e[2]=function(t){return s.add({},"add")})}),V,_,Object(c["o"])("span",{class:"login-s",onClick:e[3]||(e[3]=function(){return s.loginClick&&s.loginClick.apply(s,arguments)})},[J,Object(c["o"])("span",{class:"login-status",title:t.userInfo.username},Object(c["S"])(t.userInfo.username.slice(0,5)),9,["title"])])])]),Object(c["o"])("div",R,[Object(c["o"])("div",I,[Object(c["o"])("div",C,[(Object(c["F"])(!0),Object(c["k"])(c["b"],null,Object(c["M"])(t.data,(function(e,o){return Object(c["F"])(),Object(c["k"])("div",{class:["label",t.activeIndex===o?"active":"inactive"],key:o,onClick:function(t){return s.selectType(e,o)}},[M,Object(c["o"])("div",A,Object(c["S"])(e.type),1)],10,["onClick"])})),128))]),Object(c["o"])("div",N,[F,Object(c["o"])("i",{class:"el-icon-upload2",title:"导入浏览器书签",onClick:e[4]||(e[4]=function(){return s.importBookmark&&s.importBookmark.apply(s,arguments)})},[Object(c["o"])("input",z,null,512)]),Object(c["o"])("i",{class:"el-icon-download",title:"导出浏览器书签",onClick:e[5]||(e[5]=function(){return s.exportBookmark&&s.exportBookmark.apply(s,arguments)})})])]),Object(c["o"])("div",D,[t.bookMark.length?(Object(c["F"])(),Object(c["k"])(c["f"],{key:0,name:"staggered-fade",class:"card-s",tag:"ul",css:!1,onBeforeEnter:n.beforeEnter,onEnter:n.enter,onLeave:n.leave},{default:v((function(){return[(Object(c["F"])(!0),Object(c["k"])(c["b"],null,Object(c["M"])(t.bookMark,(function(t,e){return Object(c["F"])(),Object(c["k"])("div",{class:"card-item list-complete-item",key:e,onClick:function(e){return s.navigate(t)}},[Object(c["o"])("div",T,[Object(c["o"])("img",{src:t.logo?t.logo:"/img/logo.f38dc2e8.svg"},null,8,["src"])]),Object(c["o"])("div",U,[Object(c["o"])("span",B,[Object(c["o"])("i",{class:"el-icon-edit",onClick:Object(c["gb"])((function(e){return s.add(t,"modify")}),["stop"])},null,8,["onClick"]),Object(c["o"])("i",{class:"el-icon-delete",onClick:Object(c["gb"])((function(e){return s.deleteClick(t)}),["stop"])},null,8,["onClick"])]),Object(c["o"])("span",E,Object(c["S"])(t.title||"Kestrel-bookmark"),1),Object(c["o"])("span",P,Object(c["S"])(t.desc||"红隼书签-为中国 Web 前端开发人员提供优质网站导航"),1)])],8,["onClick"])})),128))]})),_:1},8,["onBeforeEnter","onEnter","onLeave"])):Object(c["l"])("",!0),t.bookMark.length?Object(c["l"])("",!0):(Object(c["F"])(),Object(c["k"])("div",L,[K]))])])])]),Object(c["o"])(r,{class:"my-dialog",modelValue:t.isDetailVisible,"onUpdate:modelValue":e[6]||(e[6]=function(e){return t.isDetailVisible=e}),onCloseViews:s.closeViews,detail:t.detail,selectType:t.activeIndex,onFresh:s.search},null,8,["modelValue","onCloseViews","detail","selectType","onFresh"]),Object(c["o"])(l,{modelValue:t.isLoginVisible,"onUpdate:modelValue":e[7]||(e[7]=function(e){return t.isLoginVisible=e}),onCloseViews:s.closeLoginViews,onSetUser:s.setUsername},null,8,["modelValue","onCloseViews","onSetUser"])],64)})),G=o("1da1"),H=o("5530"),W=o("b85c"),Q=(o("96cf"),o("d3b7"),o("4de4"),o("c740"),o("a434"),o("a1e9")),Z=[{type:"语言文档和规范",children:[{desc:"提供 Web 技术文档,学习 Web 开发的最佳实践",url:"https://developer.mozilla.org/zh-CN/docs/Web",logo:"",title:"MDN"},{contribute:"https://github.com/docschina/ecma262",desc:"ECMAScript 2018 标准",url:"https://ecma262.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/ecma.svg",title:"ECMAScript"},{contribute:"https://github.com/LinFeng1997/markdown-it-docs",desc:"Markdown 解析器。完全支持 CommonMark 规范,并且进行语法扩展、提供可编写插件和快速编译",url:"https://markdown-it.docschina.org/",is_docschina:!0,title:"markdown-it 中文文档",repository:"https://github.com/markdown-it/markdown-it"},{contribute:"https://github.com/docschina/GFM-docs",url:"https://gfm.docschina.org/zh-hans/",is_docschina:!0,title:"GitHub 风格 Markdown 规范",repository:"https://github.com/docschina/GFM-docs"},{url:"https://www.markdownguide.org/basic-syntax/",title:"Markdown 基本语法"},{contribute:"https://github.com/xitu/graphql.github.io",desc:"一种用于 API 的查询语言",url:"http://graphql.cn/",logo:"https://cdn.docschina.org/home/logo/graphql.svg",title:"GraphQL"},{contribute:"https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md",desc:"OpenAPI 规范为 RESTful API 定义了一个与语言无关的标准接口",url:"https://swagger.io/docs/specification/about/",logo:"https://cdn.docschina.org/home/logo/openapi.png",title:"OpenAPI"},{contribute:"https://github.com/json-schema-org/json-schema-spec",desc:"JSON Schema 是一个词汇表,可以验证、注释和操作 JSON 文档",url:"http://json-schema.org/",logo:"https://cdn.docschina.org/home/logo/json-schema.svg",title:"JSON Schema"},{desc:"一门语言,帮助开发者构建可靠和高效软件",url:"https://www.rust-lang.org/zh-CN/",logo:"https://www.rust-lang.org/static/images/rust-logo-blk.svg",title:"Rust"}],title:"standard"},{_id:"c497f5885f9e324e0118d57b2d7881b8",_updateTime:1614568539818,type:"视频音频",children:[{desc:"带解析器、能节省流量的 Web 视频播放器",url:"https://h5player.bytedance.com/",logo:"https://cdn.docschina.org/home/logo/xgplayer.png",title:"XGPlayer",repository:"https://github.com/bytedance/xgplayer",team:"今日头条"},{desc:"奇舞团研制的 h5 播放器,它支持 mp4、m3u8、flv 等多种格式",url:"http://chimee.org/",logo:"https://cdn.docschina.org/home/logo/75team.svg",title:"Chimee",repository:"https://github.com/Chimeejs/chimee",team:"360"},{desc:"HTML5 视频播放器以纯 JavaScript 编写,不含 Flash",url:"https://github.com/Bilibili/flv.js",logo:"",title:"flv.js",team:"哔哩哔哩"}],title:"media"},{_id:"c497f5885f9e324e0118d57508ba180c",type:"函数式编程",children:[{contribute:"https://github.com/RxJS-CN/RxJS-Docs-CN/",desc:"RxJS 是 Reactive Extensions 的 JavaScript 实现,可以通过响应式和函数式编程模型组合异步数据流",url:"http://cn.rx.js.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/rxjs.png",title:"RxJS"},{desc:"函数式和响应式的 JavaScript 框架",url:"http://cyclejs.cn/",logo:"https://cdn.docschina.org/home/logo/cyclejs.svg",title:"Cycle.js"},{desc:"一款实用的 JavaScript 函数式编程库",url:"http://ramda.cn/",logo:"https://ramdajs.com/ramdaFilled_200x235.png",title:"Ramda"}],title:"functional"},{_id:"c497f5885f9e324e0118d56d1789876d",_updateTime:1611132890668,type:"Vue(Mobile)",children:[{desc:"移动端 Vue 组件库",url:"https://youzan.github.io/vant/",logo:"https://cdn.docschina.org/home/logo/vant.png",title:"Vant",repository:"https://github.com/youzan/vant",team:"有赞"},{desc:"基于 Vue 实现的精致移动端组件库",url:"https://didi.github.io/cube-ui/",logo:"https://cdn.docschina.org/home/logo/cube.png",title:"Cube UI",repository:"https://github.com/didi/cube-ui",team:"滴滴"},{desc:"面向金融场景的 Vue 移动端组件库",url:"https://didi.github.io/mand-mobile/",logo:"https://cdn.docschina.org/home/logo/mand.svg",title:"Mand Mobile",repository:"https://github.com/didi/mand-mobile",team:"滴滴"},{desc:"可视化 Mand Mobile 主题编辑器",url:"https://mand-mobile.github.io/palette/",logo:"https://cdn.docschina.org/home/logo/mand.svg",title:"Mand Mobile Palette",repository:"https://github.com/mand-mobile/palette",team:"滴滴"},{desc:"基于 Vue 的移动端跨平台 UI",url:"https://weex.apache.org/",logo:"https://cdn.docschina.org/home/logo/weex.svg",title:"Weex",repository:"https://github.com/apache/incubator-weex",team:"阿里巴巴"}],title:"vue-mobile"},{_id:"c497f5885f9e324e0118d57a3885d353",_updateTime:1612263116672,type:"工具",children:[{contribute:"https://github.com/xmoyking/localForage-cn",desc:"通过简单类似 localStorage API 的异步数据存储来改进你的 Web 应用程序的离线体验",url:"https://localforage.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/lf.png",title:"localForage"},{contribute:"https://github.com/iamkun/dayjs",desc:"处理时间和日期的 JavaScript 函数库",url:"https://day.js.org/zh-CN/",title:"Day.js"},{contribute:"https://github.com/moment/moment",desc:"处理时间和日期的 JavaScript 函数库",url:"https://momentjs.com/docs/",title:"Moment.js"},{desc:"一个现代的 JavaScript 工具库",url:"http://lodash.think2011.net/",logo:"https://cdn.docschina.org/home/logo/lodash.svg",title:"Lodash"},{desc:"jQuery API 速查表",url:"http://hemin.cn/jq/",logo:"https://cdn.docschina.org/home/logo/jquery.svg",title:"jQuery API"},{desc:"高效精简强大的工具库",url:"http://www.jquery123.com/",logo:"https://cdn.docschina.org/home/logo/jquery.svg",title:"jQuery"},{desc:"轻量级的工具库",url:"http://zeptojs.com/",logo:"https://cdn.docschina.org/home/logo/zepto.png",title:"Zepto"}],title:"utils"},{_id:"c497f5885f9e324e0118d56a6fb97586",_updateTime:1618062117484,type:"React",children:[{contribute:"https://github.com/docschina/create-react-app",desc:"React 官方维护的创建 React 单页面应用的工具",url:"https://cra.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/react.svg",title:"Create React App"},{contribute:"https://github.com/docschina/preact-www",desc:"React 的 3kb 轻量化方案,拥有同样的 ES6 API",url:"https://preactjs.com/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/preact.png",title:"Preact"},{contribute:"https://github.com/docschina/react-router.cn",desc:"React 官方维护的路由库",url:"https://react-router.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/react-router.svg",title:"React-Router"},{contribute:"https://github.com/dvajs/dva",desc:"基于 React 和 redux,具有 elm 风格的轻量级框架。",url:"https://dvajs.com/",logo:"",title:"dva"},{desc:"Element UI 的 React 实现",url:"https://elemefe.github.io/element-react/",logo:"https://cdn.docschina.org/home/logo/element.svg",title:"Element React",repository:"https://github.com/eleme/element-react",team:"饿了么"},{desc:"PC 端 WebUI 规范的 React 实现,提供了一整套基础的 UI 组件以及一些常用的业务组件",url:"https://youzan.github.io/zent/zh/guides/install",logo:"https://cdn.docschina.org/home/logo/zent.png",title:"Zent",repository:"https://github.com/youzan/zent",team:"有赞"},{desc:"Nerv 是一款基于虚拟 DOM 技术的 JavaScript(TypeScript)库,它提供了与 React 16 一致的使用方式与 API,并且拥有更高的性能表现、更小的包大小以及更好的浏览器兼容性",url:"https://nerv.aotu.io/",logo:"https://camo.githubusercontent.com/3e1b76e514b895760055987f164ce6c95935a3aa/687474703a2f2f73746f726167652e333630627579696d672e636f6d2f6d74642f686f6d652f6c6f676f2d3278313531333833373932363730372e706e67",title:"Nerv",repository:"https://github.com/NervJS/nerv",team:"京东"},{desc:"基于 React 的移动端跨平台 UI",url:"https://reactnative.cn/",logo:"https://cdn.docschina.org/home/logo/react.svg",title:"React Native",repository:"https://github.com/reactnativecn/react-native.cn"},{desc:"React Native 应用程序的路由和导航",url:"https://reactnavigation.org/docs/getting-started",logo:"https://reactnavigation.org/img/spiro.svg",title:"React Navigation",repository:"https://github.com/react-navigation"}],title:"react"},{_id:"c497f5885f9e324e0118d56873ba5666",_updateTime:1618062691090,type:"web 框架",children:[{contribute:"https://github.com/reactjs/zh-hans.reactjs.org",desc:"构建用户界面的 JavaScript 库",url:"https://react.docschina.org",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/react.svg",title:"React"},{contribute:"https://github.com/vuejs/cn.vuejs.org",desc:"渐进式 JavaScript 框架",url:"https://cn.vuejs.org/v2/guide/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"Vue 2"},{contribute:"https://github.com/vuejs/vue-next",desc:"渐进式 JavaScript 框架",url:"https://v3.cn.vuejs.org/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"Vue 3"},{contribute:"https://github.com/single-spa/single-spa",desc:"JavaScript 框架,将多个微前端组合成一个应用程序",url:"https://single-spa.js.org/",logo:"https://single-spa.js.org/img/logo-white-bgblue.svg",title:"single-spa"},{contribute:"https://github.com/angular/angular",desc:"应用程序设计框架和开发平台,用于创建高效且复杂的单页应用程序",url:"https://angular.cn/",logo:"https://cdn.docschina.org/home/logo/angular.svg",title:"Angular"},{contribute:"https://github.com/sveltejs/svelte",desc:"将声明性组件转换为精准高效更新 DOM 的 JavaScript 代码。",url:"https://svelte.dev/",logo:"https://svelte.dev/svelte-logo-horizontal.svg",title:"Svelte"}],title:"web-framework"},{_id:"c497f5885f9e324e0118d5725620766a",type:"代码风格检查",children:[{desc:"可组装的、用于 JavaScript 和 JSX 的代码检查工具",url:"https://cn.eslint.org/",logo:"https://cdn.docschina.org/home/logo/eslint.svg",title:"ESLint"},{contribute:"https://github.com/docschina/stylelint",desc:"强大的现代 CSS 检测工具,帮助样式表遵循一致的约定和避免错误",url:"https://stylelint.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/stylelint.svg",title:"StyleLint"},{desc:"JavaScript 风格指南、检查工具和格式化工具",url:"https://standardjs.com/",logo:"https://cdn.docschina.org/home/logo/standardjs.svg",title:"Standard JS"},{desc:"Vue 代码的风格指南",url:"https://vue.docschina.org/v2/style-guide/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"Vue 风格指南"}],title:"codestyle"},{_id:"c497f5885f9e324e0118d56f23ffeb15",_updateTime:1618761523555,type:"Node.js & Deno",children:[{contribute:"https://github.com/nodejscn/node-api-cn",desc:"基于 V8 引擎的 JavaScript 运行环境",url:"http://nodejs.cn/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/node.svg",title:"Node.js"},{contribute:"https://deno.js.cn/",desc:"Deno 是一个 JavaScript/TypeScript 的运行时",url:"https://manual.deno.js.cn/",logo:"https://deno.land/logo.svg",title:"Deno"},{contribute:"https://github.com/demopark/koa-docs-Zh-CN",desc:"新一代的 Web 后台框架",url:"https://koajs.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/koa.svg",title:"Koa"},{desc:"为企业级框架和 Node.js & Koa 应用程序而生",url:"https://eggjs.org/",logo:"https://cdn.docschina.org/home/logo/egg.png",title:"egg",repository:"https://github.com/eggjs/egg",team:"阿里巴巴"},{desc:"快速极简的 Web 框架",url:"http://expressjs.com/zh-cn/",logo:"https://cdn.docschina.org/home/logo/express.png",title:"Express",repository:"https://github.com/expressjs/express"},{desc:"渐进式 Node.js 框架,构建高效、可靠和可扩展的 server 应用程序",url:"https://nestjs.com/",logo:"https://cdn.docschina.org/home/logo/nest.png",title:"nest",repository:"https://github.com/nestjs/nest"},{desc:"能够使用完整 ES6/7 特性进行开发的 Node.js 应用程序",url:"https://thinkjs.org/",logo:"https://cdn.docschina.org/home/logo/think.png",title:"ThinkJS",repository:"https://github.com/thinkjs/thinkjs",team:"360"},{desc:"npm 是 JavaScript package 管理工具,在这里可以找到可复用代码,并以强大的全新方式进行聚合",url:"https://docs.npmjs.com/",logo:"https://cdn.docschina.org/home/logo/npm.png",title:"npm"},{desc:"淘宝提供的 npmjs.org 镜像",url:"https://npm.taobao.org/",logo:"https://npm.taobao.org/favicon.png",title:"cnpm"},{desc:"快速、可靠和安全的依赖管理",url:"https://yarnpkg.com/zh-Hans/",logo:"https://cdn.docschina.org/home/logo/yarn.png",title:"yarn"}],title:"node"},{_id:"c497f5885f9e324e0118d5741113911d",_updateTime:1618213635311,type:"编程教程",children:[{contribute:"https://github.com/javascript-tutorial/zh.javascript.info",desc:"以最新的 JavaScript 标准为基准,通过简单但足够详细的内容,为你讲解从基础到高阶的 JavaScript 相关知识。",url:"https://zh.javascript.info/",is_docschina:!1,logo:"https://user-images.githubusercontent.com/26959437/67275005-3df25500-f4f4-11e9-9c13-36e442ff40cc.jpg",title:"现代 JavaScript 教程"},{contribute:"https://github.com/RxJS-CN/learn-rxjs-operators",desc:"通过每个操作符的清晰示例及解释来进行 RxJS 的学习",url:"https://rxjs-cn.github.io/learn-rxjs-operators/",is_docschina:!0,logo:"",title:"学习 RxJS 操作符"},{desc:"从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript",url:"https://ts.xcatliu.com/",logo:"https://cdn.docschina.org/home/logo/typescript.svg",title:"TypeScript 入门教程",repository:"https://github.com/xcatliu/typescript-tutorial"},{desc:"基于 Promise 进行异步编程的基本使用方法以及测试的编写方法、应用及反模式等内容的文档",url:"http://liubin.org/promises-book/",logo:"",title:"JavaScript Promise 迷你书"},{contribute:"https://github.com/RxJS-CN/learn-rxjs-operators",desc:"通过每个操作符的清晰示例及解释来进行 RxJS 的学习",url:"https://rxjs-cn.github.io/learn-rxjs-operators/",is_docschina:!0,logo:"",title:"学习 RxJS 操作符"},{desc:"这是一本有关 Rust的入门书籍",url:"https://doc.rust-lang.org/book/",logo:"https://www.rust-lang.org/static/images/rust-logo-blk.svg",title:"Rust 编程语言"}],title:"tutorial"},{_id:"c497f5885f9e324e0118d56c79303c20",_updateTime:1611204893455,type:"Vue(PC)",children:[{desc:"基于 Vue 的组件库",url:"http://element-cn.eleme.io/",logo:"https://cdn.docschina.org/home/logo/element.svg",title:"Element UI",repository:"https://github.com/ElemeFE/element",team:"饿了么"},{desc:"基于 Vue 的 Material 组件库",url:"https://vuetifyjs.com/zh-Hans/",logo:"https://cdn.docschina.org/home/logo/vuetify.svg",title:"Vuetify",repository:"https://github.com/vuetifyjs/vuetify"},{desc:"基于 Vue 的组件库",url:"https://www.iviewui.com/",logo:"https://cdn.docschina.org/home/logo/iview.png",title:"View UI",repository:"https://github.com/iview/iview",team:"TalkingData"},{desc:"Vue 官方 UI 组件",url:"https://vuejs.github.io/ui/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"Vue UI Framework",repository:"https://github.com/vuejs/ui"},{desc:"一个基于 Vue 的高质量 UI 组件库",url:"https://www.heyui.top/",logo:"https://camo.githubusercontent.com/1424cb86c2634f96fe82db55f01f07c3c29e53a1/68747470733a2f2f7777772e68657975692e746f702f7374617469632f696d616765732f6c6f676f2e706e67",title:"HeyUI",repository:"https://github.com/heyui/heyui"},{desc:"灵活易用的 JavaScript 组件框架,兼容到 IE6",url:"https://baidu.github.io/san/",logo:"https://cdn.docschina.org/home/logo/san.svg",title:"San",repository:"https://github.com/baidu/san",team:"百度"},{desc:"vue-loader 可以将 Vue 单文件组件转换为 JavaScript 模块的 webpack loader",url:"https://vue-loader.vuejs.org/zh/",logo:"",title:"vue-loader",repository:"https://github.com/vuejs/vue-loader"},{contribute:"https://github.com/vuejs/vuepress",desc:"由 Vue 提供支持的静态站点生成器",url:"https://vuepress.vuejs.org/zh/",logo:"https://cdn.docschina.org/home/logo/vuepress.svg",title:"VuePress"},{desc:"vue-router 是 Vue 官方提供的 router",url:"https://router.vuejs.org/zh/",logo:"",title:"vue-router",repository:"https://github.com/vuejs/vue-router"},{desc:"vue-rx 帮助用户在 Vue 应用程序中实现简单的 RxJS 绑定",url:"https://github.com/vuejs/vue-rx/blob/master/README-CN.md",logo:"",title:"vue-rx",repository:"https://github.com/vuejs/vue-rx"},{desc:"vue-cli 帮助用户快速开发 Vue 的脚手架(scaffold)",url:"https://cli.vuejs.org/zh/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"vue-cli",repository:"https://github.com/vuejs/vue-cli"},{desc:"Vue 官方提供的服务器端渲染(SSR)指南",url:"https://ssr.vuejs.org/zh/",logo:"",title:"vue-ssr",repository:"https://github.com/vuejs/vue-ssr-docs"},{desc:"Vue.js 元框架,用于快速创建复杂、高性能的通用 Web 应用程序",url:"https://zh.nuxtjs.org/",logo:"https://zh.nuxtjs.org/logos/nuxt-icon.png",title:"Nuxt.js",repository:"https://github.com/nuxt/nuxt.js"}],title:"vue-pc"},{_id:"c497f5885f9e324e0118d57622981fde",type:"测试工具",children:[{desc:"Vue Test Utils 是 Vue.js 官方的单元测试实用工具库",url:"https://vue-test-utils.vuejs.org/zh/",logo:"",title:"Vue Test Utils",repository:"https://github.com/vuejs/vue-test-utils"},{desc:"Facebook 开发的零配置测试平台,让代码库更加稳定和健壮",url:"https://jest.docschina.org/",logo:"https://cdn.docschina.org/home/logo/jest.png",title:"Jest",repository:"https://github.com/facebook/jest"},{desc:"未来的测试运行器",url:"https://github.com/avajs/ava",logo:"https://cdn.docschina.org/home/logo/ava.png",title:"ava"},{desc:"Karma 的主要目标是,让测试驱动开发(TDD)变得简单、快速和有趣。",url:"https://karma-runner.github.io/2.0/index.html",logo:"https://cdn.docschina.org/home/logo/karma.png",title:"Karma",repository:"https://github.com/karma-runner/karma"},{desc:"Mocha 是运行在 Node.js 和浏览器上的功能丰富的 JavaScript 测试框架,使异步测试变得简单而有趣。Mocha 串行运行测试,提供灵活精准的报告,同时将未捕获的异常映射到正确的测试用例。",url:"https://mochajs.org/",logo:"https://cdn.docschina.org/home/logo/mocha.svg",title:"Mocha",repository:"https://github.com/mochajs/mocha"},{desc:"Jasmine 是一个用于测试 JavaScript 代码的行为驱动开发(BDD)框架",url:"https://jasmine.github.io/",logo:"https://cdn.docschina.org/home/logo/jasmine.png",title:"Jasmine",repository:"https://github.com/jasmine/jasmine"},{desc:"Puppeteer 可以通过 DevTools 协议控制 headless Chrome 或 Chromium",url:"https://pptr.dev/",logo:"https://cdn.docschina.org/home/logo/puppeteer.png",title:"Puppeteer",repository:"https://github.com/GoogleChrome/puppeteer"},{desc:"用于对 JavaScript 隔离测试 spy, stub 和 mock。适用于任何单元测试框架",url:"http://sinonjs.org/",logo:"https://cdn.docschina.org/home/logo/sinon.png",title:"Sinon.JS",repository:"https://github.com/sinonjs/sinon"},{desc:"Chai 是一个用于 Node.js 和浏览器的 BDD/TDD 断言库,可以与任何 JavaScript 测试框架便捷配对",url:"http://chaijs.com/",logo:"https://cdn.docschina.org/home/logo/chai.png",title:"Chai",repository:"https://github.com/chaijs/chai"},{desc:"expect 帮助你编写更好的断言",url:"https://github.com/mjackson/expect",logo:"",title:"expect"},{desc:"一个富于表现力、可读性强、与框架无关,用于 Node.js 的 BDD 风格断言库",url:"https://shouldjs.github.io/",logo:"",title:"Should.js",repository:"https://github.com/shouldjs/should.js"},{desc:"生成随机数据,拦截 Ajax 请求",url:"http://mockjs.com/",logo:"",title:"Mock.js",repository:"https://github.com/nuysoft/Mock"}],title:"test"},{_id:"c497f5885f9e324e0118d5770943917c",_updateTime:1613989291342,type:"编译构建",children:[{contribute:"https://github.com/docschina/webpack.js.org",desc:"用于现代 JavaScript 应用程序的静态模块打包工具",url:"https://webpack.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/webpack-offical.svg",title:"webpack"},{contribute:"https://github.com/docschina/babeljs.io",desc:"一个编译工具,让你可以项目中直接使用下一代 JavaScript",url:"https://babel.docschina.org/",homeBackup:"https://babeljs.cn/",imgStyle:{objectFit:"contain"},is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/babel.png",title:"Babel"},{contribute:"https://github.com/docschina/parceljs.io",desc:"零配置打包工具",url:"https://parceljs.docschina.org/",homeBackup:"https://www.parceljs.io/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/parcel.png",title:"Parcel"},{contribute:"https://github.com/docschina/rollupjs.org",desc:"新一代 JavaScript 模块打包器",url:"https://rollup.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/rollup.svg",title:"Rollup"},{contribute:"https://github.com/vitejs/docs-cn",desc:"下一代前端开发与构建工具",url:"https://cn.vitejs.dev/",logo:"https://vitejs.dev/logo.svg",title:"Vite"},{desc:"JavaScript 超集",url:"https://zhongsp.gitbooks.io/typescript-handbook/",logo:"https://cdn.docschina.org/home/logo/typescript.svg",title:"TypeScript",repository:"https://github.com/zhongsp/TypeScript"},{desc:"基于流的自动化构建工具",url:"http://www.gulpjs.com.cn/",logo:"https://cdn.docschina.org/home/logo/gulp.svg",title:"Gulp"},{desc:"JavaScript 世界的构建工具",url:"https://grunt.docschina.org/",logo:"https://cdn.docschina.org/home/logo/grunt.svg",title:"Grunt"},{desc:"用于管理有多个包的 JavaScript 项目的工具",url:"https://lerna.js.org/",logo:"https://cdn.docschina.org/home/logo/lerna.svg",title:"Lerna",repository:"https://github.com/lerna/lerna"}],title:"build"},{_id:"c497f5885f9e324e0118d5781a2d68bb",type:"模板引擎",children:[{desc:"JavaScript 模板引擎",url:"http://ejs.co/",logo:"",title:"EJS"},{desc:"JavaScript 模板引擎",url:"https://pugjs.org/",logo:"",title:"Pug"},{desc:"JavaScript 模板引擎",url:"https://handlebarsjs.com/",logo:"",title:"Handlebars.js"}],title:"template"},{_id:"c497f5885f9e324e0118d5733b66fd34",_updateTime:1618063291445,type:"状态管理",children:[{contribute:"https://github.com/SangKa/mobx-docs-cn",desc:"简单、可扩展的状态管理",url:"https://cn.mobx.js.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/mobx.png",title:"Mobx"},{contribute:"https://www.github.com/reduxjs/react-redux",desc:"React 官方版本 Redux",url:"https://react-redux.js.org/",logo:"https://cdn.docschina.org/home/logo/redux.svg",title:"React Redux"},{contribute:"https://github.com/camsong/redux-in-chinese",desc:"JavaScript 状态容器,提供可预测化的状态管理",url:"https://cn.redux.js.org/",logo:"https://cdn.docschina.org/home/logo/redux.svg",title:"Redux"},{contribute:"https://github.com/rematch/rematch",desc:"Rematch 是没有 boilerplate 的 Redux 最佳实践",url:"https://rematch.gitbook.io/",logo:"https://cdn.docschina.org/home/logo/rematch.png",title:"Rematch"},{desc:"vuex 是 Vue 官方提供的状态管理工具",url:"https://vuex.vuejs.org/zh/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"Vuex",repository:"https://github.com/vuejs/vuex"}],title:"data-model"},{_id:"c497f5885f9e324e0118d57c78a8184a",_updateTime:1606363580152,type:"技术周刊",children:[{desc:"关于 JavaScript 的文章、新闻和项目的周刊",url:"https://docschina.org/weekly/js/docs/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/docschina-logo.svg",title:"印记中文周刊 - JavaScript"},{desc:"关于 React 的文章、新闻和项目的周刊",url:"https://docschina.org/weekly/react/docs/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/docschina-logo.svg",title:"印记中文周刊 - React"},{desc:"Node.js 新闻和文章",url:"https://nodeweekly.com/",logo:"",title:"Node Weekly"},{desc:"CSS 文章、教程、实验、工具等摘要",url:"https://css-weekly.com/",logo:"https://css-weekly.com/wp-content/themes/cssweekly/img/cssweekly-logo.png",title:"CSS Weekly"},{desc:"Vue 官方提供的最新实时动态资讯",url:"https://news.vuejs.org/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"Vue news",repository:"https://github.com/vuejs/news.vuejs.org"}],title:"weekly"},{_id:"c497f5885f9e324e0118d5691d88abc2",type:"小程序框架",children:[{contribute:"https://github.com/remaxjs/remax",desc:"Remax 将 React 运行在小程序环境中,让你可以使用完整的 React 进行小程序开发。",url:"https://remaxjs.org/",logo:"https://gw.alipayobjects.com/mdn/rms_b5fcc5/afts/img/A*1NHAQYduQiQAAAAAAAAAAABkARQnAQ",title:"Remax"},{contribute:"https://github.com/NervJS/taro",desc:"Taro 是一套遵循 React 语法规范的 多端开发 解决方案。",url:"https://taro.jd.com/",logo:"https://cdn.docschina.org/home/logo/taro.png",title:"Taro"},{contribute:"https://github.com/wechat-miniprogram/kbone",desc:"kbone 用于支持一个项目可以同时在 Web 端和小程序端被使用",url:"https://developers.weixin.qq.com/miniprogram/dev/extended/kbone/",logo:"",title:"kbone"},{contribute:"https://github.com/Tencent/omi",desc:"Omi 可以开发桌面 Web、移动 H5,同时支持开发小程序",url:"http://omijs.org",logo:"https://camo.githubusercontent.com/5a3ce051411cca4d8abd0e0abff879bb5a871520/68747470733a2f2f74656e63656e742e6769746875622e696f2f6f6d692f6173736574732f6f6d692d6c6f676f323031392e737667",title:"omi/omip"},{contribute:"https://github.com/Tencent/wepy",desc:"WePY 是一款让小程序支持组件化开发的框架,通过预编译的手段让开发者可以选择自己喜欢的开发风格去开发小程序",url:"https://developers.weixin.qq.com/miniprogram/dev/extended/kbone/",logo:"https://opensource.tencent.com/img/wepy.png",title:"wepy"},{contribute:"https://github.com/RubyLouvre/nanachi",desc:"基于 React 的多端小程序转译框架,完美兼容 React 生命周期",url:"https://rubylouvre.github.io/nanachi/",logo:"https://cdn.docschina.org/home/logo/nanachi.png",title:"nanachi"},{contribute:"https://github.com/Meituan-Dianping/mpvue",desc:"框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。",url:"http://mpvue.com",logo:"https://cdn.docschina.org/home/logo/mpvue.png",title:"mpvue"},{contribute:"https://github.com/wxajs/wxa",desc:"wxa 是一个 AOP 框架,主要使用 Decorator(运行时改写,拦截)和预编译实现框架功能。",url:"https://wxajs.github.io/wxa/",logo:"https://github.com/wxajs/wxa/raw/dev/wxa-logo.png",title:"wxa"},{contribute:"https://github.com/didi/mpx",desc:"Mpx 是一款致力于提高小程序开发体验的增强型小程序框架,通过 Mpx,我们能够以最先进的 web 开发体验来开发生产性能深度优化的小程序。",url:"https://didi.github.io/mpx/",logo:"https://cdn.docschina.org/home/logo/mpx-logo.png",title:"mpx"},{contribute:"https://github.com/kaola-fed/megalo",desc:"Megalo 是基于 Vue(Vue@2.6.6) 的小程序开发框架,让开发者可以用 Vue 的开发方式开发小程序应用。",url:"https://megalojs.org/#/",logo:"https://megalojs.org/static/megalo.png",title:"megalo"},{contribute:"https://github.com/didi/chameleon",desc:"Chameleon/kəˈmiːlɪən/,简写CML,中文名卡梅龙;中文意思变色龙,意味着就像变色龙一样能适应不同环境的跨端整体解决方案。",url:"https://cml.js.org/",logo:"https://camo.githubusercontent.com/9a6e165b9188a8ac4e5173bc382688a418fad711/68747470733a2f2f636d6c2e6a732e6f72672f646f632f6173736574732f3130302a3130302e706e67",title:"chameleon"},{contribute:"https://github.com/dcloudio/uni-app",desc:"框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。",url:"https://uniapp.dcloud.io/",logo:"https://img-cdn-qiniu.dcloud.net.cn/new-page/uni.png",title:"uni-app"}],title:"mini-program"},{_id:"c497f5885f9e324e0118d56e41e13c2b",_updateTime:1612264536260,type:"Angular",children:[{desc:"Material Design 组件库 for Angular",url:"https://material.angular.cn/",logo:"https://cdn.docschina.org/home/logo/angular.svg",title:"Angular Material",repository:"https://github.com/ng-docs/components"},{desc:"Element UI 的 Angular 实现",url:"https://element-angular.faas.ele.me/",logo:"https://cdn.docschina.org/home/logo/element.svg",title:"Element Angular",repository:"https://github.com/ElemeFE/element-angular",team:"饿了么"},{desc:"基于 Angular 的移动端跨平台 UI",url:"https://ionicframework.com/",logo:"https://cdn.docschina.org/home/logo/ionic.png",title:"Ionic",repository:"https://github.com/ionic-team/ionic"}],title:"angular"},{_id:"c497f5885f9e324e0118d5706183e0bf",type:"CSS",children:[{desc:"Sass 是 CSS 的一个扩展,它使 CSS 的使用起来更加优雅和强大。",url:"https://sass-guidelin.es/zh/",logo:"https://cdn.docschina.org/home/logo/sass.svg",title:"Sass"},{desc:"Less 是 CSS 预处理语言,使 CSS 更易维护和扩展",url:"http://lesscss.cn/",logo:"https://cdn.docschina.org/home/logo/less.svg",title:"Less"},{desc:"富有表现力、动态、健壮的 CSS",url:"http://www.zhangxinxu.com/jq/stylus/",homeBackup:"http://stylus-lang.com/",logo:"https://cdn.docschina.org/home/logo/stylus.svg",title:"Stylus"},{contribute:"https://github.com/docschina/postcss/blob/cn/Translation.md",desc:"通过 JavaScript 来转换 CSS,并且提供强大的插件系统",url:"http://postcss.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/postcss.svg",title:"PostCSS"}],title:"css"},{_id:"c497f5885f9e324e0118d5793d4545a7",type:"可视化工具",children:[{contribute:"https://github.com/docschina/threejs.org",desc:"JavaScript 3d 库",url:"https://threejs.docschina.org/",is_docschina:!0,logo:"https://cdn.docschina.org/home/logo/threejs.png",title:"Threejs",repository:"https://github.com/mrdoob/three.js"},{desc:"使用 JavaScript 实现的开源可视化库",url:"http://echarts.baidu.com/",logo:"https://cdn.docschina.org/home/logo/echarts.png",title:"ECharts",repository:"https://github.com/ecomfe/echarts",team:"百度"},{desc:"跨平台的轻量级 2D 渲染对象模型",url:"http://spritejs.org/",logo:"https://cdn.docschina.org/home/logo/spritejs.png",title:"SpriteJS",repository:"https://github.com/spritejs/spritejs",team:"360"},{desc:"基于全新一代数据可视化解决方案 AntV",url:"https://antv.alipay.com/",logo:"https://cdn.docschina.org/home/logo/antv.svg",title:"AntV 可视化解决方案",repository:"https://github.com/ecomfe/echarts",team:"阿里巴巴"},{desc:"一套基于可视化编码的图形语法,以数据驱动,具有高度的易用性和扩展性",url:"https://antv.alipay.com/",logo:"https://cdn.docschina.org/home/logo/antv.svg",title:"G2 可视化图形语法",repository:"https://github.com/antvis/g2/",team:"阿里巴巴"},{desc:"G6 是解决流程图和关系分析的图表库",url:"https://antv.alipay.com/zh-cn/g6/1.x/index.html",logo:"https://cdn.docschina.org/home/logo/antv.svg",title:"G6 关系图类库",repository:"https://github.com/antvis/g6/",team:"阿里巴巴"},{desc:"面向移动端的一套基于可视化图形语法的图表库,具有精简、高性能、易扩展的特性",url:"https://antv.alipay.com/zh-cn/f2/3.x/index.html",logo:"https://cdn.docschina.org/home/logo/antv.svg",title:"F2 移动端图表库",repository:"https://github.com/antvis/f2/",team:"阿里巴巴"},{desc:"一个遵循 Web 标准,用于可视化数据的 JavaScript 库",url:"https://d3js.org.cn/",logo:"https://cdn.docschina.org/home/logo/d3.svg",title:"D3.js",repository:"https://github.com/xswei/d3js_doc"},{desc:"基于 Vue 和 ECharts 封装的图表组件",url:"https://v-charts.js.org/",logo:"https://cdn.docschina.org/home/logo/vue.svg",title:"v-charts",repository:"https://github.com/elemefe/v-charts",team:"饿了么"}],title:"visualization"},{_createTime:1611133617441,_id:"1526e12a6007f2b1002d9ab04359d927",_updateTime:1616657640052,type:"UmiJS 框架",children:[{desc:"可插拔的企业级 React 应用框架",url:"https://umijs.org/",logo:"",title:"UmiJS",repository:"https://github.com/umijs/umi",team:"蚂蚁金服"},{desc:"基于 Umi 的场景化框架",url:"https://alitajs.com/",logo:"",title:"alita",repository:"https://github.com/alitajs/alita"},{desc:"为微前端提供快速、简单和完整的解决方案",url:"https://qiankun.umijs.org/",logo:"",title:"qiankun",repository:"https://github.com/umijs/qiankun",team:"蚂蚁金服"},{desc:"React 组件文档生成工具",url:"https://d.umijs.org/",logo:"",title:"dumi",repository:"https://github.com/umijs/dumi",team:"蚂蚁金服"},{desc:"零基础 UmiJS 入门教程",url:"https://www.yuque.com/umijs/umi",logo:"",title:"Umi 入门",repository:"https://github.com/umijs/umi-course",team:"蚂蚁金服"}],title:"umi"},{_createTime:1611195580301,_id:"79550af26008e4bc004838e050c2c0c1",_updateTime:1611205328048,type:"ant design 系列",children:[{desc:"企业级的 UI 设计语言和 React 实现",url:"https://ant.design/",logo:"https://cdn.docschina.org/home/logo/antdesign.svg",title:"Ant Design",repository:"https://github.com/ant-design/ant-design"},{desc:"开箱即用的中台前端/设计解决方案",url:"https://pro.ant.design/",logo:"https://cdn.docschina.org/home/logo/antdesign.svg",title:"Ant Design Pro",repository:"https://github.com/ant-design/ant-design-pro",team:"阿里巴巴"},{desc:"一个基于 Preact / React / React Native 的 UI 组件库",url:"https://mobile.ant.design/",logo:"https://cdn.docschina.org/home/logo/antdesign.svg",title:"Ant Design Mobile",repository:"https://github.com/ant-design/ant-design-mobile"},{desc:"Ant Design 的 Vue 实现",url:"https://antdv.com/",logo:"https://cdn.docschina.org/home/logo/antdesign.svg",title:"Ant Design Vue",repository:"https://github.com/vueComponent/ant-design-vue"},{desc:"开箱即用的中台前端/设计解决方案",url:"https://pro.antdv.com/",logo:"https://pro.antdv.com/logo.png",title:"Ant Design Pro Vue",repository:"https://github.com/vueComponent/ant-design-vue-pro"},{desc:"Ant Design 的 Angular 实现",url:"https://ng.ant.design/",logo:"https://cdn.docschina.org/home/logo/NG-ZORRO.svg",title:"NG-ZORRO",repository:"https://github.com/NG-ZORRO/ng-zorro-antd"},{desc:"Ant Design Mobile 的 Angular 实现",url:"http://ng.mobile.ant.design/",logo:"https://cdn.docschina.org/home/logo/NG-ZORRO.svg",title:"NG-ZORRO-MOBILE",repository:"https://github.com/NG-ZORRO/ng-zorro-antd-mobile"},{desc:"基于 ng-zorro-antd 的中台前端解决方案",url:"http://ng-alain.com/",logo:"https://cdn.docschina.org/home/logo/ng-alain.svg",title:"ng-alain",repository:"https://github.com/cipchk/ng-alain/"},{contribute:"https://github.com/ant-design/ant-ux",desc:"用于 OG, Sketch,Axure,Affinity,Adobe XD 等 UX 的 sitemap 模板",url:"https://ux.ant.design/",logo:"https://cdn.docschina.org/home/logo/antdesign.svg",title:"Ant UX"},{contribute:"https://github.com/react-component",desc:"ant design 内部使用的 React 基础组件",url:"http://react-component.github.io/badgeboard/",logo:"https://cdn.docschina.org/home/logo/antdesign.svg",title:"react-component"}]}],X=o("5c40"),Y=Object(c["hb"])("data-v-562e6412");Object(c["I"])("data-v-562e6412");var $={class:"dialog-footer"},tt=Object(c["n"])("取 消"),et=Object(c["n"])("确 定");Object(c["G"])();var ot=Y((function(t,e,o,s,i,n){var r=Object(c["O"])("el-input"),l=Object(c["O"])("el-form-item"),a=Object(c["O"])("el-col"),u=Object(c["O"])("el-option"),h=Object(c["O"])("el-select"),d=Object(c["O"])("el-row"),g=Object(c["O"])("el-form"),p=Object(c["O"])("el-button"),m=Object(c["O"])("el-dialog");return Object(c["F"])(),Object(c["k"])(m,{"custom-class":"my-dialog",title:"新增书签",visible:o.isDetailVisible,width:"758px"},{footer:Y((function(){return[Object(c["o"])("span",$,[Object(c["o"])(p,{onClick:s.closeViews,size:"small"},{default:Y((function(){return[tt]})),_:1},8,["onClick"]),Object(c["o"])(p,{type:"primary",onClick:s.submitForm,size:"small"},{default:Y((function(){return[et]})),_:1},8,["onClick"])])]})),default:Y((function(){return[Object(c["o"])(g,{"status-icon":"",ref:"refruleForm",rules:s.rules,model:t.ruleForm,"label-width":"100px",size:"small"},{default:Y((function(){return[Object(c["o"])(d,{gutter:20},{default:Y((function(){return[Object(c["o"])(a,{span:12},{default:Y((function(){return[Object(c["o"])(l,{label:"书签名称",prop:"title"},{default:Y((function(){return[Object(c["o"])(r,{modelValue:t.ruleForm.title,"onUpdate:modelValue":e[1]||(e[1]=function(e){return t.ruleForm.title=e}),placeholder:"请输入书签名称"},null,8,["modelValue"])]})),_:1})]})),_:1}),Object(c["o"])(a,{span:12},{default:Y((function(){return[Object(c["o"])(l,{label:"书签类别",prop:"type"},{default:Y((function(){return[Object(c["o"])(h,{modelValue:t.ruleForm.type,"onUpdate:modelValue":e[2]||(e[2]=function(e){return t.ruleForm.type=e}),placeholder:"请选择书签类别",style:{width:"100%"}},{default:Y((function(){return[(Object(c["F"])(!0),Object(c["k"])(c["b"],null,Object(c["M"])(s.BOOKMARK,(function(t,e){return Object(c["F"])(),Object(c["k"])(u,{value:t,key:e},null,8,["value"])})),128))]})),_:1},8,["modelValue"])]})),_:1})]})),_:1}),Object(c["o"])(a,{span:24},{default:Y((function(){return[Object(c["o"])(l,{label:"LOGO地址",prop:"logo"},{default:Y((function(){return[Object(c["o"])(r,{modelValue:t.ruleForm.logo,"onUpdate:modelValue":e[3]||(e[3]=function(e){return t.ruleForm.logo=e}),placeholder:"请输入LOGO地址"},null,8,["modelValue"])]})),_:1})]})),_:1}),Object(c["o"])(a,{span:24},{default:Y((function(){return[Object(c["o"])(l,{label:"访问地址",prop:"url"},{default:Y((function(){return[Object(c["o"])(r,{modelValue:t.ruleForm.url,"onUpdate:modelValue":e[4]||(e[4]=function(e){return t.ruleForm.url=e}),placeholder:"请输入访问绝对地址"},null,8,["modelValue"])]})),_:1})]})),_:1}),Object(c["o"])(a,{span:24},{default:Y((function(){return[Object(c["o"])(l,{label:"书签描述",prop:"desc"},{default:Y((function(){return[Object(c["o"])(r,{type:"textarea",clearable:"",placeholder:"请输入书签描述",modelValue:t.ruleForm.desc,"onUpdate:modelValue":e[5]||(e[5]=function(e){return t.ruleForm.desc=e})},null,8,["modelValue"])]})),_:1})]})),_:1})]})),_:1})]})),_:1},8,["rules","model"])]})),_:1},8,["visible"])})),ct=(o("a9e3"),o("d81d"),o("7864")),st={model:{value:"isDetailVisible",events:"closeViews"},props:{isDetailVisible:{type:Boolean,default:!1},selectType:{type:Number,default:0},detail:{type:Object,default:function(){}}},setup:function(t,e){var o=JSON.parse(localStorage.getItem("BOOKMARK")),c=o?o.map((function(t){return t.type})):[],s=Object(Q["j"])({ruleForm:{title:"",type:"",desc:"",url:"",logo:""}}),i={title:[{required:!0,message:"请输入书签名称",trigger:"blur"}],type:[{required:!0,message:"请选择书签类别",trigger:"change"}]},n=Object(Q["k"])(null),r=function(){n.value.validate((function(c){if(c){var i=o.map((function(e){var o=Object(H["a"])({},t.detail),c=Object(H["a"])({},s.ruleForm);if("modify"===t.detail.flag){if(o.type===c.type&&e.type===c.type){var i=e.children.findIndex((function(t){return t.title===o.title}));i>-1&&(e.children[i]=c,ct["a"].success("编辑成功"))}else if(o.type!==c.type){if(o.type===e.type){var n=e.children.findIndex((function(t){return t.title===o.title}));e.children.splice(n,1)}c.type===e.type&&(e.children.push(c),ct["a"].success("编辑成功"))}}else e.type===c.type&&(e.children.push(c),ct["a"].success("新增成功"));return e}));localStorage.setItem("BOOKMARK",JSON.stringify(i)),e.emit("fresh"),l()}}))};function l(){n.value.resetFields(),e.emit("closeViews",!1)}return Object(X["eb"])((function(){return t.detail}),(function(e){e&&Object(X["A"])((function(){s.ruleForm=Object(H["a"])({},t.detail)}))}),{deep:!0}),Object(H["a"])(Object(H["a"])({},Object(Q["r"])(s)),{},{closeViews:l,submitForm:r,refruleForm:n,rules:i,BOOKMARK:c})},methods:{}};o("c790");st.render=ot,st.__scopeId="data-v-562e6412";var it=st,nt=Object(c["hb"])("data-v-f6f4d2d2");Object(c["I"])("data-v-f6f4d2d2");var rt={class:"dialog-footer"},lt=Object(c["n"])("取 消"),at=Object(c["n"])("确 定");Object(c["G"])();var ut=nt((function(t,e,o,s,i,n){var r=Object(c["O"])("el-input"),l=Object(c["O"])("el-form-item"),a=Object(c["O"])("el-col"),u=Object(c["O"])("el-row"),h=Object(c["O"])("el-form"),d=Object(c["O"])("el-button"),g=Object(c["O"])("el-dialog");return Object(c["F"])(),Object(c["k"])(g,{"custom-class":"my-dialog",title:"用户登录",visible:o.isLoginVisible,width:"400px"},{footer:nt((function(){return[Object(c["o"])("span",rt,[Object(c["o"])(d,{onClick:s.closeViews,size:"small"},{default:nt((function(){return[lt]})),_:1},8,["onClick"]),Object(c["o"])(d,{type:"primary",onClick:s.submitForm,size:"small"},{default:nt((function(){return[at]})),_:1},8,["onClick"])])]})),default:nt((function(){return[Object(c["o"])(h,{"status-icon":"",ref:"refruleForm",rules:s.rules,model:t.ruleForm,"label-width":"60px",size:"small"},{default:nt((function(){return[Object(c["o"])(u,null,{default:nt((function(){return[Object(c["o"])(a,{span:24},{default:nt((function(){return[Object(c["o"])(l,{label:"邮箱",prop:"email"},{default:nt((function(){return[Object(c["o"])(r,{modelValue:t.ruleForm.email,"onUpdate:modelValue":e[1]||(e[1]=function(e){return t.ruleForm.email=e}),placeholder:"请输入邮箱"},null,8,["modelValue"])]})),_:1})]})),_:1}),Object(c["o"])(a,{span:24},{default:nt((function(){return[Object(c["o"])(l,{label:"密码",prop:"password"},{default:nt((function(){return[Object(c["o"])(r,{modelValue:t.ruleForm.password,"onUpdate:modelValue":e[2]||(e[2]=function(e){return t.ruleForm.password=e}),"show-password":"",placeholder:"请输入密码"},null,8,["modelValue"])]})),_:1})]})),_:1})]})),_:1})]})),_:1},8,["rules","model"])]})),_:1},8,["visible"])})),ht=o("852e"),dt=o.n(ht),gt=o("c72e"),pt=o.n(gt),mt=function(t,e){return new Promise((function(o,c){pt.a.User.logIn(t,e).then((function(t){o(t)})).catch((function(t){c(t)}))}))},bt=function(t,e){return new Promise((function(o,c){pt.a.User.loginWithEmail(e,t).then((function(t){o(t)})).catch((function(t){c(t)}))}))},ft=function(t,e){return new Promise((function(o,c){pt.a.User.logOut(t,e).then((function(t){o(t)}))}))},vt=function(t,e){return new Promise((function(o,c){var s=new pt.a.User;s.setUsername(t),s.setPassword(e),s.signUp().then((function(t){o(t)}),(function(t){c(t)}))}))},jt=function(t){return new Promise((function(e,o){var c=new pt.a.User;c.loginWithAuthData({openid:t.openid,access_token:t.access_token,expires_in:t.expires_in},"weixin").then((function(t){e(t)})).catch((function(t){o(t)}))}))},yt={login:mt,logout:ft,register:vt,loginEmail:bt,getInfo:jt},Ot={model:{value:"isLoginVisible",events:"closeViews"},props:{isLoginVisible:{type:Boolean,default:!1}},setup:function(t,e){var o=Object(Q["j"])({ruleForm:{username:"",password:""}}),c={password:[{required:!0,message:"请输入密码",trigger:"blur"}],email:[{type:"email",required:!0,message:"请输入正确的邮箱",trigger:"blur"}]},s=Object(Q["k"])(null),i=function(){s.value.validate((function(t){if(t){var c=Object(H["a"])({},o.ruleForm);yt.login(c.email,c.password).then((function(t){dt.a.set("userInfo",JSON.stringify(t)),e.emit("setUser"),ct["a"].success("登录成功"),n()})).catch((function(t){210===t.code?ct["a"].error("账号或密码不正确"):211===t.code&&yt.register(c.email,c.password).then((function(t){dt.a.set("userInfo",JSON.stringify(t)),e.emit("setUser"),ct["a"].success("注册成功"),n()}))}))}}))};function n(){s.value.resetFields(),e.emit("closeViews",!1)}return Object(H["a"])(Object(H["a"])({},Object(Q["r"])(o)),{},{closeViews:n,submitForm:i,refruleForm:s,rules:c})},methods:{}};o("2b42");Ot.render=ut,Ot.__scopeId="data-v-f6f4d2d2";var wt=Ot,kt=o("cffa"),St=(o("7db0"),function(t,e){return new Promise((function(o,c){var s=pt.a.Object.extend(t),i=pt.a.User.current(),n=new s;n.set("formDatas",e.formDatas),n.set("user",i),n.save().then((function(t){o(t)}),(function(t){c(t)}))}))}),xt=function(t,e){return new Promise((function(o,c){var s=new pt.a.Query(t),i=pt.a.User.current();for(var n in e)e[n]&&s.equalTo(n,e[n]);s.equalTo("user",i),s.find().then((function(t){o(t)}),(function(t){c(t)}))}))};o("3ca3"),o("ddb0"),o("2b3d");function Vt(t){var e=[],o=function t(e,o){var c=e.children;if(c&&c.length>0)for(var s=0;s<c.length;s++){var i=c[s];if("P"!==i.tagName&&"H3"!==i.tagName)if("DL"===i.tagName)t(c[s],o);else{for(var n=null,r=i.children,l=!1,a=0;a<r.length;a++)"H3"!==r[a].tagName&&"DL"!==r[a].tagName||(l=!0);if(l)n={type:"DT"===i.tagName&&i.querySelector("h3")?i.querySelector("h3").innerText:"",folder:!0,children:[]},t(c[s],n.children);else{var u=i.querySelector("a");u&&(n={title:null===u||void 0===u?void 0:u.innerText,url:null===u||void 0===u?void 0:u.href})}n&&o.push(n)}}};o(t,e);var c=e.filter((function(t){return t.folder}));return _t(c)}var _t=function(t){var e=[],o=function t(o){for(var c=0;c<o.length;c++)if(o[c].folder){t(o[c].children);var s=o[c];s.children=s.children.filter((function(t){return!t.folder})),e.push(s)}};return o(t),e};function Jt(){if(localStorage.getItem("BOOKMARK")){var t=localStorage.getItem("BOOKMARK"),e=document.createElement("a");e.download="kestrel-bookmark.json",e.style.display="none";var o=new Blob([t]);e.href=URL.createObjectURL(o),document.body.appendChild(e),e.click(),document.body.removeChild(e)}else this.$message.warning("暂无可导出数据")}var Rt=[],It={components:{Dialog:it,Login:wt},name:"kestrel-bookmark",setup:function(){var t=function t(e){var o,c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],s=Object(W["a"])(e);try{for(s.s();!(o=s.n()).done;){var i=o.value;Array.isArray(i.children)?t(i.children,c):c.push(i)}}catch(n){s.e(n)}finally{s.f()}return c},e=Object(Q["j"])({activeIndex:0,data:[],bookMark:[],searchVal:"",allData:[],isDetailVisible:!1,isLoginVisible:!1,detail:{},userInfo:{username:"未登录"}}),o=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){};dt.a.get("userInfo")&&(e.userInfo=JSON.parse(dt.a.get("userInfo"))),e.userInfo.objectId?xt("BOOKMARK").then((function(t){t.length>0?Rt=JSON.parse(t[0].attributes.formDatas):(localStorage.setItem("BOOKMARK",JSON.stringify(Z)),Rt=JSON.parse(JSON.stringify(Z)))})).catch((function(){localStorage.setItem("BOOKMARK",JSON.stringify(Z)),Rt=JSON.parse(JSON.stringify(Z))})).finally((function(){o(),e.data=Rt,e.bookMark=Rt[0].children,e.allData=t(Rt)})):(localStorage.getItem("BOOKMARK")?Rt=JSON.parse(localStorage.getItem("BOOKMARK")):(localStorage.setItem("BOOKMARK",JSON.stringify(Z)),Rt=JSON.parse(JSON.stringify(Z))),e.data=Rt,e.bookMark=Rt[0].children,e.allData=t(Rt),o())},c=function(){dt.a.get("userInfo")?e.userInfo=JSON.parse(dt.a.get("userInfo")):e.userInfo={username:"未登录"},o()};c(),Object(X["eb"])((function(){return e.searchVal}),(function(){e.bookMark=e.allData.filter((function(t){return t.title.toLowerCase().indexOf(e.searchVal.toLowerCase())>-1}))}));var s=function(t,o){e.bookMark=t.children,e.activeIndex=o},i=function(t){return window.open(t.url,"_target")};function n(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"add",c=Object(H["a"])({},t);e.detail="modify"===o?Object.assign(c,{type:Rt[e.activeIndex].type,flag:"modify"}):Object.assign({},{type:Rt[e.activeIndex].type,flag:"add"}),e.isDetailVisible=!0}var r=function(){e.isLoginVisible=!0},l=function(t){return e.isDetailVisible=t},a=function(t){return e.isLoginVisible=t},u=function(){var t=Object(G["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,o((function(){e.data=Rt,e.bookMark=Rt[e.activeIndex].children}));case 2:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}(),h=function(t){for(var o=JSON.parse(localStorage.getItem("BOOKMARK")),c=Object.assign(t,{type:Rt[e.activeIndex].type}),s=0;s<o.length;s++)if(c.type===o[s].type){var i=o[s].children.findIndex((function(t){return t.title===c.title}));i>-1&&(o[s].children.splice(i,1),localStorage.setItem("BOOKMARK",JSON.stringify(o)),ct["a"].success("删除成功"),u())}},d=function(){ct["b"].confirm("确认要退出登录?","温馨提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((function(){var t={username:"",password:""};yt.logout(t.username,t.password).then((function(t){dt.a.remove("userInfo"),c()})),Object(ct["a"])({type:"success",message:"已退出登录"})}))},g=function(){e.userInfo.objectId?d():r()},p=function(){if(e.userInfo.objectId){var t=document.getElementById("file");t.dispatchEvent(new MouseEvent("click"));var o=document.getElementById("mybookmark");document.getElementById("file").addEventListener("change",(function(){var t=document.getElementById("file").files[0],e=new FileReader;e.readAsText(t,"utf-8"),e.onload=function(){o.innerHTML=e.result;var t=JSON.stringify(Vt(o));if(t){var c={formDatas:t};m(c)}}}))}else ct["a"].warning("请先登录")},m=function(t){St("BOOKMARK",t).then((function(t){ct["a"].success("导入成功"),o()}))};return Object(H["a"])(Object(H["a"])({deleteClick:h},Object(Q["r"])(e)),{},{selectType:s,navigate:i,add:n,closeViews:l,closeLoginViews:a,search:u,importBookmark:p,exportBookmark:Jt,loginClick:g,setUsername:c})},methods:{beforeEnter:function(t){t.style.opacity=0,t.style.height=0},enter:function(t,e){kt["a"].to(t,{opacity:1,height:"1.6em",delay:.15*t.dataset.index,onComplete:e})},leave:function(t,e){kt["a"].to(t,{opacity:0,height:0,delay:.15*t.dataset.index,onComplete:e})}}};o("1423");It.render=q,It.__scopeId="data-v-5ebba4d0";var Ct=It;o("7dd6");pt.a.init({appId:"BwLrCgdVyLs52mJO1HcrXakI-gzGzoHsz",appKey:"25gNwzw4dV7IAh7i0IzDnYvV",serverURL:"https://bwlrcgdv.lc-cn-n1-shared.com"});var Mt=Object(c["j"])(Ct);Mt.use(ct["c"]),Mt.mount("#app")},"945b":function(t,e,o){},a5f7:function(t,e,o){t.exports=o.p+"img/logo.f38dc2e8.svg"},b23c:function(t,e,o){},b3c0:function(t,e,o){t.exports=o.p+"img/add.ca18f050.svg"},c790:function(t,e,o){"use strict";o("f175")},e8ed:function(t,e,o){t.exports=o.p+"img/blog.f57ba53d.svg"},f175:function(t,e,o){},fe3c:function(t,e,o){t.exports=o.p+"img/file.807fb7b5.svg"}});
|
||
//# sourceMappingURL=app.7e6249a2.js.map
|