bookmark/js/app.js
caojiezi2003 883a42fa3b 更新为构建的静态文件
更改为静态文件,以便于在Cloudflare的Pages直接部署。
2023-10-25 14:31:21 +08:00

2 lines
65 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function(e){function t(t){for(var s,i,a=t[0],r=t[1],n=t[2],h=0,g=[];h<a.length;h++)i=a[h],Object.prototype.hasOwnProperty.call(c,i)&&c[i]&&g.push(c[i][0]),c[i]=0;for(s in r)Object.prototype.hasOwnProperty.call(r,s)&&(e[s]=r[s]);d&&d(t);while(g.length)g.shift()();return l.push.apply(l,n||[]),o()}function o(){for(var e,t=0;t<l.length;t++){for(var o=l[t],s=!0,a=1;a<o.length;a++){var r=o[a];0!==c[r]&&(s=!1)}s&&(l.splice(t--,1),e=i(i.s=o[0]))}return e}var s={},c={app:0},l=[];function i(t){if(s[t])return s[t].exports;var o=s[t]={i:t,l:!1,exports:{}};return e[t].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=e,i.c=s,i.d=function(e,t,o){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)i.d(o,s,function(t){return e[t]}.bind(null,s));return o},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="";var a=window["webpackJsonp"]=window["webpackJsonp"]||[],r=a.push.bind(a);a.push=t,a=a.slice();for(var n=0;n<a.length;n++)t(a[n]);var d=r;l.push([0,"chunk-vendors"]),o()})({0:function(e,t,o){e.exports=o("56d7")},"0a17":function(e,t,o){e.exports=o.p+"img/search.svg"},2698:function(e,t,o){},"27e3":function(e,t,o){},"291a":function(e,t,o){"use strict";o("2698")},"2df4":function(e,t,o){e.exports=o.p+"img/translate.svg"},"385f":function(e,t,o){"use strict";o("c871")},"3ad9":function(e,t,o){"use strict";o("27e3")},"4d66":function(e,t,o){e.exports=o.p+"img/user.svg"},"56d7":function(e,t,o){"use strict";o.r(t);var s=o("24fc"),c=o("a5f7"),l=o.n(c),i=o("0a17"),a=o.n(i),r=o("b3c0"),n=o.n(r),d=o("e8ed"),h=o.n(d),g=o("2df4"),p=o.n(g),u=o("4d66"),m=o.n(u),b=o("fe3c"),j=o.n(b);const f=e=>(Object(s["M"])("data-v-58ce68a6"),e=e(),Object(s["K"])(),e),v={id:"app"},O={class:"bookmark",id:"bookmark"},y={class:"tool-bar"},S=f(()=>Object(s["n"])("div",{class:"tool-logo"},[Object(s["n"])("a",{href:"",target:"_blank"},[Object(s["n"])("img",{src:l.a,title:"Jonylee的设计导航",class:"tool-icon"}),Object(s["q"])("Web书签")])],-1)),w={class:"search-box"},k=f(()=>Object(s["n"])("img",{src:a.a},null,-1)),x=f(()=>Object(s["n"])("a",{title:"主站",href:"https://Jonylee.top",target:"_blank"},[Object(s["n"])("img",{src:h.a,class:"tool-icon"})],-1)),V=f(()=>Object(s["n"])("a",{title:"Github",href:"https://github.com/caojiezi2003/bookmark",target:"_blank"},[Object(s["n"])("img",{src:p.a,class:"tool-icon"})],-1)),C=f(()=>Object(s["n"])("img",{src:m.a,class:"tool-icon",title:"已登录"},null,-1)),_=["title"],J={class:"box-m"},R={class:"left-box"},I={class:"left-box-item"},M=["onClick"],A=f(()=>Object(s["n"])("img",{src:j.a},null,-1)),N={class:"text-elipss"},z={class:"import-tool"},F=f(()=>Object(s["n"])("span",{class:"import-text"},"导入/导出:",-1)),U={type:"file",ref:"filElem",id:"file"},D={class:"right-box"},B=["onClick"],T={class:"logo-img"},E=["src"],P={class:"logo-box"},L={class:"logo-box-tools"},K=["onClick"],q=["onClick"],G={class:"title"},W={class:"subtitle"},H={key:1,class:"card-item-nodata"},Q=Object(s["p"])('<div data-v-58ce68a6><svg width="66" height="68" viewBox="0 0 66 68" class="icon empty-icon" data-v-8739e5ce="" data-v-58ce68a6><g fill="none" fill-rule="evenodd" transform="translate(4 3)" data-v-8739e5ce="" data-v-58ce68a6><g fill="#F7F7F7" data-v-8739e5ce="" data-v-58ce68a6><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="" data-v-58ce68a6></path></g><rect width="56" height="60" x="1.139" y="1.338" stroke="#EBEBEB" stroke-width="2" rx="6" data-v-8739e5ce="" data-v-58ce68a6></rect></g></svg><span class="empty-text" data-v-8739e5ce="" data-v-58ce68a6>暂无数据</span></div>',1),Z=[Q];function X(e,t,o,c,l,i){const a=Object(s["S"])("Dialog"),r=Object(s["S"])("Login"),d=Object(s["S"])("Configd"),h=Object(s["S"])("Bg");return Object(s["J"])(),Object(s["m"])(s["b"],null,[Object(s["n"])("div",v,[Object(s["n"])("div",O,[Object(s["n"])("div",y,[S,Object(s["n"])("div",null,[Object(s["n"])("div",w,[k,Object(s["kb"])(Object(s["n"])("input",{type:"text",placeholder:"请输入书签名称","onUpdate:modelValue":t[0]||(t[0]=t=>e.searchVal=t)},null,512),[[s["fb"],e.searchVal]])]),Object(s["n"])("img",{src:n.a,class:"tool-icon",onClick:t[1]||(t[1]=e=>c.add({},"add"))}),x,V,Object(s["n"])("span",{class:"login-s",onClick:t[2]||(t[2]=(...e)=>c.loginClick&&c.loginClick(...e))},[C,Object(s["n"])("span",{class:"login-status",title:e.userInfo.username},Object(s["W"])(e.userInfo.username.slice(0,5)),9,_)])])]),Object(s["n"])("div",J,[Object(s["n"])("div",R,[Object(s["n"])("div",I,[(Object(s["J"])(!0),Object(s["m"])(s["b"],null,Object(s["Q"])(e.data,(t,o)=>(Object(s["J"])(),Object(s["m"])("div",{class:Object(s["A"])(["label",e.activeIndex===o?"active":"inactive"]),key:o,onClick:e=>c.selectType(t,o)},[A,Object(s["n"])("div",N,Object(s["W"])(t.type),1)],10,M))),128))]),Object(s["n"])("div",z,[F,Object(s["n"])("i",{class:"el-icon-upload2",title:"导入浏览器书签",onClick:t[3]||(t[3]=(...e)=>c.importBookmark&&c.importBookmark(...e))},[Object(s["n"])("input",U,null,512)]),Object(s["n"])("i",{class:"el-icon-download",title:"导出浏览器书签",onClick:t[4]||(t[4]=(...e)=>c.exportBookmark&&c.exportBookmark(...e))}),Object(s["n"])("i",{class:"el-icon-setting",title:"配置项",onClick:t[5]||(t[5]=(...e)=>c.configClick&&c.configClick(...e))}),Object(s["n"])("i",{class:"el-icon-refresh",title:"重置",onClick:t[6]||(t[6]=(...e)=>c.resetClick&&c.resetClick(...e))})])]),Object(s["n"])("div",D,[e.bookMark.length?(Object(s["J"])(),Object(s["k"])(s["f"],{key:0,name:"staggered-fade",class:"card-s",tag:"ul",css:!1,onBeforeEnter:i.beforeEnter,onEnter:i.enter,onLeave:i.leave},{default:Object(s["jb"])(()=>[(Object(s["J"])(!0),Object(s["m"])(s["b"],null,Object(s["Q"])(e.bookMark,(e,t)=>(Object(s["J"])(),Object(s["m"])("div",{class:"card-item list-complete-item",key:t,onClick:t=>c.navigate(e)},[Object(s["n"])("div",T,[Object(s["n"])("img",{src:e.logo?e.logo:"/img/logo.svg"},null,8,E)]),Object(s["n"])("div",P,[Object(s["n"])("span",L,[Object(s["n"])("i",{class:"el-icon-edit",onClick:Object(s["mb"])(t=>c.add(e,"modify"),["stop"])},null,8,K),Object(s["n"])("i",{class:"el-icon-delete",onClick:Object(s["mb"])(t=>c.deleteClick(e),["stop"])},null,8,q)]),Object(s["n"])("span",G,Object(s["W"])(e.title||"Kestrel-bookmark"),1),Object(s["n"])("span",W,Object(s["W"])(e.desc||"红隼书签-为中国 Web 前端开发人员提供优质网站导航"),1)])],8,B))),128))]),_:1},8,["onBeforeEnter","onEnter","onLeave"])):Object(s["l"])("",!0),e.bookMark.length?Object(s["l"])("",!0):(Object(s["J"])(),Object(s["m"])("div",H,Z))])])])]),Object(s["r"])(a,{class:"my-dialog",modelValue:e.isDetailVisible,"onUpdate:modelValue":t[7]||(t[7]=t=>e.isDetailVisible=t),onCloseViews:c.closeViews,detail:e.detail,selectType:e.activeIndex,onFresh:c.search},null,8,["modelValue","onCloseViews","detail","selectType","onFresh"]),Object(s["r"])(r,{modelValue:e.isLoginVisible,"onUpdate:modelValue":t[8]||(t[8]=t=>e.isLoginVisible=t),onCloseViews:c.closeLoginViews,onSetUser:c.setUsername},null,8,["modelValue","onCloseViews","onSetUser"]),Object(s["r"])(d,{modelValue:e.isConfigVisible,"onUpdate:modelValue":t[9]||(t[9]=t=>e.isConfigVisible=t),onCloseViews:c.closeConfigViews,onFresh:c.fresh},null,8,["modelValue","onCloseViews","onFresh"]),Object(s["r"])(h,{ref:"bgRef"},null,512)],64)}o("c6fc");const Y=[{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 技术的 JavaScriptTypeScript它提供了与 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 是基于 VueVue@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"}]}],$={class:"dialog-footer"};function ee(e,t,o,c,l,i){const a=Object(s["S"])("el-input"),r=Object(s["S"])("el-form-item"),n=Object(s["S"])("el-col"),d=Object(s["S"])("el-option"),h=Object(s["S"])("el-select"),g=Object(s["S"])("el-row"),p=Object(s["S"])("el-form"),u=Object(s["S"])("el-button"),m=Object(s["S"])("el-dialog");return Object(s["J"])(),Object(s["k"])(m,{"custom-class":"my-dialog",title:"新增书签",visible:o.isDetailVisible,width:"758px"},{footer:Object(s["jb"])(()=>[Object(s["n"])("span",$,[Object(s["r"])(u,{onClick:c.closeViews,size:"small"},{default:Object(s["jb"])(()=>[Object(s["q"])("取 消")]),_:1},8,["onClick"]),Object(s["r"])(u,{type:"primary",onClick:c.submitForm,size:"small"},{default:Object(s["jb"])(()=>[Object(s["q"])("确 定")]),_:1},8,["onClick"])])]),default:Object(s["jb"])(()=>[Object(s["r"])(p,{"status-icon":"",ref:"refruleForm",rules:c.rules,model:e.ruleForm,"label-width":"100px",size:"small"},{default:Object(s["jb"])(()=>[Object(s["r"])(g,{gutter:20},{default:Object(s["jb"])(()=>[Object(s["r"])(n,{span:12},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"书签名称",prop:"title"},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{modelValue:e.ruleForm.title,"onUpdate:modelValue":t[0]||(t[0]=t=>e.ruleForm.title=t),placeholder:"请输入书签名称"},null,8,["modelValue"])]),_:1})]),_:1}),Object(s["r"])(n,{span:12},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"书签类别",prop:"type"},{default:Object(s["jb"])(()=>[Object(s["r"])(h,{modelValue:e.ruleForm.type,"onUpdate:modelValue":t[1]||(t[1]=t=>e.ruleForm.type=t),placeholder:"请选择书签类别",style:{width:"100%"}},{default:Object(s["jb"])(()=>[(Object(s["J"])(!0),Object(s["m"])(s["b"],null,Object(s["Q"])(c.BOOKMARK,(e,t)=>(Object(s["J"])(),Object(s["k"])(d,{value:e,key:t},null,8,["value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1}),Object(s["r"])(n,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"LOGO地址",prop:"logo"},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{modelValue:e.ruleForm.logo,"onUpdate:modelValue":t[2]||(t[2]=t=>e.ruleForm.logo=t),placeholder:"请输入LOGO地址"},null,8,["modelValue"])]),_:1})]),_:1}),Object(s["r"])(n,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"访问地址",prop:"url"},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{modelValue:e.ruleForm.url,"onUpdate:modelValue":t[3]||(t[3]=t=>e.ruleForm.url=t),placeholder:"请输入访问绝对地址"},null,8,["modelValue"])]),_:1})]),_:1}),Object(s["r"])(n,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"书签描述",prop:"desc"},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{type:"textarea",clearable:"",placeholder:"请输入书签描述",modelValue:e.ruleForm.desc,"onUpdate:modelValue":t[4]||(t[4]=t=>e.ruleForm.desc=t)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})]),_:1},8,["rules","model"])]),_:1},8,["visible"])}var te=o("ea20"),oe={model:{value:"isDetailVisible",events:"closeViews"},props:{isDetailVisible:{type:Boolean,default:!1},selectType:{type:Number,default:0},detail:{type:Object,default:()=>{}}},setup(e,t){const o=JSON.parse(localStorage.getItem("BOOKMARK")),c=o?o.map(e=>e.type):[],l=Object(s["N"])({ruleForm:{title:"",type:"",desc:"",url:"",logo:""}}),i={title:[{required:!0,message:"请输入书签名称",trigger:"blur"}],type:[{required:!0,message:"请选择书签类别",trigger:"change"}]},a=Object(s["O"])(null),r=()=>{a.value.validate(s=>{if(s){const s=o.map(t=>{const o={...e.detail},s={...l.ruleForm};if("modify"===e.detail.flag){if(o.type===s.type&&t.type===s.type){const e=t.children.findIndex(e=>e.title===o.title);e>-1&&(t.children[e]=s,te["a"].success("编辑成功"))}else if(o.type!==s.type){if(o.type===t.type){const e=t.children.findIndex(e=>e.title===o.title);t.children.splice(e,1)}s.type===t.type&&(t.children.push(s),te["a"].success("编辑成功"))}}else t.type===s.type&&(t.children.push(s),te["a"].success("新增成功"));return t});localStorage.setItem("BOOKMARK",JSON.stringify(s)),t.emit("fresh"),n()}})};function n(){a.value.resetFields(),t.emit("closeViews",!1)}return Object(s["hb"])(()=>e.detail,t=>{t&&Object(s["z"])(()=>{l.ruleForm={...e.detail}})},{deep:!0}),{...Object(s["Z"])(l),closeViews:n,submitForm:r,refruleForm:a,rules:i,BOOKMARK:c}}},se=(o("385f"),o("c1e3")),ce=o.n(se);const le=ce()(oe,[["render",ee],["__scopeId","data-v-1232f72c"]]);var ie=le;const ae={class:"bg"};var re={__name:"Bg",setup(e,{expose:t}){const o={direction:"left-right",isPausedWhenNotInView:!0,opacity:[1,1],states:{"default-state":{gradients:[[{color:"#833ab4",pos:.2},{color:"#fd1d1d",pos:.8},{color:"#38ef7d",pos:1}],[{color:"#40e0d0",pos:0},{color:"#ff8c00",pos:.2},{color:"#ff0080",pos:.75}]]}},image:{source:"./img/bg.jpg",position:["center","bottom"],stretchMode:["stretch","stretch-if-bigger"],blendingMode:"multiply"}};let c=null;const l=()=>{let e=localStorage.getItem("granimConfig");e=e?JSON.parse(e):o,delete e.opacity,c=new Granim({element:"#canvas-complex",...e,opacity:1})};return t({init:l}),Object(s["G"])(()=>{c&&c.destroy(),l()}),(e,t)=>(Object(s["J"])(),Object(s["m"])("div",ae))}};o("3ad9");const ne=ce()(re,[["__scopeId","data-v-08a9f3f2"]]);var de=ne;const he={class:"dialog-footer"};function ge(e,t,o,c,l,i){const a=Object(s["S"])("el-input"),r=Object(s["S"])("el-form-item"),n=Object(s["S"])("el-col"),d=Object(s["S"])("el-row"),h=Object(s["S"])("el-form"),g=Object(s["S"])("el-button"),p=Object(s["S"])("el-dialog");return Object(s["J"])(),Object(s["k"])(p,{"custom-class":"my-dialog",title:"用户登录",visible:o.isLoginVisible,width:"400px"},{footer:Object(s["jb"])(()=>[Object(s["n"])("span",he,[Object(s["r"])(g,{onClick:c.closeViews,size:"small"},{default:Object(s["jb"])(()=>[Object(s["q"])("取 消")]),_:1},8,["onClick"]),Object(s["r"])(g,{type:"primary",onClick:c.submitForm,size:"small"},{default:Object(s["jb"])(()=>[Object(s["q"])("确 定")]),_:1},8,["onClick"])])]),default:Object(s["jb"])(()=>[Object(s["r"])(h,{"status-icon":"",ref:"refruleForm",rules:c.rules,model:e.ruleForm,"label-width":"60px",size:"small"},{default:Object(s["jb"])(()=>[Object(s["r"])(d,null,{default:Object(s["jb"])(()=>[Object(s["r"])(n,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"邮箱",prop:"email"},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{modelValue:e.ruleForm.email,"onUpdate:modelValue":t[0]||(t[0]=t=>e.ruleForm.email=t),placeholder:"请输入邮箱"},null,8,["modelValue"])]),_:1})]),_:1}),Object(s["r"])(n,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(r,{label:"密码",prop:"password"},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{modelValue:e.ruleForm.password,"onUpdate:modelValue":t[1]||(t[1]=t=>e.ruleForm.password=t),"show-password":"",placeholder:"请输入密码"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})]),_:1},8,["rules","model"])]),_:1},8,["visible"])}var pe=o("0beb"),ue=o.n(pe),me=o("6d9a"),be=o.n(me);const je=(e,t)=>new Promise((o,s)=>{be.a.User.logIn(e,t).then(e=>{o(e)}).catch(e=>{s(e)})}),fe=(e,t)=>new Promise((o,s)=>{be.a.User.loginWithEmail(t,e).then(e=>{o(e)}).catch(e=>{s(e)})}),ve=(e,t)=>new Promise((o,s)=>{be.a.User.logOut(e,t).then(e=>{o(e)})}),Oe=(e,t)=>new Promise((o,s)=>{const c=new be.a.User;c.setUsername(e),c.setPassword(t),c.signUp().then(e=>{o(e)},e=>{s(e)})}),ye=e=>new Promise((t,o)=>{const s=new be.a.User;s.loginWithAuthData({openid:e.openid,access_token:e.access_token,expires_in:e.expires_in},"weixin").then((function(e){t(e)})).catch((function(e){o(e)}))});var Se={login:je,logout:ve,register:Oe,loginEmail:fe,getInfo:ye},we={model:{value:"isLoginVisible",events:"closeViews"},props:{isLoginVisible:{type:Boolean,default:!1}},setup(e,t){const o=Object(s["N"])({ruleForm:{username:"",password:""}}),c={password:[{required:!0,message:"请输入密码",trigger:"blur"}],email:[{type:"email",required:!0,message:"请输入正确的邮箱",trigger:"blur"}]},l=Object(s["O"])(null),i=()=>{l.value.validate(e=>{if(e){const e={...o.ruleForm};Se.login(e.email,e.password).then(e=>{ue.a.set("userInfo",JSON.stringify(e)),t.emit("setUser"),te["a"].success("登录成功"),a()}).catch(o=>{210===o.code?te["a"].error("账号或密码不正确"):211===o.code&&Se.register(e.email,e.password).then(e=>{ue.a.set("userInfo",JSON.stringify(e)),t.emit("setUser"),te["a"].success("注册成功"),a()})})}})};function a(){l.value.resetFields(),t.emit("closeViews",!1)}return{...Object(s["Z"])(o),closeViews:a,submitForm:i,refruleForm:l,rules:c}}};o("de0e");const ke=ce()(we,[["render",ge],["__scopeId","data-v-32ee5f5a"]]);var xe=ke;const Ve=e=>(Object(s["M"])("data-v-6f880459"),e=e(),Object(s["K"])(),e),Ce=Ve(()=>Object(s["n"])("div",{class:"granim-box"},[Object(s["n"])("canvas",{id:"granim-box"})],-1)),_e={class:"dialog-footer"};function Je(e,t,o,c,l,i){const a=Object(s["S"])("el-form-item"),r=Object(s["S"])("el-col"),n=Object(s["S"])("el-option"),d=Object(s["S"])("el-select"),h=Object(s["S"])("el-input"),g=Object(s["S"])("el-row"),p=Object(s["S"])("el-form"),u=Object(s["S"])("el-button"),m=Object(s["S"])("el-dialog");return Object(s["J"])(),Object(s["k"])(m,{"custom-class":"my-dialog",title:"配置项",visible:o.isConfigVisible,width:"700px"},{footer:Object(s["jb"])(()=>[Object(s["n"])("span",_e,[Object(s["r"])(u,{onClick:c.closeViews,size:"small"},{default:Object(s["jb"])(()=>[Object(s["q"])("关 闭")]),_:1},8,["onClick"])])]),default:Object(s["jb"])(()=>[Object(s["r"])(p,{"status-icon":"",ref:"refruleForm",rules:c.rules,model:e.ruleForm,"label-width":"60px",size:"small"},{default:Object(s["jb"])(()=>[Object(s["r"])(g,null,{default:Object(s["jb"])(()=>[Object(s["r"])(r,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"背景"},{default:Object(s["jb"])(()=>[Object(s["n"])("input",{id:"file",onChange:t[0]||(t[0]=(...e)=>c.handleFileChange&&c.handleFileChange(...e)),accept:"image/*",type:"file",multiple:!1},null,32)]),_:1})]),_:1}),Object(s["r"])(r,{span:12},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"主题",class:"slelec"},{default:Object(s["jb"])(()=>[Object(s["r"])(d,{modelValue:e.theme,"onUpdate:modelValue":t[1]||(t[1]=t=>e.theme=t),placeholder:"光影",onChange:c.setGranim},{default:Object(s["jb"])(()=>[Object(s["r"])(n,{label:"清新",value:"light"}),Object(s["r"])(n,{label:"暗黑",value:"dark"})]),_:1},8,["modelValue","onChange"])]),_:1})]),_:1}),Object(s["r"])(r,{span:12},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"光影",class:"slelec"},{default:Object(s["jb"])(()=>[Object(s["r"])(d,{modelValue:e.selectVal,"onUpdate:modelValue":t[2]||(t[2]=t=>e.selectVal=t),placeholder:"光影",onChange:c.setGranim},{default:Object(s["jb"])(()=>[(Object(s["J"])(!0),Object(s["m"])(s["b"],null,Object(s["Q"])(e.options,e=>(Object(s["J"])(),Object(s["k"])(n,{key:e.value,label:e.label,value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onChange"])]),_:1})]),_:1}),Object(s["r"])(r,{span:12},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"亮度",class:"slelec"},{default:Object(s["jb"])(()=>[Object(s["r"])(h,{modelValue:e.opacity0,"onUpdate:modelValue":t[3]||(t[3]=t=>e.opacity0=t),placeholder:"亮度",onkeyup:"value=value.replace(/[^\\d.]/g,0)",onChange:c.setGranim},null,8,["modelValue","onChange"])]),_:1})]),_:1}),Object(s["r"])(r,{span:12},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"位置"},{default:Object(s["jb"])(()=>[Object(s["r"])(d,{modelValue:e.direction,"onUpdate:modelValue":t[4]||(t[4]=t=>e.direction=t),placeholder:"位置",onChange:c.setGranim},{default:Object(s["jb"])(()=>[(Object(s["J"])(!0),Object(s["m"])(s["b"],null,Object(s["Q"])(e.directions,e=>(Object(s["J"])(),Object(s["k"])(n,{key:e.value,label:e.label,value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onChange"])]),_:1})]),_:1}),Object(s["r"])(r,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"效果"},{default:Object(s["jb"])(()=>[Ce]),_:1})]),_:1}),Object(s["r"])(r,{span:24},{default:Object(s["jb"])(()=>[Object(s["r"])(a,{label:"透明度",class:"opacity"},{default:Object(s["jb"])(()=>[Object(s["r"])(h,{modelValue:e.opacity1,"onUpdate:modelValue":t[5]||(t[5]=t=>e.opacity1=t),placeholder:"透明度参数1",onkeyup:"value=value.replace(/[^\\d]/g,0)"},null,8,["modelValue"]),Object(s["r"])(h,{modelValue:e.opacity2,"onUpdate:modelValue":t[6]||(t[6]=t=>e.opacity2=t),placeholder:"透明度参数2",onkeyup:"value=value.replace(/[^\\d]/g,0)"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})]),_:1},8,["rules","model"])]),_:1},8,["visible"])}const Re={gradient1:{direction:"left-right",image:{source:"./img/bg.jpg",position:["center","bottom"],stretchMode:["stretch","stretch-if-bigger"],blendingMode:"multiply"},states:{"default-state":{gradients:[[{color:"#833ab4",pos:.2},{color:"#fd1d1d",pos:.8},{color:"#38ef7d",pos:1}],[{color:"#40e0d0",pos:0},{color:"#ff8c00",pos:.2},{color:"#ff0080",pos:.75}]]}}},gradient2:{direction:"left-right",opacity:[1,1],image:{source:"./img/bg.jpg",position:["center","bottom"],stretchMode:["stretch","stretch-if-bigger"],blendingMode:"multiply"},states:{"default-state":{gradients:[["#AA076B","#61045F"],["#02AAB0","#00CDAC"],["#DA22FF","#9733EE"]]}}},gradient3:{direction:"left-right",image:{source:"./img/bg.jpg",position:["center","bottom"],stretchMode:["stretch","stretch-if-bigger"],blendingMode:"multiply"},states:{"default-state":{gradients:[["#ff9966","#ff5e62"],["#00F260","#0575E6"],["#e1eec3","#f05053"]]}}},gradient4:{direction:"top-bottom",image:{source:"./img/bg.jpg",position:["center","bottom"],stretchMode:["stretch","stretch-if-bigger"],blendingMode:"multiply"},states:{"default-state":{gradients:[["#29323c","#485563"],["#FF6B6B","#556270"],["#80d3fe","#7ea0c4"],["#f0ab51","#eceba3"]],transitionSpeed:7e3}}}};var Ie={model:{value:"isConfigVisible",events:"closeViews"},props:{isConfigVisible:{type:Boolean,default:!1}},setup(e,t){const o=Object(s["N"])({ruleForm:{username:"",password:""},options:[{label:"渐变-01",value:"gradient1"},{label:"渐变-02",value:"gradient2"},{label:"渐变-03",value:"gradient3"},{label:"迷雾森林",value:"gradient4"}],directions:[{label:"从上到下",value:"top-bottom"},{label:"从左到右",value:"left-right"},{label:"环形",value:"diagonal"},{label:"对角线",value:"radial"},{label:"自定义",value:"custom"}],selectVal:"gradient4",direction:"left-right",opacity1:.15,opacity2:.15,imageUrl:"",granimRef:null,theme:"light",opacity0:.8}),c={password:[{required:!0,message:"请输入密码",trigger:"blur"}],email:[{type:"email",required:!0,message:"请输入正确的邮箱",trigger:"blur"}]},l=Object(s["O"])(null),i=()=>{l.value.validate(e=>{if(e){const e={...o.ruleForm};Se.login(e.email,e.password).then(e=>{ue.a.set("userInfo",JSON.stringify(e)),t.emit("setUser"),te["a"].success("登录成功"),a()}).catch(o=>{210===o.code?te["a"].error("账号或密码不正确"):211===o.code&&Se.register(e.email,e.password).then(e=>{ue.a.set("userInfo",JSON.stringify(e)),t.emit("setUser"),te["a"].success("注册成功"),a()})})}})};function a(){l.value.resetFields(),t.emit("closeViews",!1)}const r=()=>{o.opacity1=o.opacity1||1,o.opacity2=o.opacity2||1;const e=Re[""+o.selectVal],s={...e,opacity1:o.opacity1,opacity2:o.opacity2,opacity0:o.opacity0,selectVal:o.selectVal,theme:o.theme,opacity:[o.opacity1,o.opacity2],direction:o.direction,image:{source:o.imageUrl,position:["center","bottom"],stretchMode:["stretch","stretch-if-bigger"],blendingMode:"multiply"}};localStorage.setItem("granimConfig",JSON.stringify(s)),o.granimRef=new Granim({element:"#granim-box",...s}),t.emit("fresh")};function n(e){return new Promise(t=>{const o=new FileReader;o.readAsDataURL(e),o.onload=e=>{const o=e.currentTarget.result;t(o)}})}const d=e=>{const t=e.target.files[0];n(t).then(e=>{o.imageUrl=e}).finally(()=>{r()})},h=Object(s["bb"])();return Object(s["G"])(()=>{let e=localStorage.getItem("granimConfig");if(e){let t=JSON.parse(e);o.selectVal=t.selectVal,o.direction=t.direction,o.opacity1=t.opacity&&t.opacity.length>0?t.opacity[0]:.15,o.opacity2=t.opacity&&t.opacity.length>0?t.opacity[1]:.15,o.imageUrl=t.image&&t.image.source?t.image.source:"",o.theme=t.theme,o.opacity0=t.opacity0}o.granimRef=null}),Object(s["hb"])(()=>h.modelValue,e=>{e&&Object(s["z"])(()=>{o.granimRef&&o.granimRef.destroy(),r()})},{deep:!0}),{...Object(s["Z"])(o),closeViews:a,submitForm:i,refruleForm:l,rules:c,setGranim:r,handleFileChange:d}}};o("76de");const Me=ce()(Ie,[["render",Je],["__scopeId","data-v-6f880459"]]);var Ae=Me,Ne=o("5561");const ze=(e,t)=>new Promise((o,s)=>{const c=be.a.Object.extend(e),l=be.a.User.current();var i=new c;i.set("formDatas",t.formDatas),i.set("user",l),i.save().then(e=>{o(e)},e=>{s(e)})}),Fe=(e,t)=>new Promise((o,s)=>{const c=new be.a.Query(e),l=be.a.User.current();for(const e in t)t[e]&&c.equalTo(e,t[e]);c.equalTo("user",l),c.find().then(e=>{o(e)},e=>{s(e)})});function Ue(e){const t=[],o=(e,t)=>{const s=e.children;if(s&&s.length>0)for(let c=0;c<s.length;c++){const e=s[c];if("P"!==e.tagName&&"H3"!==e.tagName)if("DL"===e.tagName)o(s[c],t);else{let l=null;const i=e.children;let a=!1;for(let e=0;e<i.length;e++)"H3"!==i[e].tagName&&"DL"!==i[e].tagName||(a=!0);if(a)l={type:"DT"===e.tagName&&e.querySelector("h3")?e.querySelector("h3").innerText:"",folder:!0,children:[]},o(s[c],l.children);else{const t=e.querySelector("a");t&&(l={title:null===t||void 0===t?void 0:t.innerText,url:null===t||void 0===t?void 0:t.href})}l&&t.push(l)}}};o(e,t);const s=t.filter(e=>e.folder);return De(s)}const De=e=>{const t=[],o=e=>{for(let s=0;s<e.length;s++)if(e[s].folder){o(e[s].children);const c=e[s];c.children=c.children.filter(e=>!e.folder),t.push(c)}};return o(e),t};function Be(){if(localStorage.getItem("BOOKMARK")){var e=localStorage.getItem("BOOKMARK"),t=document.createElement("a");t.download="kestrel-bookmark.json",t.style.display="none";var o=new Blob([e]);t.href=URL.createObjectURL(o),document.body.appendChild(t),t.click(),document.body.removeChild(t)}else this.$message.warning("暂无可导出数据")}const Te={light:{bgColor:"#fff",activeColor:"#a0cae6",textColor:"#111",hoverColor:"#fff",borderColor:"#eee",scrollbarColor:"#dddddd",svgColor:""},dark:{bgColor:"#111",activeColor:"#000",textColor:"#fff",hoverColor:"#000",borderColor:"#2c2c2c",scrollbarColor:"#222",svgColor:"#888"}};var Ee=[];const Pe={components:{Dialog:ie,Login:xe,Configd:Ae,Bg:de},name:"kestrel-bookmark",setup(){const e=(t,o=[])=>{for(const s of t)Array.isArray(s.children)?e(s.children,o):o.push(s);return o},t=Object(s["N"])({activeIndex:0,data:[],bookMark:[],searchVal:"",allData:[],isDetailVisible:!1,isLoginVisible:!1,isConfigVisible:!1,detail:{},userInfo:{username:"未登录"},themeStyle:{},theme:"light"}),o=(o=(()=>{}))=>{ue.a.get("userInfo")&&(t.userInfo=JSON.parse(ue.a.get("userInfo"))),t.userInfo.objectId?Fe("BOOKMARK").then(e=>{e.length>0?Ee=JSON.parse(e[0].attributes.formDatas):(localStorage.setItem("BOOKMARK",JSON.stringify(Y)),Ee=JSON.parse(JSON.stringify(Y)))}).catch(()=>{localStorage.setItem("BOOKMARK",JSON.stringify(Y)),Ee=JSON.parse(JSON.stringify(Y))}).finally(()=>{o(),t.data=Ee,t.bookMark=Ee[0].children,t.allData=e(Ee)}):(localStorage.getItem("BOOKMARK")?Ee=JSON.parse(localStorage.getItem("BOOKMARK")):(localStorage.setItem("BOOKMARK",JSON.stringify(Y)),Ee=JSON.parse(JSON.stringify(Y))),t.data=Ee,t.bookMark=Ee[0].children,t.allData=e(Ee),o())},c=()=>{ue.a.get("userInfo")?t.userInfo=JSON.parse(ue.a.get("userInfo")):t.userInfo={username:"未登录"},o()};c(),Object(s["hb"])(()=>t.searchVal,()=>{t.bookMark=t.allData.filter(e=>e.title.toLowerCase().indexOf(t.searchVal.toLowerCase())>-1)});const l=(e,o)=>{t.bookMark=e.children,t.activeIndex=o},i=e=>window.open(e.url,"_target");function a(e={},o="add"){const s={...e};t.detail="modify"===o?Object.assign(s,{type:Ee[t.activeIndex].type,flag:"modify"}):Object.assign({},{type:Ee[t.activeIndex].type,flag:"add"}),t.isDetailVisible=!0}const r=()=>{t.isLoginVisible=!0},n=()=>{t.isConfigVisible=!0},d=e=>t.isConfigVisible=e,h=e=>t.isDetailVisible=e,g=e=>t.isLoginVisible=e,p=async()=>{await o(()=>{t.data=Ee,t.bookMark=Ee[t.activeIndex].children})},u=e=>{const o=JSON.parse(localStorage.getItem("BOOKMARK")),s=Object.assign(e,{type:Ee[t.activeIndex].type});for(let t=0;t<o.length;t++)if(s.type===o[t].type){const e=o[t].children.findIndex(e=>e.title===s.title);e>-1&&(o[t].children.splice(e,1),localStorage.setItem("BOOKMARK",JSON.stringify(o)),te["a"].success("删除成功"),p())}},m=()=>{te["b"].confirm("确认要退出登录?","温馨提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{const e={username:"",password:""};Se.logout(e.username,e.password).then(e=>{ue.a.remove("userInfo"),c()}),Object(te["a"])({type:"success",message:"已退出登录"})})},b=()=>{t.userInfo.objectId?m():r()},j=()=>{if(t.userInfo.objectId){const e=document.getElementById("file");e.dispatchEvent(new MouseEvent("click"));const t=document.getElementById("mybookmark");document.getElementById("file").addEventListener("change",(function(){var e=document.getElementById("file").files[0],o=new FileReader;o.readAsText(e,"utf-8"),o.onload=function(){t.innerHTML=o.result;const e=JSON.stringify(Ue(t));if(e){const t={formDatas:e};f(t)}}}))}else te["a"].warning("请先登录")},f=e=>{ze("BOOKMARK",e).then(e=>{te["a"].success("导入成功"),o()})},v=Object(s["O"])(null),O=()=>{y(),v.value.init()},y=()=>{const e=localStorage.getItem("granimConfig");if(e){const o=JSON.parse(e);t.theme=o.theme,t.themeStyle=Te[""+t.theme],t.themeStyle.opacity0=o.opacity0&&o.opacity0>.5?o.opacity0:.5}else t.themeStyle=Te.light,t.themeStyle.opacity0=.8},S=Object(s["i"])(()=>Te[""+t.theme].bgColor),w=Object(s["i"])(()=>Te[""+t.theme].activeColor),k=Object(s["i"])(()=>t.themeStyle.opacity0),x=Object(s["i"])(()=>Te[""+t.theme].textColor),V=Object(s["i"])(()=>Te[""+t.theme].borderColor),C=Object(s["i"])(()=>Te[""+t.theme].scrollbarColor);Object(s["G"])(()=>{y()});const _=()=>{localStorage.removeItem("granimConfig"),v.value.init()};return{scrollbarColor:C,textColor:x,opacity0:k,activeColor:w,borderColor:V,bgColor:S,resetClick:_,bgRef:v,fresh:O,deleteClick:u,...Object(s["Z"])(t),selectType:l,navigate:i,add:a,closeViews:h,closeLoginViews:g,search:p,importBookmark:j,exportBookmark:Be,loginClick:b,setUsername:c,configClick:n,closeConfigViews:d}},methods:{beforeEnter(e){e.style.opacity=0,e.style.height=0},enter(e,t){Ne["a"].to(e,{opacity:1,height:"1.6em",delay:.15*e.dataset.index,onComplete:t})},leave(e,t){Ne["a"].to(e,{opacity:0,height:0,delay:.15*e.dataset.index,onComplete:t})}}},Le=()=>{Object(s["cb"])(e=>({35139428:e.bgColor,"1e5ee377":e.opacity0,"88b6866a":e.activeColor,"26f10f65":e.borderColor,"5c838562":e.scrollbarColor,"1082daf8":e.textColor}))},Ke=Pe.setup;Pe.setup=Ke?(e,t)=>(Le(),Ke(e,t)):Le;var qe=Pe;o("291a");const Ge=ce()(qe,[["render",X],["__scopeId","data-v-58ce68a6"]]);var We=Ge;o("677a");be.a.init({appId:"BwLrCgdVyLs52mJO1HcrXakI-gzGzoHsz",appKey:"25gNwzw4dV7IAh7i0IzDnYvV",serverURL:"https://bwlrcgdv.lc-cn-n1-shared.com"});const He=Object(s["j"])(We);He.use(te["c"]),He.mount("#app")},"6ff4":function(e,t,o){},"76de":function(e,t,o){"use strict";o("dc49")},a5f7:function(e,t,o){e.exports=o.p+"img/logo.svg"},b3c0:function(e,t,o){e.exports=o.p+"img/add.svg"},c871:function(e,t,o){},dc49:function(e,t,o){},de0e:function(e,t,o){"use strict";o("6ff4")},e8ed:function(e,t,o){e.exports=o.p+"img/blog.svg"},fe3c:function(e,t,o){e.exports=o.p+"img/file.svg"}});
//# sourceMappingURL=app.js.map