├── docs
├── .nojekyll
├── static
│ └── image
│ │ ├── admin.png
│ │ ├── index.jpg
│ │ ├── login.png
│ │ └── logo.png
├── _coverpage.md
├── index.html
└── README.md
├── common
├── swiper-config.js
├── secret.js
├── ajax.js
└── uitls.js
├── .browserslistrc
├── client
├── eventBus
│ └── index.js
├── common
│ ├── images
│ │ ├── head.png
│ │ ├── logo.png
│ │ ├── logo.psd
│ │ ├── nodata.jpg
│ │ ├── nodata.png
│ │ ├── 未标题-1.png
│ │ ├── login_bg.png
│ │ ├── login_bg2.png
│ │ ├── headerImage.png
│ │ ├── phoneModel.png
│ │ ├── use-beb469.png
│ │ ├── website
│ │ │ ├── banner.png
│ │ │ ├── resources
│ │ │ │ ├── brand-1-1.png
│ │ │ │ ├── logo-dark.png
│ │ │ │ ├── preloader.png
│ │ │ │ ├── testi-1-1.png
│ │ │ │ ├── video-1-1.jpg
│ │ │ │ └── logo-light.png
│ │ │ ├── background
│ │ │ │ ├── cta-one-bg.png
│ │ │ │ ├── faq-one-bg.png
│ │ │ │ ├── app-shot-bg.png
│ │ │ │ ├── banner-2-bg.jpg
│ │ │ │ ├── banner-bg-1-1.png
│ │ │ │ ├── video-one-bg.png
│ │ │ │ └── inner-banner-bg-1-1.jpg
│ │ │ └── app-shots
│ │ │ │ ├── app-screen-moc.png
│ │ │ │ ├── app-shot-1-1.jpg
│ │ │ │ ├── app-shot-1-2.jpg
│ │ │ │ ├── app-shot-1-3.jpg
│ │ │ │ ├── app-shot-1-4.jpg
│ │ │ │ └── app-shot-1-5.jpg
│ │ ├── elementIcon
│ │ │ ├── empty.png
│ │ │ ├── form.png
│ │ │ ├── image.png
│ │ │ ├── map.png
│ │ │ ├── map2.png
│ │ │ ├── music.png
│ │ │ ├── qcode.png
│ │ │ ├── radio.jpg
│ │ │ ├── rate.jpg
│ │ │ ├── text.png
│ │ │ ├── video.png
│ │ │ ├── 未标题-1.psd
│ │ │ ├── 视频短信.png
│ │ │ ├── 轮播图.png
│ │ │ ├── Switch.jpg
│ │ │ ├── avatar.png
│ │ │ ├── banner.png
│ │ │ ├── border.png
│ │ │ ├── button.png
│ │ │ ├── calend.png
│ │ │ ├── funnel.jpg
│ │ │ ├── iframe.png
│ │ │ ├── notice.png
│ │ │ ├── stepper.jpg
│ │ │ ├── tabars.png
│ │ │ ├── video2.png
│ │ │ ├── carousel.png
│ │ │ ├── checkbox.jpg
│ │ │ ├── lineCharts.jpg
│ │ │ ├── pieCharts.jpg
│ │ │ ├── splitLine.png
│ │ │ ├── wordcloud.jpg
│ │ │ └── circle-border.png
│ │ ├── pagecover-image.png
│ │ ├── quark--pagecover-image.psd
│ │ └── placeholder
│ │ │ ├── placeholder-1.jpg
│ │ │ ├── placeholder-10.jpg
│ │ │ ├── placeholder-11.jpg
│ │ │ ├── placeholder-12.jpg
│ │ │ ├── placeholder-13.jpg
│ │ │ ├── placeholder-2.jpg
│ │ │ ├── placeholder-3.jpg
│ │ │ ├── placeholder-4.jpg
│ │ │ ├── placeholder-5.jpg
│ │ │ ├── placeholder-6.jpg
│ │ │ ├── placeholder-7.jpg
│ │ │ ├── placeholder-8.jpg
│ │ │ └── placeholder-9.jpg
│ ├── fonts
│ │ ├── iconfont.eot
│ │ ├── iconfont.ttf
│ │ ├── iconfont.woff
│ │ └── iconfont.woff2
│ ├── styles
│ │ ├── element-variables.scss
│ │ └── variables.scss
│ └── js
│ │ ├── runAnimations.js
│ │ └── secret.js
├── plugins
│ ├── bg-music
│ │ ├── src
│ │ │ └── music.png
│ │ └── index.js
│ ├── banner
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── button
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── iframe
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── image
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── input
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── map
│ │ └── index.js
│ ├── notice
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── qrcode
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── radio
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── rate
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── tabars
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── text
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── video
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── FunnelChart
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── LineChart
│ │ └── index.js
│ ├── NavBar
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── PieChart
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── WordCloud
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── avatar
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── checkbox
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── stepper
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── AddressEdit
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── circle-border
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ ├── image-carousel
│ │ ├── index.js
│ │ └── src
│ │ │ └── index.vue
│ └── rectangle-border
│ │ ├── index.js
│ │ └── src
│ │ └── index.vue
├── libs
│ ├── drag
│ │ ├── index.js
│ │ ├── draggable.vue
│ │ └── droppable.vue
│ └── keypress
│ │ └── keypress.js
├── mixins
│ ├── pageModel.js
│ ├── userModel.js
│ ├── ossUpload.js
│ └── elementEvents.js
├── api
│ ├── modules
│ │ ├── psd.js
│ │ ├── image.js
│ │ ├── user.js
│ │ └── page.js
│ └── index.js
├── components
│ ├── crawler-program
│ │ ├── baiduh5.vue
│ │ ├── yiqixiu.vue
│ │ └── h5ds.vue
│ ├── add-cooperationer
│ │ └── index.js
│ ├── notFundData.vue
│ ├── page-header.vue
│ ├── upload-psd.vue
│ ├── SketchRuleBg.vue
│ └── preview-wrapper.vue
├── pages
│ ├── editor
│ │ └── components
│ │ │ ├── template-libs.vue
│ │ │ ├── attr-configure
│ │ │ ├── attr-props-components
│ │ │ │ └── props-attr
│ │ │ │ │ ├── text.vue
│ │ │ │ │ ├── url.vue
│ │ │ │ │ ├── imageSrc.vue
│ │ │ │ │ ├── musicSrc.vue
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── btnType.vue
│ │ │ │ │ ├── avatar.vue
│ │ │ │ │ ├── grid.vue
│ │ │ │ │ ├── imageSrcList.vue
│ │ │ │ │ ├── NoticeBar.vue
│ │ │ │ │ └── index.vue
│ │ │ ├── script-edit.vue
│ │ │ └── attr-edit.vue
│ │ │ ├── history.vue
│ │ │ └── keyboard.vue
│ ├── home
│ │ ├── page-data.vue
│ │ ├── page-data-detail.vue
│ │ └── index.vue
│ ├── template-view-example
│ │ └── swiper-h5.vue
│ └── layout.vue
├── App.vue
├── filters
│ └── index.js
├── permission.js
├── store
│ ├── index.js
│ └── modules
│ │ └── user.js
├── config
│ └── index.js
├── router
│ └── index.js
└── main.js
├── service
├── public
│ ├── user.png
│ ├── favicon.ico
│ ├── static
│ │ ├── img
│ │ │ ├── map.cdd0a85e.png
│ │ │ ├── form.d3b05bae.png
│ │ │ ├── image.e19d7f4a.png
│ │ │ ├── logo.30525635.png
│ │ │ ├── music.4a52a7c8.png
│ │ │ ├── qcode.5d8d13b4.png
│ │ │ ├── radio.8232ca9c.jpg
│ │ │ ├── rate.45d4b8f2.jpg
│ │ │ ├── text.857c2679.png
│ │ │ ├── video.9e4bd305.png
│ │ │ ├── Switch.a0e8f86f.jpg
│ │ │ ├── avatar.e033ea29.png
│ │ │ ├── banner.95ab5f16.png
│ │ │ ├── banner.f77c57eb.png
│ │ │ ├── button.b3883c1e.png
│ │ │ ├── carousel.a5b2553e.png
│ │ │ ├── checkbox.bd4b7763.jpg
│ │ │ ├── funnel.c69030ce.jpg
│ │ │ ├── iframe.6d67bf34.png
│ │ │ ├── login_bg.b2d321f6.png
│ │ │ ├── nodata.6b16cccd.jpg
│ │ │ ├── notice.1a7c4d2d.png
│ │ │ ├── stepper.4d9b0ce6.jpg
│ │ │ ├── tabars.ca6734c0.png
│ │ │ ├── lineCharts.ae72a114.jpg
│ │ │ ├── login_bg2.53ecd4df.png
│ │ │ ├── pieCharts.1c159a3c.jpg
│ │ │ ├── use-beb469.beb469b6.png
│ │ │ ├── wordcloud.7d29abbe.jpg
│ │ │ ├── circle-border.5fe597d1.png
│ │ │ ├── headerImage.baefd97f.png
│ │ │ └── pagecover-image.677bc94e.png
│ │ ├── fonts
│ │ │ ├── iconfont.2adcd9a2.eot
│ │ │ ├── iconfont.4e2258a0.ttf
│ │ │ ├── iconfont.687560f7.woff
│ │ │ ├── element-icons.732389de.ttf
│ │ │ └── element-icons.535877f5.woff
│ │ ├── css
│ │ │ ├── chunk-0069f99e.9fab0072.css
│ │ │ ├── chunk-45ad6033.dd934ab5.css
│ │ │ ├── chunk-90f63cb6.b4463508.css
│ │ │ ├── chunk-1b5ebbde.04778ce4.css
│ │ │ ├── chunk-30466f2e.346304c2.css
│ │ │ ├── chunk-39d883ed.4d235bf0.css
│ │ │ └── chunk-6f24315e.c3a401dd.css
│ │ └── js
│ │ │ ├── chunk-45ad6033.b4347f8b.js
│ │ │ ├── chunk-45ad6033.bf74defa.js
│ │ │ ├── chunk-90f63cb6.1c456727.js
│ │ │ ├── chunk-90f63cb6.a8d41848.js
│ │ │ ├── chunk-0069f99e.71c57878.js
│ │ │ ├── chunk-0069f99e.e3bb6e53.js
│ │ │ ├── chunk-39d883ed.4e3c9d4d.js
│ │ │ └── chunk-39d883ed.8cccd16a.js
│ ├── resource
│ │ ├── avatar
│ │ │ └── admin
│ │ │ │ ├── logo - 副本.png
│ │ │ │ └── v2-73b8307b2db44c617f4e8515ce67dd39_r.jpg
│ │ └── image_lib
│ │ │ └── admin
│ │ │ ├── 1618634024488
│ │ │ └── 003.png
│ │ │ ├── 1619163776451
│ │ │ └── 未命名文件.png
│ │ │ ├── 1620103978503
│ │ │ └── 企业个人微信.jpg
│ │ │ ├── 1619146421668
│ │ │ └── 未命名文件 (9).png
│ │ │ ├── 1621152723716
│ │ │ └── logo - 副本.png
│ │ │ ├── 1621443988481
│ │ │ └── logo - 副本.png
│ │ │ ├── 1621473749516
│ │ │ └── FpN9kX1crwd3K8dPEtclPett39Qb.jpg
│ │ │ ├── 1621474863689
│ │ │ └── FpN9kX1crwd3K8dPEtclPett39Qb.jpg
│ │ │ └── 1620892910720
│ │ │ └── afc6a3f40b8710341f17d2215b934c62.jpg
│ ├── engine_libs
│ │ └── h5-swiper
│ │ │ └── demo.html
│ ├── admin.html
│ └── third-libs
│ │ └── flexible.js
├── app.js
├── controller
│ ├── htmlToCanvas.js
│ ├── cooperation.js
│ ├── image.js
│ ├── API.js
│ ├── psd.js
│ ├── user.js
│ └── auth.js
├── model
│ ├── image.js
│ ├── user.js
│ └── page.js
├── middleware
│ ├── handlerError.js
│ └── auth.js
├── api
│ ├── file.js
│ └── image.js
├── config
│ └── index.js
├── views
│ └── h5-long.ejs
└── core
│ └── index.js
├── public
└── static
│ ├── img
│ ├── map.cdd0a85e.png
│ ├── Switch.a0e8f86f.jpg
│ ├── avatar.e033ea29.png
│ ├── banner.95ab5f16.png
│ ├── banner.f77c57eb.png
│ ├── button.b3883c1e.png
│ ├── form.d3b05bae.png
│ ├── funnel.c69030ce.jpg
│ ├── iframe.6d67bf34.png
│ ├── image.e19d7f4a.png
│ ├── logo.30525635.png
│ ├── music.4a52a7c8.png
│ ├── nodata.6b16cccd.jpg
│ ├── notice.1a7c4d2d.png
│ ├── qcode.5d8d13b4.png
│ ├── radio.8232ca9c.jpg
│ ├── rate.45d4b8f2.jpg
│ ├── tabars.ca6734c0.png
│ ├── text.857c2679.png
│ ├── video.9e4bd305.png
│ ├── carousel.a5b2553e.png
│ ├── checkbox.bd4b7763.jpg
│ ├── login_bg.b2d321f6.png
│ ├── stepper.4d9b0ce6.jpg
│ ├── headerImage.baefd97f.png
│ ├── lineCharts.ae72a114.jpg
│ ├── login_bg2.53ecd4df.png
│ ├── pieCharts.1c159a3c.jpg
│ ├── use-beb469.beb469b6.png
│ ├── wordcloud.7d29abbe.jpg
│ ├── circle-border.5fe597d1.png
│ └── pagecover-image.677bc94e.png
│ ├── fonts
│ ├── iconfont.2adcd9a2.eot
│ ├── iconfont.4e2258a0.ttf
│ ├── iconfont.687560f7.woff
│ ├── element-icons.535877f5.woff
│ └── element-icons.732389de.ttf
│ ├── css
│ ├── chunk-0069f99e.9fab0072.css
│ ├── chunk-45ad6033.dd934ab5.css
│ ├── chunk-90f63cb6.b4463508.css
│ ├── chunk-1b5ebbde.04778ce4.css
│ ├── chunk-30466f2e.346304c2.css
│ ├── chunk-39d883ed.4d235bf0.css
│ └── chunk-6f24315e.c3a401dd.css
│ └── js
│ ├── chunk-45ad6033.bf74defa.js
│ ├── chunk-90f63cb6.a8d41848.js
│ ├── chunk-0069f99e.71c57878.js
│ └── chunk-39d883ed.8cccd16a.js
├── babel.config.js
├── TODOconfig.json
├── .gitignore
├── engine-template
├── engine-pc
│ └── index.js
├── engine-h5-long
│ └── index.js
├── engine-h5-swiper
│ ├── index.js
│ └── src
│ │ └── components-template.vue
├── engine-h5-relative
│ └── index.js
└── components
│ └── components-template.vue
├── .eslintrc.js
└── vue.config.js
/docs/.nojekyll:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/common/swiper-config.js:
--------------------------------------------------------------------------------
1 | export default {
2 |
3 | }
4 |
--------------------------------------------------------------------------------
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | android >= 4.4
4 |
--------------------------------------------------------------------------------
/client/eventBus/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | export default new Vue();
--------------------------------------------------------------------------------
/service/public/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/user.png
--------------------------------------------------------------------------------
/docs/static/image/admin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/docs/static/image/admin.png
--------------------------------------------------------------------------------
/docs/static/image/index.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/docs/static/image/index.jpg
--------------------------------------------------------------------------------
/docs/static/image/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/docs/static/image/login.png
--------------------------------------------------------------------------------
/docs/static/image/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/docs/static/image/logo.png
--------------------------------------------------------------------------------
/service/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/favicon.ico
--------------------------------------------------------------------------------
/client/common/images/head.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/head.png
--------------------------------------------------------------------------------
/client/common/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/logo.png
--------------------------------------------------------------------------------
/client/common/images/logo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/logo.psd
--------------------------------------------------------------------------------
/client/common/fonts/iconfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/fonts/iconfont.eot
--------------------------------------------------------------------------------
/client/common/fonts/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/fonts/iconfont.ttf
--------------------------------------------------------------------------------
/client/common/images/nodata.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/nodata.jpg
--------------------------------------------------------------------------------
/client/common/images/nodata.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/nodata.png
--------------------------------------------------------------------------------
/client/common/images/未标题-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/未标题-1.png
--------------------------------------------------------------------------------
/service/app.js:
--------------------------------------------------------------------------------
1 | const Application = require('./core');
2 |
3 | const app = new Application();
4 |
5 | app.start(3333);
--------------------------------------------------------------------------------
/client/common/fonts/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/fonts/iconfont.woff
--------------------------------------------------------------------------------
/client/common/fonts/iconfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/fonts/iconfont.woff2
--------------------------------------------------------------------------------
/client/common/images/login_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/login_bg.png
--------------------------------------------------------------------------------
/client/common/images/login_bg2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/login_bg2.png
--------------------------------------------------------------------------------
/public/static/img/map.cdd0a85e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/map.cdd0a85e.png
--------------------------------------------------------------------------------
/client/common/images/headerImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/headerImage.png
--------------------------------------------------------------------------------
/client/common/images/phoneModel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/phoneModel.png
--------------------------------------------------------------------------------
/client/common/images/use-beb469.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/use-beb469.png
--------------------------------------------------------------------------------
/client/plugins/bg-music/src/music.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/plugins/bg-music/src/music.png
--------------------------------------------------------------------------------
/public/static/img/Switch.a0e8f86f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/Switch.a0e8f86f.jpg
--------------------------------------------------------------------------------
/public/static/img/avatar.e033ea29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/avatar.e033ea29.png
--------------------------------------------------------------------------------
/public/static/img/banner.95ab5f16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/banner.95ab5f16.png
--------------------------------------------------------------------------------
/public/static/img/banner.f77c57eb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/banner.f77c57eb.png
--------------------------------------------------------------------------------
/public/static/img/button.b3883c1e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/button.b3883c1e.png
--------------------------------------------------------------------------------
/public/static/img/form.d3b05bae.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/form.d3b05bae.png
--------------------------------------------------------------------------------
/public/static/img/funnel.c69030ce.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/funnel.c69030ce.jpg
--------------------------------------------------------------------------------
/public/static/img/iframe.6d67bf34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/iframe.6d67bf34.png
--------------------------------------------------------------------------------
/public/static/img/image.e19d7f4a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/image.e19d7f4a.png
--------------------------------------------------------------------------------
/public/static/img/logo.30525635.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/logo.30525635.png
--------------------------------------------------------------------------------
/public/static/img/music.4a52a7c8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/music.4a52a7c8.png
--------------------------------------------------------------------------------
/public/static/img/nodata.6b16cccd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/nodata.6b16cccd.jpg
--------------------------------------------------------------------------------
/public/static/img/notice.1a7c4d2d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/notice.1a7c4d2d.png
--------------------------------------------------------------------------------
/public/static/img/qcode.5d8d13b4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/qcode.5d8d13b4.png
--------------------------------------------------------------------------------
/public/static/img/radio.8232ca9c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/radio.8232ca9c.jpg
--------------------------------------------------------------------------------
/public/static/img/rate.45d4b8f2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/rate.45d4b8f2.jpg
--------------------------------------------------------------------------------
/public/static/img/tabars.ca6734c0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/tabars.ca6734c0.png
--------------------------------------------------------------------------------
/public/static/img/text.857c2679.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/text.857c2679.png
--------------------------------------------------------------------------------
/public/static/img/video.9e4bd305.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/video.9e4bd305.png
--------------------------------------------------------------------------------
/client/common/images/website/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/banner.png
--------------------------------------------------------------------------------
/public/static/img/carousel.a5b2553e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/carousel.a5b2553e.png
--------------------------------------------------------------------------------
/public/static/img/checkbox.bd4b7763.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/checkbox.bd4b7763.jpg
--------------------------------------------------------------------------------
/public/static/img/login_bg.b2d321f6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/login_bg.b2d321f6.png
--------------------------------------------------------------------------------
/public/static/img/stepper.4d9b0ce6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/stepper.4d9b0ce6.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/empty.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/form.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/image.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/map.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/map2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/map2.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/music.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/music.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/qcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/qcode.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/radio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/radio.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/rate.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/rate.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/text.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/video.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/video.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/未标题-1.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/未标题-1.psd
--------------------------------------------------------------------------------
/client/common/images/elementIcon/视频短信.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/视频短信.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/轮播图.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/轮播图.png
--------------------------------------------------------------------------------
/client/common/images/pagecover-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/pagecover-image.png
--------------------------------------------------------------------------------
/public/static/fonts/iconfont.2adcd9a2.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/fonts/iconfont.2adcd9a2.eot
--------------------------------------------------------------------------------
/public/static/fonts/iconfont.4e2258a0.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/fonts/iconfont.4e2258a0.ttf
--------------------------------------------------------------------------------
/public/static/fonts/iconfont.687560f7.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/fonts/iconfont.687560f7.woff
--------------------------------------------------------------------------------
/public/static/img/headerImage.baefd97f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/headerImage.baefd97f.png
--------------------------------------------------------------------------------
/public/static/img/lineCharts.ae72a114.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/lineCharts.ae72a114.jpg
--------------------------------------------------------------------------------
/public/static/img/login_bg2.53ecd4df.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/login_bg2.53ecd4df.png
--------------------------------------------------------------------------------
/public/static/img/pieCharts.1c159a3c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/pieCharts.1c159a3c.jpg
--------------------------------------------------------------------------------
/public/static/img/use-beb469.beb469b6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/use-beb469.beb469b6.png
--------------------------------------------------------------------------------
/public/static/img/wordcloud.7d29abbe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/wordcloud.7d29abbe.jpg
--------------------------------------------------------------------------------
/service/public/static/img/map.cdd0a85e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/map.cdd0a85e.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/Switch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/Switch.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/avatar.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/banner.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/border.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/border.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/button.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/calend.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/calend.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/funnel.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/funnel.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/iframe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/iframe.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/notice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/notice.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/stepper.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/stepper.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/tabars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/tabars.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/video2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/video2.png
--------------------------------------------------------------------------------
/public/static/img/circle-border.5fe597d1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/circle-border.5fe597d1.png
--------------------------------------------------------------------------------
/service/public/static/img/form.d3b05bae.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/form.d3b05bae.png
--------------------------------------------------------------------------------
/service/public/static/img/image.e19d7f4a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/image.e19d7f4a.png
--------------------------------------------------------------------------------
/service/public/static/img/logo.30525635.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/logo.30525635.png
--------------------------------------------------------------------------------
/service/public/static/img/music.4a52a7c8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/music.4a52a7c8.png
--------------------------------------------------------------------------------
/service/public/static/img/qcode.5d8d13b4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/qcode.5d8d13b4.png
--------------------------------------------------------------------------------
/service/public/static/img/radio.8232ca9c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/radio.8232ca9c.jpg
--------------------------------------------------------------------------------
/service/public/static/img/rate.45d4b8f2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/rate.45d4b8f2.jpg
--------------------------------------------------------------------------------
/service/public/static/img/text.857c2679.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/text.857c2679.png
--------------------------------------------------------------------------------
/service/public/static/img/video.9e4bd305.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/video.9e4bd305.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/carousel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/carousel.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/checkbox.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/checkbox.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/lineCharts.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/lineCharts.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/pieCharts.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/pieCharts.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/splitLine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/splitLine.png
--------------------------------------------------------------------------------
/client/common/images/elementIcon/wordcloud.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/wordcloud.jpg
--------------------------------------------------------------------------------
/client/common/images/quark--pagecover-image.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/quark--pagecover-image.psd
--------------------------------------------------------------------------------
/public/static/fonts/element-icons.535877f5.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/fonts/element-icons.535877f5.woff
--------------------------------------------------------------------------------
/public/static/fonts/element-icons.732389de.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/fonts/element-icons.732389de.ttf
--------------------------------------------------------------------------------
/public/static/img/pagecover-image.677bc94e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/public/static/img/pagecover-image.677bc94e.png
--------------------------------------------------------------------------------
/service/public/static/img/Switch.a0e8f86f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/Switch.a0e8f86f.jpg
--------------------------------------------------------------------------------
/service/public/static/img/avatar.e033ea29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/avatar.e033ea29.png
--------------------------------------------------------------------------------
/service/public/static/img/banner.95ab5f16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/banner.95ab5f16.png
--------------------------------------------------------------------------------
/service/public/static/img/banner.f77c57eb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/banner.f77c57eb.png
--------------------------------------------------------------------------------
/service/public/static/img/button.b3883c1e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/button.b3883c1e.png
--------------------------------------------------------------------------------
/service/public/static/img/carousel.a5b2553e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/carousel.a5b2553e.png
--------------------------------------------------------------------------------
/service/public/static/img/checkbox.bd4b7763.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/checkbox.bd4b7763.jpg
--------------------------------------------------------------------------------
/service/public/static/img/funnel.c69030ce.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/funnel.c69030ce.jpg
--------------------------------------------------------------------------------
/service/public/static/img/iframe.6d67bf34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/iframe.6d67bf34.png
--------------------------------------------------------------------------------
/service/public/static/img/login_bg.b2d321f6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/login_bg.b2d321f6.png
--------------------------------------------------------------------------------
/service/public/static/img/nodata.6b16cccd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/nodata.6b16cccd.jpg
--------------------------------------------------------------------------------
/service/public/static/img/notice.1a7c4d2d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/notice.1a7c4d2d.png
--------------------------------------------------------------------------------
/service/public/static/img/stepper.4d9b0ce6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/stepper.4d9b0ce6.jpg
--------------------------------------------------------------------------------
/service/public/static/img/tabars.ca6734c0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/tabars.ca6734c0.png
--------------------------------------------------------------------------------
/service/public/static/fonts/iconfont.2adcd9a2.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/fonts/iconfont.2adcd9a2.eot
--------------------------------------------------------------------------------
/service/public/static/fonts/iconfont.4e2258a0.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/fonts/iconfont.4e2258a0.ttf
--------------------------------------------------------------------------------
/service/public/static/img/lineCharts.ae72a114.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/lineCharts.ae72a114.jpg
--------------------------------------------------------------------------------
/service/public/static/img/login_bg2.53ecd4df.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/login_bg2.53ecd4df.png
--------------------------------------------------------------------------------
/service/public/static/img/pieCharts.1c159a3c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/pieCharts.1c159a3c.jpg
--------------------------------------------------------------------------------
/service/public/static/img/use-beb469.beb469b6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/use-beb469.beb469b6.png
--------------------------------------------------------------------------------
/service/public/static/img/wordcloud.7d29abbe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/wordcloud.7d29abbe.jpg
--------------------------------------------------------------------------------
/client/common/images/elementIcon/circle-border.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/elementIcon/circle-border.png
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-1.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-10.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-11.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-12.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-13.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-2.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-3.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-4.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-5.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-6.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-7.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-8.jpg
--------------------------------------------------------------------------------
/client/common/images/placeholder/placeholder-9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/placeholder/placeholder-9.jpg
--------------------------------------------------------------------------------
/client/common/images/website/resources/brand-1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/resources/brand-1-1.png
--------------------------------------------------------------------------------
/client/common/images/website/resources/logo-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/resources/logo-dark.png
--------------------------------------------------------------------------------
/client/common/images/website/resources/preloader.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/resources/preloader.png
--------------------------------------------------------------------------------
/client/common/images/website/resources/testi-1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/resources/testi-1-1.png
--------------------------------------------------------------------------------
/client/common/images/website/resources/video-1-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/resources/video-1-1.jpg
--------------------------------------------------------------------------------
/service/public/resource/avatar/admin/logo - 副本.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/avatar/admin/logo - 副本.png
--------------------------------------------------------------------------------
/service/public/static/fonts/iconfont.687560f7.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/fonts/iconfont.687560f7.woff
--------------------------------------------------------------------------------
/service/public/static/img/circle-border.5fe597d1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/circle-border.5fe597d1.png
--------------------------------------------------------------------------------
/service/public/static/img/headerImage.baefd97f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/headerImage.baefd97f.png
--------------------------------------------------------------------------------
/client/common/images/website/background/cta-one-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/cta-one-bg.png
--------------------------------------------------------------------------------
/client/common/images/website/background/faq-one-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/faq-one-bg.png
--------------------------------------------------------------------------------
/client/common/images/website/resources/logo-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/resources/logo-light.png
--------------------------------------------------------------------------------
/service/public/static/fonts/element-icons.732389de.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/fonts/element-icons.732389de.ttf
--------------------------------------------------------------------------------
/service/public/static/img/pagecover-image.677bc94e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/img/pagecover-image.677bc94e.png
--------------------------------------------------------------------------------
/client/common/images/website/app-shots/app-screen-moc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/app-shots/app-screen-moc.png
--------------------------------------------------------------------------------
/client/common/images/website/app-shots/app-shot-1-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/app-shots/app-shot-1-1.jpg
--------------------------------------------------------------------------------
/client/common/images/website/app-shots/app-shot-1-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/app-shots/app-shot-1-2.jpg
--------------------------------------------------------------------------------
/client/common/images/website/app-shots/app-shot-1-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/app-shots/app-shot-1-3.jpg
--------------------------------------------------------------------------------
/client/common/images/website/app-shots/app-shot-1-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/app-shots/app-shot-1-4.jpg
--------------------------------------------------------------------------------
/client/common/images/website/app-shots/app-shot-1-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/app-shots/app-shot-1-5.jpg
--------------------------------------------------------------------------------
/client/common/images/website/background/app-shot-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/app-shot-bg.png
--------------------------------------------------------------------------------
/client/common/images/website/background/banner-2-bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/banner-2-bg.jpg
--------------------------------------------------------------------------------
/client/common/images/website/background/banner-bg-1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/banner-bg-1-1.png
--------------------------------------------------------------------------------
/client/common/images/website/background/video-one-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/video-one-bg.png
--------------------------------------------------------------------------------
/service/public/static/fonts/element-icons.535877f5.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/static/fonts/element-icons.535877f5.woff
--------------------------------------------------------------------------------
/client/libs/drag/index.js:
--------------------------------------------------------------------------------
1 | import Draggable from './draggable.vue'
2 | import Droppable from './droppable.vue'
3 |
4 | export {
5 | Draggable,
6 | Droppable
7 | }
--------------------------------------------------------------------------------
/client/mixins/pageModel.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 针对页面的一些操作方法
3 | * */
4 | export default {
5 | methods: {
6 | savePage(){},
7 | publishPage(){},
8 |
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/client/api/modules/psd.js:
--------------------------------------------------------------------------------
1 | /*
2 | * psd
3 | **/
4 | import $axios from "@/service/httpServer";
5 |
6 | // 上传psd解析
7 | export const psdPpload = p => $axios.post('/psd/upload', p)
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1618634024488/003.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1618634024488/003.png
--------------------------------------------------------------------------------
/client/common/images/website/background/inner-banner-bg-1-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/client/common/images/website/background/inner-banner-bg-1-1.jpg
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1619163776451/未命名文件.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1619163776451/未命名文件.png
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1620103978503/企业个人微信.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1620103978503/企业个人微信.jpg
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1619146421668/未命名文件 (9).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1619146421668/未命名文件 (9).png
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1621152723716/logo - 副本.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1621152723716/logo - 副本.png
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1621443988481/logo - 副本.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1621443988481/logo - 副本.png
--------------------------------------------------------------------------------
/service/public/resource/avatar/admin/v2-73b8307b2db44c617f4e8515ce67dd39_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/avatar/admin/v2-73b8307b2db44c617f4e8515ce67dd39_r.jpg
--------------------------------------------------------------------------------
/client/plugins/banner/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/button/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/iframe/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
--------------------------------------------------------------------------------
/client/plugins/image/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/input/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/map/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/notice/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/qrcode/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/radio/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/rate/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/tabars/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/text/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/video/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
--------------------------------------------------------------------------------
/client/components/crawler-program/baiduh5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
14 |
--------------------------------------------------------------------------------
/client/components/crawler-program/yiqixiu.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
14 |
--------------------------------------------------------------------------------
/client/plugins/FunnelChart/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/LineChart/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/NavBar/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
--------------------------------------------------------------------------------
/client/plugins/PieChart/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/WordCloud/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/avatar/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
--------------------------------------------------------------------------------
/client/plugins/bg-music/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/checkbox/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/stepper/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/AddressEdit/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
--------------------------------------------------------------------------------
/client/plugins/circle-border/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/image-carousel/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/client/plugins/rectangle-border/index.js:
--------------------------------------------------------------------------------
1 | // 为组件提供 install 方法,供组件对外按需引入
2 | import Component from './src/index'
3 | Component.install = Vue => {
4 | Vue.component(Component.name, Component)
5 | }
6 | export default Component
7 |
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1621473749516/FpN9kX1crwd3K8dPEtclPett39Qb.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1621473749516/FpN9kX1crwd3K8dPEtclPett39Qb.jpg
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1621474863689/FpN9kX1crwd3K8dPEtclPett39Qb.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1621474863689/FpN9kX1crwd3K8dPEtclPett39Qb.jpg
--------------------------------------------------------------------------------
/client/components/crawler-program/h5ds.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
14 |
--------------------------------------------------------------------------------
/service/public/resource/image_lib/admin/1620892910720/afc6a3f40b8710341f17d2215b934c62.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Oct1a/Dcode-Editor/HEAD/service/public/resource/image_lib/admin/1620892910720/afc6a3f40b8710341f17d2215b934c62.jpg
--------------------------------------------------------------------------------
/client/common/styles/element-variables.scss:
--------------------------------------------------------------------------------
1 | /* 改变主题色变量 */
2 |
3 | $--color-primary: #00acee;
4 |
5 | /* 改变 icon 字体路径变量,必需 */
6 |
7 | $--font-path: '~element-ui/lib/theme-chalk/fonts';
8 | @import "~element-ui/packages/theme-chalk/src/index";
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/app'
4 | ],
5 | plugins: [
6 | ['import', {
7 | libraryName: 'vant',
8 | libraryDirectory: 'es',
9 | style: true
10 | }, 'vant']
11 | ]
12 | }
--------------------------------------------------------------------------------
/client/api/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * API 统一管理
3 | * */
4 |
5 | // 用户相关
6 | export * from './modules/user'
7 | // 页面相关
8 | export * from './modules/page'
9 | // 图片库相关
10 | export * from './modules/image'
11 | // 解析psd
12 | export * from './modules/psd'
--------------------------------------------------------------------------------
/docs/_coverpage.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 |
4 |
5 | >一个神奇的文档网站生成器。
6 |
7 |
8 |
9 | - 简单、轻便 (压缩后 ~21kB)
10 | - 无需生成 html 文件
11 | - 众多主题
12 |
13 | [GitHub](https://github.com/docsifyjs/docsify/) [Get Started](#docsify)
14 |
15 |
16 | 
--------------------------------------------------------------------------------
/service/public/engine_libs/h5-swiper/demo.html:
--------------------------------------------------------------------------------
1 |
2 |
page-engine demo
3 |
4 |
5 |
6 |
7 |
8 |
11 |
--------------------------------------------------------------------------------
/client/plugins/circle-border/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
13 |
14 |
16 |
--------------------------------------------------------------------------------
/TODOconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "port": "4000",
3 | "adminAccount": "admin",
4 | "db": {
5 | "servername": "127.0.0.1",
6 | "DATABASE": "",
7 | "port": 27017,
8 | "user": "",
9 | "pass": "",
10 | "authSource": ""
11 | },
12 | "baseURL": "",
13 | "tips": "该文件后期处理,client与server的配置信息整合一起"
14 | }
--------------------------------------------------------------------------------
/client/plugins/rectangle-border/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
13 |
14 |
17 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 | # local env files
6 | .env.local
7 | .env.*.local
8 |
9 | # Log files
10 | npm-debug.log*
11 | yarn-debug.log*
12 | yarn-error.log*
13 |
14 | # Editor directories and files
15 | .idea
16 | .vscode
17 | *.suo
18 | *.ntvs*
19 | *.njsproj
20 | *.sln
21 | *.sw?
22 | /server/public/psd_static
23 |
--------------------------------------------------------------------------------
/client/pages/editor/components/template-libs.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
模板库
4 |
待完善...
5 |
6 |
7 |
8 |
9 |
14 |
15 |
18 |
--------------------------------------------------------------------------------
/public/static/css/chunk-0069f99e.9fab0072.css:
--------------------------------------------------------------------------------
1 | .page-home[data-v-659890ee]{display:flex;width:100%;height:100%;background:#f0f3f4}.page-home .home-side-bar[data-v-659890ee]{width:200px;background-color:#fff;border-right:1px solid #e6ebed;padding-top:8px;z-index:2}.page-home .my-page-list[data-v-659890ee]{flex:1;height:100%}.page-home .my-page-list .sub-page[data-v-659890ee]{height:100%}
--------------------------------------------------------------------------------
/service/public/static/css/chunk-0069f99e.9fab0072.css:
--------------------------------------------------------------------------------
1 | .page-home[data-v-659890ee]{display:flex;width:100%;height:100%;background:#f0f3f4}.page-home .home-side-bar[data-v-659890ee]{width:200px;background-color:#fff;border-right:1px solid #e6ebed;padding-top:8px;z-index:2}.page-home .my-page-list[data-v-659890ee]{flex:1;height:100%}.page-home .my-page-list .sub-page[data-v-659890ee]{height:100%}
--------------------------------------------------------------------------------
/client/pages/home/page-data.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
16 |
17 |
22 |
--------------------------------------------------------------------------------
/service/controller/htmlToCanvas.js:
--------------------------------------------------------------------------------
1 | /**
2 | * html2canvas所需接口相关
3 | * @type {request}
4 | */
5 | const request = require('request');
6 | module.exports = app => ({
7 | /**
8 | * html2canvas 跨域接口设置
9 | * @returns {Promise}
10 | */
11 | async corsproxy(){
12 | const {ctx} = app;
13 | const {url} = ctx.request.query;
14 | ctx.status = 200;
15 | ctx.body = await request(url)
16 | }
17 | })
18 |
--------------------------------------------------------------------------------
/service/model/image.js:
--------------------------------------------------------------------------------
1 | module.exports = app => {
2 | const { mongoose } = app;
3 | const Schema = mongoose.Schema
4 | // Schema
5 | const schema = new Schema({
6 | url: { type: String, default: '' },
7 | author: {
8 | type: mongoose.Schema.Types.ObjectId,
9 | ref: 'user'
10 | }
11 | }, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
12 | return mongoose.model('image', schema);
13 | };
14 |
--------------------------------------------------------------------------------
/client/pages/home/page-data-detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
16 |
17 |
22 |
--------------------------------------------------------------------------------
/client/mixins/userModel.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 登陆相关mixins
3 | * */
4 | export default {
5 | data() {
6 | return {
7 |
8 | }
9 | },
10 | methods: {
11 | /**
12 | * 退出登录
13 | */
14 | _logout() {
15 | this.$store.commit('UPDATE_OAUTH', {});
16 | sessionStorage.clear();
17 | this._linkToLogout();
18 | },
19 | _linkToLogout() {
20 | this.$router.push({ name: 'Login' })
21 | },
22 | }
23 | }
--------------------------------------------------------------------------------
/engine-template/engine-pc/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * engine-h5-swiper 是多页面h5引擎模板
3 | */
4 | import Template from './src/index.vue'
5 |
6 | const install = function (Vue) {
7 | Vue.component(Template.name, Template)
8 | }
9 |
10 | // 检测到 Vue 才执行,毕竟我们是基于 Vue 的
11 | if (typeof window !== 'undefined' && window.Vue) {
12 | install(window.Vue)
13 | }
14 |
15 | export default {
16 | install,
17 | // 所有组件,必须具有 install,才能使用 Vue.use()
18 | Template
19 | }
20 |
--------------------------------------------------------------------------------
/engine-template/engine-h5-long/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * engine-h5-swiper 是多页面h5引擎模板
3 | */
4 | import Template from './src/index.vue'
5 |
6 | const install = function (Vue) {
7 | Vue.component(Template.name, Template)
8 | }
9 |
10 | // 检测到 Vue 才执行,毕竟我们是基于 Vue 的
11 | if (typeof window !== 'undefined' && window.Vue) {
12 | install(window.Vue)
13 | }
14 |
15 | export default {
16 | install,
17 | // 所有组件,必须具有 install,才能使用 Vue.use()
18 | Template
19 | }
20 |
--------------------------------------------------------------------------------
/engine-template/engine-h5-swiper/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * engine-h5-swiper 是多页面h5引擎模板
3 | */
4 | import Template from './src/index.vue'
5 |
6 | const install = function (Vue) {
7 | Vue.component(Template.name, Template)
8 | }
9 |
10 | // 检测到 Vue 才执行,毕竟我们是基于 Vue 的
11 | if (typeof window !== 'undefined' && window.Vue) {
12 | install(window.Vue)
13 | }
14 |
15 | export default {
16 | install,
17 | // 所有组件,必须具有 install,才能使用 Vue.use()
18 | Template
19 | }
20 |
--------------------------------------------------------------------------------
/public/static/css/chunk-45ad6033.dd934ab5.css:
--------------------------------------------------------------------------------
1 | .components-default-style[data-v-402cadde]{width:100%;height:100%;text-align:center;position:relative;display:flex;justify-content:center;align-items:center;background:#fff}.components-default-style .default-style-img[data-v-402cadde],.components-default-style>div[data-v-402cadde]{display:inline-block}.components-default-style .tips[data-v-402cadde]{margin-top:30px;color:grey}.page-data-list[data-v-6c309750]{height:100%}
--------------------------------------------------------------------------------
/public/static/css/chunk-90f63cb6.b4463508.css:
--------------------------------------------------------------------------------
1 | .components-default-style[data-v-402cadde]{width:100%;height:100%;text-align:center;position:relative;display:flex;justify-content:center;align-items:center;background:#fff}.components-default-style .default-style-img[data-v-402cadde],.components-default-style>div[data-v-402cadde]{display:inline-block}.components-default-style .tips[data-v-402cadde]{margin-top:30px;color:grey}.page-data-list[data-v-0d27c64c]{height:100%}
--------------------------------------------------------------------------------
/client/api/modules/image.js:
--------------------------------------------------------------------------------
1 | /*
2 | * image 图片库
3 | **/
4 | import $axios from "@/service/httpServer";
5 |
6 | // 获取我的图片列表
7 | export const getMyImages = p => $axios.get('/imageLib/myImages', p);
8 | // 上传图片
9 | export const uploadImage = p => $axios.post('/imageLib/upload', p)
10 | export const uploadCommonImage = p => $axios.post('/imageCommon/upload', p)
11 |
12 | // 获取外部图片列表
13 | export const getExternalImages = p => $axios.get('/imageLib/ExternalImages', p)
--------------------------------------------------------------------------------
/engine-template/engine-h5-relative/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * engine-h5-swiper 是多页面h5引擎模板
3 | */
4 | import Template from './src/index.vue'
5 |
6 | const install = function (Vue) {
7 | Vue.component(Template.name, Template)
8 | }
9 |
10 | // 检测到 Vue 才执行,毕竟我们是基于 Vue 的
11 | if (typeof window !== 'undefined' && window.Vue) {
12 | install(window.Vue)
13 | }
14 |
15 | export default {
16 | install,
17 | // 所有组件,必须具有 install,才能使用 Vue.use()
18 | Template
19 | }
20 |
--------------------------------------------------------------------------------
/service/public/static/css/chunk-45ad6033.dd934ab5.css:
--------------------------------------------------------------------------------
1 | .components-default-style[data-v-402cadde]{width:100%;height:100%;text-align:center;position:relative;display:flex;justify-content:center;align-items:center;background:#fff}.components-default-style .default-style-img[data-v-402cadde],.components-default-style>div[data-v-402cadde]{display:inline-block}.components-default-style .tips[data-v-402cadde]{margin-top:30px;color:grey}.page-data-list[data-v-6c309750]{height:100%}
--------------------------------------------------------------------------------
/service/public/static/css/chunk-90f63cb6.b4463508.css:
--------------------------------------------------------------------------------
1 | .components-default-style[data-v-402cadde]{width:100%;height:100%;text-align:center;position:relative;display:flex;justify-content:center;align-items:center;background:#fff}.components-default-style .default-style-img[data-v-402cadde],.components-default-style>div[data-v-402cadde]{display:inline-block}.components-default-style .tips[data-v-402cadde]{margin-top:30px;color:grey}.page-data-list[data-v-0d27c64c]{height:100%}
--------------------------------------------------------------------------------
/service/middleware/handlerError.js:
--------------------------------------------------------------------------------
1 | module.exports = app => {
2 | return async function(ctx, next) {
3 | try {
4 | await next();
5 | } catch (err) {
6 | console.log(err)
7 | const status = err.status || 500;
8 | // 如果时生产环境的时候 500错误的详细错误内容不返回给客户端
9 | const error = status === 500 ? '网络错误' : err.message;
10 |
11 | ctx.body = {
12 | msg: error,
13 | status: false,
14 | body: {},
15 | code: status
16 | };
17 | }
18 | };
19 | };
20 |
--------------------------------------------------------------------------------
/client/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 |
27 |
--------------------------------------------------------------------------------
/client/plugins/rate/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
26 |
27 |
30 |
--------------------------------------------------------------------------------
/client/plugins/qrcode/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
25 |
26 |
29 |
--------------------------------------------------------------------------------
/client/plugins/stepper/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
26 |
27 |
30 |
--------------------------------------------------------------------------------
/client/pages/template-view-example/swiper-h5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
21 |
22 |
29 |
--------------------------------------------------------------------------------
/client/filters/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 封装些共用的过滤器
3 | */
4 |
5 | const filter = {
6 | /**
7 | * 将 boolean 转换成 文字是否
8 | * @param value
9 | * @returns {string}
10 | */
11 | booleanToText: function(value) {
12 | return value ? '是' : '否'
13 | },
14 | /**
15 | * 根据value获取label
16 | * @param value
17 | * @param list 对象列表
18 | */
19 | getLabelText(value, list, label = 'label') {
20 | let data = list.find(v => v.value === value);
21 | if (data) {
22 | return data[label];
23 | } else {
24 | return ''
25 | }
26 | },
27 |
28 | }
29 | export default filter
--------------------------------------------------------------------------------
/client/components/add-cooperationer/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Index from './index.vue';
3 | let ComponentConstructor = Vue.extend(Index);
4 | let instance;
5 |
6 | /**
7 | * 管理协作人
8 | * @param documentId 文档id
9 | * @constructor
10 | */
11 | let Component = function(pageId, callback) {
12 | instance = new ComponentConstructor({
13 | data: {
14 | pageId: pageId
15 | }
16 | });
17 | instance.$mount();
18 | instance.callback = callback;
19 | document.body.appendChild(instance.$el);
20 | instance.visible = true;
21 | return instance;
22 | }
23 |
24 | export default Component;
25 |
--------------------------------------------------------------------------------
/service/public/admin.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Dcode-Editor
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/client/plugins/NavBar/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
![]()
5 |
6 |
7 |
8 |
19 |
20 |
31 |
--------------------------------------------------------------------------------
/client/plugins/AddressEdit/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
![]()
5 |
6 |
7 |
8 |
19 |
20 |
31 |
--------------------------------------------------------------------------------
/client/plugins/iframe/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
27 |
28 |
34 |
--------------------------------------------------------------------------------
/service/model/user.js:
--------------------------------------------------------------------------------
1 | module.exports = app => {
2 | const { mongoose } = app;
3 | const Schema = mongoose.Schema
4 | // Schema
5 | const usersSchema = new Schema({
6 | username: { type: String, required: [true, 'username不能为空'] },
7 | password: { type: String, required: [true, 'password不能为空'] },
8 | name: { type: String, default: '' },
9 | email: { type: String, default: '' },
10 | avatar: { type: String, default: '' },
11 | permissions: { type: Number, default: 0 }, //0普通用户,1管理员
12 | status: { type: Boolean, default: true }
13 | }, { timestamps: { createdAt: 'created', updatedAt: 'updated' } })
14 | return mongoose.model('user', usersSchema);
15 | };
--------------------------------------------------------------------------------
/client/plugins/checkbox/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 复选框
5 |
6 |
7 |
8 |
29 |
30 |
33 |
--------------------------------------------------------------------------------
/client/plugins/input/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
30 |
31 |
34 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 |
4 | env: {
5 | node: true
6 | },
7 |
8 | 'extends': [
9 | 'plugin:vue/essential',
10 | 'eslint:recommended'
11 | ],
12 |
13 | rules: {
14 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
16 | },
17 |
18 | parserOptions: {
19 | parser: 'babel-eslint'
20 | },
21 |
22 | overrides: [
23 | {
24 | files: [
25 | '**/__tests__/*.{j,t}s?(x)',
26 | '**/tests/unit/**/*.spec.{j,t}s?(x)'
27 | ],
28 | env: {
29 | jest: true
30 | }
31 | }
32 | ]
33 | }
34 |
--------------------------------------------------------------------------------
/client/pages/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
10 |
18 |
19 |
36 |
--------------------------------------------------------------------------------
/client/plugins/radio/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 单选框 1
5 | 单选框 2
6 |
7 |
8 |
9 |
30 |
31 |
34 |
--------------------------------------------------------------------------------
/client/api/modules/user.js:
--------------------------------------------------------------------------------
1 | /*
2 | 用户相关api
3 | **/
4 | import $axios from "@/service/httpServer";
5 | // 登录
6 | export const login = p => $axios.post('/auth/login', p);
7 | // 注册
8 | export const register = p => $axios.post('/auth/register', p);
9 | // 获取用户信息
10 | export const getUserInfo = () => $axios.get('/user/info');
11 | // 修改用户昵称
12 | export const updateNickName = p => $axios.post('/user/update/name', p);
13 | // 修改密码
14 | export const updateUserPass = p => $axios.post('/user/update/pass', p);
15 | // 修改头像
16 | export const updateUserAvatar = p => $axios.post('/user/update/avatar', p);
17 | // 关键字搜索用户列表
18 | export const getUserListByKeywords = p => $axios.get('/user/getUserList', p);
19 |
20 | // 下载JSON文件
21 | export const JsonDownload = p => $axios.get('/tool/jsonload', p)
--------------------------------------------------------------------------------
/client/permission.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 路由权限相关管理
3 | * */
4 | import router from '@/router'
5 | import NProgress from 'nprogress' // 进度条
6 | import 'nprogress/nprogress.css' // 进度条样式
7 | import userModel from '@/libs/userModel'
8 |
9 | // 导航守卫
10 | router.beforeEach(async(to, from, next) => {
11 | NProgress.start()
12 | // 检测是否需要用户登录验证
13 | if (to.meta.noNeedLogin) {
14 | next()
15 | return;
16 | }
17 | // 用户登录状态拦截,未登录将跳转登录界面
18 | let loginStatus = await userModel.checkLoginState();
19 | if (!loginStatus) {
20 | userModel.goLogin();
21 | return false;
22 | }
23 | console.log(to)
24 | //TODO 根据加载的资源,更新路由meta属性中的title属性,所有的页面title使用route.meta.title
25 | next()
26 | })
27 |
28 | router.afterEach(() => {
29 | NProgress.done() // 结束Progress
30 | })
--------------------------------------------------------------------------------
/public/static/css/chunk-1b5ebbde.04778ce4.css:
--------------------------------------------------------------------------------
1 | .components-preview-inner[data-v-655a0d3a]{width:100%}.setting-bg[data-v-655a0d3a]{position:fixed;left:0;right:0;top:0;bottom:0;background-color:rgba(0,0,0,.8);z-index:1042}.left-panel[data-v-655a0d3a]{position:fixed;top:0;bottom:0;left:0;right:640px;z-index:1050;overflow:hidden}.right-panel[data-v-655a0d3a]{position:fixed;width:640px;top:0;right:0;bottom:0;z-index:1050;background-color:#fff;overflow-y:auto;color:#333}.iframe-wrapper[data-v-655a0d3a]{position:absolute;left:50%;top:50%;margin-left:-185px;margin-top:-334px;background:#fff}.cloase-btn[data-v-655a0d3a]{position:fixed;top:8px;right:20px;font-size:28px;color:#7f8593;-webkit-transition:all .28s;transition:all .28s;z-index:1060;cursor:pointer}.cloase-btn[data-v-655a0d3a]:hover{color:#00acee}
--------------------------------------------------------------------------------
/service/public/static/css/chunk-1b5ebbde.04778ce4.css:
--------------------------------------------------------------------------------
1 | .components-preview-inner[data-v-655a0d3a]{width:100%}.setting-bg[data-v-655a0d3a]{position:fixed;left:0;right:0;top:0;bottom:0;background-color:rgba(0,0,0,.8);z-index:1042}.left-panel[data-v-655a0d3a]{position:fixed;top:0;bottom:0;left:0;right:640px;z-index:1050;overflow:hidden}.right-panel[data-v-655a0d3a]{position:fixed;width:640px;top:0;right:0;bottom:0;z-index:1050;background-color:#fff;overflow-y:auto;color:#333}.iframe-wrapper[data-v-655a0d3a]{position:absolute;left:50%;top:50%;margin-left:-185px;margin-top:-334px;background:#fff}.cloase-btn[data-v-655a0d3a]{position:fixed;top:8px;right:20px;font-size:28px;color:#7f8593;-webkit-transition:all .28s;transition:all .28s;z-index:1060;cursor:pointer}.cloase-btn[data-v-655a0d3a]:hover{color:#00acee}
--------------------------------------------------------------------------------
/client/plugins/image/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
![]()
5 |
![]()
6 |
7 |
8 |
9 |
26 |
27 |
38 |
--------------------------------------------------------------------------------
/client/plugins/button/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{text}}
5 |
6 |
7 |
8 |
31 |
32 |
39 |
--------------------------------------------------------------------------------
/client/plugins/WordCloud/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
32 |
33 |
36 |
--------------------------------------------------------------------------------
/client/store/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Vuex from 'vuex'
3 |
4 | // 各个模块
5 | import editor from './modules/editor'
6 | import user from './modules/user'
7 |
8 |
9 | import { Message } from 'element-ui'
10 | /**
11 | * 全局状态管理
12 | */
13 | const state = {
14 |
15 | };
16 | const actions = {
17 |
18 | /**
19 | * 显示提示 msg.type 类型 msg.data 消息内容
20 | * @param commit
21 | * @param msg
22 | */
23 | showMassage(store, msg) {
24 | console.log(msg)
25 | Message({
26 | type: msg.type,
27 | message: msg.message || msg.data
28 | })
29 | },
30 | };
31 | const mutations = {};
32 | const getters = {};
33 |
34 | Vue.use(Vuex);
35 | export default new Vuex.Store({
36 | state,
37 | getters,
38 | actions,
39 | mutations,
40 | modules: {
41 | editor,
42 | user
43 | }
44 | });
45 |
--------------------------------------------------------------------------------
/client/plugins/FunnelChart/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
31 |
32 |
35 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/text.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
12 |
36 |
37 |
40 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/url.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
12 |
36 |
37 |
40 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/imageSrc.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
35 |
36 |
39 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/musicSrc.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
12 |
36 |
37 |
40 |
--------------------------------------------------------------------------------
/public/static/css/chunk-30466f2e.346304c2.css:
--------------------------------------------------------------------------------
1 | .my-page-list[data-v-48a3b697],.page-list-wrapper[data-v-48a3b697]{height:100%}.my-page-nav-list[data-v-48a3b697]{height:40px;line-height:40px;z-index:2;margin-bottom:20px}.my-page-nav-list .my-page-nav-item[data-v-48a3b697]{float:left;padding-right:32px;text-align:center;cursor:pointer}.my-page-nav-list .my-page-nav-item.active[data-v-48a3b697],.my-page-nav-list .my-page-nav-item[data-v-48a3b697]:hover{color:#00acee}.full-input-w[data-v-48a3b697]{width:100%}.nav-tabs-label[data-v-48a3b697]{display:inline-block;padding:0 16px;height:60px;line-height:60px}.page-search-wrapper[data-v-48a3b697]{padding:0}.page-item-wrapper .page-item[data-v-48a3b697]{float:left;margin-right:20px;margin-bottom:40px}.my-page-list .page-search-wrapper .el-tabs__header{margin:0}.my-page-list .page-search-wrapper .el-tabs__nav-wrap{padding:0 30px}
--------------------------------------------------------------------------------
/public/static/css/chunk-39d883ed.4d235bf0.css:
--------------------------------------------------------------------------------
1 | .my-page-list[data-v-26f12d29],.page-list-wrapper[data-v-26f12d29]{height:100%}.my-page-nav-list[data-v-26f12d29]{height:40px;line-height:40px;z-index:2;margin-bottom:20px}.my-page-nav-list .my-page-nav-item[data-v-26f12d29]{float:left;padding-right:32px;text-align:center;cursor:pointer}.my-page-nav-list .my-page-nav-item.active[data-v-26f12d29],.my-page-nav-list .my-page-nav-item[data-v-26f12d29]:hover{color:#00acee}.full-input-w[data-v-26f12d29]{width:100%}.nav-tabs-label[data-v-26f12d29]{display:inline-block;padding:0 16px;height:60px;line-height:60px}.page-search-wrapper[data-v-26f12d29]{padding:0}.page-item-wrapper .page-item[data-v-26f12d29]{float:left;margin-right:20px;margin-bottom:40px}.my-page-list .page-search-wrapper .el-tabs__header{margin:0}.my-page-list .page-search-wrapper .el-tabs__nav-wrap{padding:0 30px}
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/index.js:
--------------------------------------------------------------------------------
1 | import Text from './text'
2 | import imageSrc from './imageSrc'
3 | import imageSrcList from './imageSrcList'
4 | import Url from './url'
5 | import musicSrc from './musicSrc'
6 | import btnType from './btnType'
7 | import location from './location'
8 | import grid from './grid'
9 | import NoticeBar from './NoticeBar'
10 | import avatar from './avatar'
11 | import Video from './video'
12 |
13 | export default {
14 | [Text.name]: Text,
15 | [imageSrc.name]: imageSrc,
16 | [Url.name]: Url,
17 | [musicSrc.name]: musicSrc,
18 | [imageSrcList.name]: imageSrcList,
19 | [btnType.name]: btnType, //类型选择
20 | [location.name]: location, //地图位置
21 | [grid.name]: grid, //地图位置
22 | [NoticeBar.name]: NoticeBar,
23 | [avatar.name]: avatar,
24 | [Video.name]: Video,
25 | }
--------------------------------------------------------------------------------
/service/public/static/css/chunk-30466f2e.346304c2.css:
--------------------------------------------------------------------------------
1 | .my-page-list[data-v-48a3b697],.page-list-wrapper[data-v-48a3b697]{height:100%}.my-page-nav-list[data-v-48a3b697]{height:40px;line-height:40px;z-index:2;margin-bottom:20px}.my-page-nav-list .my-page-nav-item[data-v-48a3b697]{float:left;padding-right:32px;text-align:center;cursor:pointer}.my-page-nav-list .my-page-nav-item.active[data-v-48a3b697],.my-page-nav-list .my-page-nav-item[data-v-48a3b697]:hover{color:#00acee}.full-input-w[data-v-48a3b697]{width:100%}.nav-tabs-label[data-v-48a3b697]{display:inline-block;padding:0 16px;height:60px;line-height:60px}.page-search-wrapper[data-v-48a3b697]{padding:0}.page-item-wrapper .page-item[data-v-48a3b697]{float:left;margin-right:20px;margin-bottom:40px}.my-page-list .page-search-wrapper .el-tabs__header{margin:0}.my-page-list .page-search-wrapper .el-tabs__nav-wrap{padding:0 30px}
--------------------------------------------------------------------------------
/service/public/static/css/chunk-39d883ed.4d235bf0.css:
--------------------------------------------------------------------------------
1 | .my-page-list[data-v-26f12d29],.page-list-wrapper[data-v-26f12d29]{height:100%}.my-page-nav-list[data-v-26f12d29]{height:40px;line-height:40px;z-index:2;margin-bottom:20px}.my-page-nav-list .my-page-nav-item[data-v-26f12d29]{float:left;padding-right:32px;text-align:center;cursor:pointer}.my-page-nav-list .my-page-nav-item.active[data-v-26f12d29],.my-page-nav-list .my-page-nav-item[data-v-26f12d29]:hover{color:#00acee}.full-input-w[data-v-26f12d29]{width:100%}.nav-tabs-label[data-v-26f12d29]{display:inline-block;padding:0 16px;height:60px;line-height:60px}.page-search-wrapper[data-v-26f12d29]{padding:0}.page-item-wrapper .page-item[data-v-26f12d29]{float:left;margin-right:20px;margin-bottom:40px}.my-page-list .page-search-wrapper .el-tabs__header{margin:0}.my-page-list .page-search-wrapper .el-tabs__nav-wrap{padding:0 30px}
--------------------------------------------------------------------------------
/service/api/file.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const path = require('path')
3 |
4 | module.exports = app => ({
5 | /**
6 | * 单文件上传
7 | * @param file 要上传的文件
8 | * @param folderPath 保存目标目录
9 | * @returns {Promise<{fileName: *, url: string}>}
10 | */
11 | async upload(file, folderName) {
12 | let {$config, $helper} = app;
13 | // 读取文件
14 | let fileData = fs.readFileSync(file.path)
15 | // 将文件存到指定位置
16 | let folderPath = path.join(path.join(__dirname, '../public/resource/'), folderName) // 拼接文件夹
17 | // 判断文件夹是否存在不存在则新建一个
18 | await $helper.dirExists(folderPath);
19 | // 拼接文件路径
20 | let filePath = path.join(folderPath, file.name) // 拼接文件路径
21 | fs.writeFileSync(filePath, fileData)
22 | // 返回文件信息
23 | return {
24 | fileName: file.filename,
25 | url: $config.baseUrl + `/resource/${folderName ? folderName + '/' : ''}${file.name}`
26 | }
27 | }
28 | })
29 |
--------------------------------------------------------------------------------
/public/static/css/chunk-6f24315e.c3a401dd.css:
--------------------------------------------------------------------------------
1 | .page[data-v-5ad9cf8a]{position:relative;margin-top:7%;width:100%;height:100%;background:url(../../static/img/login_bg2.53ecd4df.png) no-repeat 0 0;background-size:494px 602px}.login-card[data-v-5ad9cf8a]{height:100%;padding-right:130px;padding-top:80px;width:100%}.title[data-v-5ad9cf8a]{font-size:2.3rem;font-weight:700;margin:20px 0 50px 40px}.changeBtn[data-v-5ad9cf8a]{cursor:pointer}[data-v-5ad9cf8a] .el-input__inner{border-radius:30px;line-height:80px;background-color:#f5f5f5;border:none;text-indent:20px;height:50px}[data-v-5ad9cf8a] .el-input__prefix{font-size:1.4rem;padding:8px}[data-v-5ad9cf8a] .el-form-item__error{padding-left:50px}[data-v-5ad9cf8a] .el-form-item{margin-bottom:40px}[data-v-5ad9cf8a] .el-dialog__header{text-align:center}[data-v-5ad9cf8a] .el-dialog__body{padding:3px 25px 25px 25px}[data-v-5ad9cf8a] .el-dialog__body .drag_verify{margin-top:20px}
--------------------------------------------------------------------------------
/service/public/static/css/chunk-6f24315e.c3a401dd.css:
--------------------------------------------------------------------------------
1 | .page[data-v-5ad9cf8a]{position:relative;margin-top:7%;width:100%;height:100%;background:url(../../static/img/login_bg2.53ecd4df.png) no-repeat 0 0;background-size:494px 602px}.login-card[data-v-5ad9cf8a]{height:100%;padding-right:130px;padding-top:80px;width:100%}.title[data-v-5ad9cf8a]{font-size:2.3rem;font-weight:700;margin:20px 0 50px 40px}.changeBtn[data-v-5ad9cf8a]{cursor:pointer}[data-v-5ad9cf8a] .el-input__inner{border-radius:30px;line-height:80px;background-color:#f5f5f5;border:none;text-indent:20px;height:50px}[data-v-5ad9cf8a] .el-input__prefix{font-size:1.4rem;padding:8px}[data-v-5ad9cf8a] .el-form-item__error{padding-left:50px}[data-v-5ad9cf8a] .el-form-item{margin-bottom:40px}[data-v-5ad9cf8a] .el-dialog__header{text-align:center}[data-v-5ad9cf8a] .el-dialog__body{padding:3px 25px 25px 25px}[data-v-5ad9cf8a] .el-dialog__body .drag_verify{margin-top:20px}
--------------------------------------------------------------------------------
/client/plugins/PieChart/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
33 |
34 |
37 |
--------------------------------------------------------------------------------
/client/config/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 公共配置文件
3 | */
4 | // import $config from '../../config'
5 |
6 |
7 | const configDict = {
8 | development: {
9 | baseURL: 'http://localhost:8080'
10 | },
11 | production: {
12 | baseURL: 'http://localhost:3333'
13 | }
14 | }
15 |
16 | const currentConfigKey = process.env.NODE_ENV
17 | const isDev = process.env.NODE_ENV === 'development'
18 | const isTest = process.env.NODE_ENV === 'development'
19 |
20 | const configObj = {
21 | isDevelop: (isDev || isTest),
22 | ...configDict[currentConfigKey],
23 | // h5模式宽高
24 | canvasH5Width: 375,
25 | canvasH5Height: 644,
26 | pageModeList: [{
27 | value: 'h5',
28 | label: 'H5',
29 | disabled: false
30 | }, {
31 | value: 'longPage',
32 | label: '长页H5',
33 | disabled: true
34 | }, {
35 | name: 'relativePage',
36 | label: '排版图文',
37 | disabled: true
38 | }, {
39 | value: 'pc',
40 | label: 'PC页面',
41 | disabled: true
42 | }]
43 | }
44 |
45 | export default configObj
--------------------------------------------------------------------------------
/client/plugins/video/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
38 |
39 |
41 |
--------------------------------------------------------------------------------
/client/components/notFundData.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |

5 |
暂无数据
6 |
7 |
8 |
9 |
10 |
25 |
26 |
48 |
--------------------------------------------------------------------------------
/service/controller/cooperation.js:
--------------------------------------------------------------------------------
1 | module.exports = app => ({
2 | /**
3 | * 通过用户列表添加协作人
4 | * @returns {Promise}
5 | */
6 | async addCooperationUser(){
7 | const {ctx, $service, $helper} = app;
8 | const {userIds, pageId} = ctx.request.body;
9 | let cooperationList = await $service.page.addCooperationUser(pageId, userIds);
10 | $helper.returnBody(true, cooperationList)
11 | },
12 | /**
13 | * 获取协作人列表
14 | * @returns {Promise}
15 | */
16 | async getCooperationUserListByPageId(){
17 | const {ctx, $service, $helper} = app;
18 | const {pageId} = ctx.request.query;
19 | let cooperationList = await $service.page.getCooperationUserListByPageId(pageId);
20 | $helper.returnBody(true, cooperationList)
21 | },
22 | /**
23 | * 删除协作人
24 | * @returns {Promise}
25 | */
26 | async removeCooperationUser(){
27 | const {ctx, $service, $helper} = app;
28 | const {pageId, userId} = ctx.request.body;
29 | const cooperationList = await $service.page.removeCooperationUser(pageId, userId);
30 | $helper.returnBody(true, cooperationList)
31 | },
32 |
33 | })
34 |
--------------------------------------------------------------------------------
/engine-template/components/components-template.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
39 |
--------------------------------------------------------------------------------
/service/middleware/auth.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * 登录验证
5 | * @author Oct1a_H
6 | * @return {null} null
7 | */
8 | module.exports = app => {
9 | return async function(ctx, next) {
10 | let { $helper } = app;
11 | let token = '';
12 | if (
13 | ctx.headers.authorization && ctx.headers.authorization.split(' ')[0] === 'Bearer'
14 | ) {
15 | token = ctx.headers.authorization.split(' ')[1];
16 | } else if (ctx.query.accesstoken) {
17 | token = ctx.query.accesstoken;
18 | } else if (ctx.request.body.accesstoken) {
19 | token = ctx.request.body.accesstoken;
20 | } else if (ctx.request.header.cookie) {
21 | token = ctx.request.header.cookie.split('x-csrf-token=')[1] //针对后台接口
22 | }
23 | let user;
24 | try {
25 | user = await $helper.checkToken(token);
26 | } catch (e) {
27 | $helper.returnBody(false, {}, 'Token 无效,请重新登录', 401);
28 | }
29 | if (!user) {
30 | $helper.returnBody(false, {}, 'Token 无效,请重新登录', 401);
31 | return;
32 | }
33 | ctx.userData = user;
34 | app.userData = user;
35 | await next();
36 | };
37 | };
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/btnType.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
40 |
41 |
44 |
--------------------------------------------------------------------------------
/public/static/js/chunk-45ad6033.bf74defa.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-45ad6033"],{"46a8":function(t,a,e){"use strict";e("8794")},"4c72":function(t,a,e){},5114:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-data-list"},[e("div"),e("notFundData")],1)},c=[],s=e("c5c7"),i={components:{notFundData:s["a"]}},u=i,l=(e("46a8"),e("4ac2")),o=Object(l["a"])(u,n,c,!1,null,"6c309750",null);a["default"]=o.exports},8508:function(t,a,e){t.exports=e.p+"static/img/nodata.6b16cccd.jpg"},8794:function(t,a,e){},c5c7:function(t,a,e){"use strict";var n=function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("div",{staticClass:"components-default-style"},[n("div",[n("img",{staticClass:"default-style-img",style:{width:t.width,height:t.height},attrs:{src:e("8508"),alt:""}}),n("p",{staticClass:"tips"},[t._v("暂无数据")])])])},c=[],s={name:"notFundData",props:{width:{type:String,default:"80%"},height:{type:String,default:"80%"}}},i=s,u=(e("e17e"),e("4ac2")),l=Object(u["a"])(i,n,c,!1,null,"402cadde",null);a["a"]=l.exports},e17e:function(t,a,e){"use strict";e("4c72")}}]);
2 | //# sourceMappingURL=chunk-45ad6033.bf74defa.js.map
--------------------------------------------------------------------------------
/public/static/js/chunk-90f63cb6.a8d41848.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-90f63cb6"],{"0bdd":function(t,e,c){},"4c72":function(t,e,c){},"504b":function(t,e,c){"use strict";c.r(e);var n=function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("div",{staticClass:"page-data-detail"},[c("div"),c("notFundData")],1)},a=[],s=c("c5c7"),i={components:{notFundData:s["a"]}},d=i,u=(c("d7bd"),c("4ac2")),l=Object(u["a"])(d,n,a,!1,null,"0d27c64c",null);e["default"]=l.exports},8508:function(t,e,c){t.exports=c.p+"static/img/nodata.6b16cccd.jpg"},c5c7:function(t,e,c){"use strict";var n=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"components-default-style"},[n("div",[n("img",{staticClass:"default-style-img",style:{width:t.width,height:t.height},attrs:{src:c("8508"),alt:""}}),n("p",{staticClass:"tips"},[t._v("暂无数据")])])])},a=[],s={name:"notFundData",props:{width:{type:String,default:"80%"},height:{type:String,default:"80%"}}},i=s,d=(c("e17e"),c("4ac2")),u=Object(d["a"])(i,n,a,!1,null,"402cadde",null);e["a"]=u.exports},d7bd:function(t,e,c){"use strict";c("0bdd")},e17e:function(t,e,c){"use strict";c("4c72")}}]);
2 | //# sourceMappingURL=chunk-90f63cb6.a8d41848.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-45ad6033.b4347f8b.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-45ad6033"],{"46a8":function(t,a,e){"use strict";e("8794")},"4c72":function(t,a,e){},5114:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-data-list"},[e("div"),e("notFundData")],1)},c=[],s=e("c5c7"),i={components:{notFundData:s["a"]}},u=i,l=(e("46a8"),e("4ac2")),o=Object(l["a"])(u,n,c,!1,null,"6c309750",null);a["default"]=o.exports},8508:function(t,a,e){t.exports=e.p+"static/img/nodata.6b16cccd.jpg"},8794:function(t,a,e){},c5c7:function(t,a,e){"use strict";var n=function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("div",{staticClass:"components-default-style"},[n("div",[n("img",{staticClass:"default-style-img",style:{width:t.width,height:t.height},attrs:{src:e("8508"),alt:""}}),n("p",{staticClass:"tips"},[t._v("暂无数据")])])])},c=[],s={name:"notFundData",props:{width:{type:String,default:"80%"},height:{type:String,default:"80%"}}},i=s,u=(e("e17e"),e("4ac2")),l=Object(u["a"])(i,n,c,!1,null,"402cadde",null);a["a"]=l.exports},e17e:function(t,a,e){"use strict";e("4c72")}}]);
2 | //# sourceMappingURL=chunk-45ad6033.b4347f8b.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-45ad6033.bf74defa.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-45ad6033"],{"46a8":function(t,a,e){"use strict";e("8794")},"4c72":function(t,a,e){},5114:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"page-data-list"},[e("div"),e("notFundData")],1)},c=[],s=e("c5c7"),i={components:{notFundData:s["a"]}},u=i,l=(e("46a8"),e("4ac2")),o=Object(l["a"])(u,n,c,!1,null,"6c309750",null);a["default"]=o.exports},8508:function(t,a,e){t.exports=e.p+"static/img/nodata.6b16cccd.jpg"},8794:function(t,a,e){},c5c7:function(t,a,e){"use strict";var n=function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("div",{staticClass:"components-default-style"},[n("div",[n("img",{staticClass:"default-style-img",style:{width:t.width,height:t.height},attrs:{src:e("8508"),alt:""}}),n("p",{staticClass:"tips"},[t._v("暂无数据")])])])},c=[],s={name:"notFundData",props:{width:{type:String,default:"80%"},height:{type:String,default:"80%"}}},i=s,u=(e("e17e"),e("4ac2")),l=Object(u["a"])(i,n,c,!1,null,"402cadde",null);a["a"]=l.exports},e17e:function(t,a,e){"use strict";e("4c72")}}]);
2 | //# sourceMappingURL=chunk-45ad6033.bf74defa.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-90f63cb6.1c456727.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-90f63cb6"],{"0bdd":function(t,e,c){},"4c72":function(t,e,c){},"504b":function(t,e,c){"use strict";c.r(e);var n=function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("div",{staticClass:"page-data-detail"},[c("div"),c("notFundData")],1)},a=[],s=c("c5c7"),i={components:{notFundData:s["a"]}},d=i,u=(c("d7bd"),c("4ac2")),l=Object(u["a"])(d,n,a,!1,null,"0d27c64c",null);e["default"]=l.exports},8508:function(t,e,c){t.exports=c.p+"static/img/nodata.6b16cccd.jpg"},c5c7:function(t,e,c){"use strict";var n=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"components-default-style"},[n("div",[n("img",{staticClass:"default-style-img",style:{width:t.width,height:t.height},attrs:{src:c("8508"),alt:""}}),n("p",{staticClass:"tips"},[t._v("暂无数据")])])])},a=[],s={name:"notFundData",props:{width:{type:String,default:"80%"},height:{type:String,default:"80%"}}},i=s,d=(c("e17e"),c("4ac2")),u=Object(d["a"])(i,n,a,!1,null,"402cadde",null);e["a"]=u.exports},d7bd:function(t,e,c){"use strict";c("0bdd")},e17e:function(t,e,c){"use strict";c("4c72")}}]);
2 | //# sourceMappingURL=chunk-90f63cb6.1c456727.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-90f63cb6.a8d41848.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-90f63cb6"],{"0bdd":function(t,e,c){},"4c72":function(t,e,c){},"504b":function(t,e,c){"use strict";c.r(e);var n=function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("div",{staticClass:"page-data-detail"},[c("div"),c("notFundData")],1)},a=[],s=c("c5c7"),i={components:{notFundData:s["a"]}},d=i,u=(c("d7bd"),c("4ac2")),l=Object(u["a"])(d,n,a,!1,null,"0d27c64c",null);e["default"]=l.exports},8508:function(t,e,c){t.exports=c.p+"static/img/nodata.6b16cccd.jpg"},c5c7:function(t,e,c){"use strict";var n=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"components-default-style"},[n("div",[n("img",{staticClass:"default-style-img",style:{width:t.width,height:t.height},attrs:{src:c("8508"),alt:""}}),n("p",{staticClass:"tips"},[t._v("暂无数据")])])])},a=[],s={name:"notFundData",props:{width:{type:String,default:"80%"},height:{type:String,default:"80%"}}},i=s,d=(c("e17e"),c("4ac2")),u=Object(d["a"])(i,n,a,!1,null,"402cadde",null);e["a"]=u.exports},d7bd:function(t,e,c){"use strict";c("0bdd")},e17e:function(t,e,c){"use strict";c("4c72")}}]);
2 | //# sourceMappingURL=chunk-90f63cb6.a8d41848.js.map
--------------------------------------------------------------------------------
/client/mixins/ossUpload.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 上传相关
3 | */
4 | import OSS from 'ali-oss';
5 | import { mapState } from 'vuex'
6 | export default {
7 | data(){
8 | return {
9 |
10 | }
11 | },
12 | computed: {
13 | ...mapState({
14 | ossConfig: state => state.ossConfig
15 | })
16 | },
17 | created() {
18 | if(!this.ossConfig.stsToken){
19 | this.$store.dispatch('getOssToken')
20 | }
21 | },
22 | methods: {
23 | ossUpload(file){
24 | return new Promise((resolve, reject) => {
25 | this.$store.dispatch('getOssToken').then(() => {
26 | let client = new OSS({
27 | stsToken: this.ossConfig.stsToken,
28 | accessKeyId: this.ossConfig.accessKeyId,
29 | accessKeySecret: this.ossConfig.accessKeySecret,
30 | bucket: this.ossConfig.bucket,
31 | region: this.ossConfig.region,
32 | });
33 | let bojName = 'dwwb/portal/web_docs/' + new Date().getTime() + '/'
34 | async function putBlob () {
35 | try {
36 | let result = await client.put(bojName + file.name, file);
37 | resolve(result);
38 | } catch (e) {
39 | reject(e);
40 | }
41 | }
42 | putBlob();
43 | }).catch(err => {
44 | reject(err);
45 | })
46 | })
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/client/libs/drag/draggable.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
61 |
--------------------------------------------------------------------------------
/client/plugins/notice/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
14 |
15 |
16 |
43 |
44 |
49 |
--------------------------------------------------------------------------------
/public/static/js/chunk-0069f99e.71c57878.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0069f99e"],{"720d":function(t,e,s){"use strict";s.r(e);var i=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"page-home"},[s("div",{staticClass:"home-side-bar"},[s("el-menu",{attrs:{"default-active":"/page-list",router:""}},[s("el-menu-item",{attrs:{index:"/home/page-list"}},[s("i",{staticClass:"el-icon-mobile"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的作品")])]),s("el-menu-item",{attrs:{index:"/home/my-template"}},[s("i",{staticClass:"el-icon-document"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的模板")])]),s("el-menu-item",{attrs:{index:"/home/page-data"}},[s("i",{staticClass:"el-icon-menu"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的数据")])]),s("el-menu-item",{attrs:{index:"/home/template-list"}},[s("i",{staticClass:"el-icon-s-shop"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("创意模板")])])],1)],1),s("div",{staticClass:"clearfix my-page-list"},[s("router-view",{staticClass:"sub-page"})],1)])},a=[],l={},n=l,o=(s("8053"),s("4ac2")),c=Object(o["a"])(n,i,a,!1,null,"659890ee",null);e["default"]=c.exports},"7d47":function(t,e,s){},8053:function(t,e,s){"use strict";s("7d47")}}]);
2 | //# sourceMappingURL=chunk-0069f99e.71c57878.js.map
--------------------------------------------------------------------------------
/client/common/js/runAnimations.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 动画方法, 将动画css加入到元素上,返回promise提供执行后续操作(将动画重置)
3 | * @param $el 当前被执行动画的元素
4 | * @param animationList 动画列表
5 | * @param isDebugger 动画列表
6 | * @returns {Promise}
7 | */
8 | export default async function runAnimation($el, animationList = [], isDebug , callback){
9 | let playFn = function (animation) {
10 | return new Promise(resolve => {
11 | $el.style.animationName = animation.type
12 | $el.style.animationDuration = `${animation.duration}s`
13 | // 如果是循环播放就将循环次数置为1,这样有效避免编辑时因为预览循环播放组件播放动画无法触发animationend来暂停组件动画
14 | $el.style.animationIterationCount = animation.infinite ? (isDebug ? 1 : 'infinite') : animation.interationCount
15 | $el.style.animationDelay = `${animation.delay}s`
16 | $el.style.animationFillMode = 'both'
17 | let resolveFn = function(){
18 | $el.removeEventListener('animationend', resolveFn, false);
19 | $el.removeEventListener('animationcancel', resolveFn, false);
20 | resolve()
21 | }
22 | $el.addEventListener('animationend', resolveFn, false)
23 | $el.addEventListener('animationcancel', resolveFn, false);
24 | })
25 | }
26 | for(let i = 0, len = animationList.length; i < len; i++){
27 | await playFn(animationList[i])
28 | }
29 | if(callback){
30 | callback()
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/service/public/static/js/chunk-0069f99e.71c57878.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0069f99e"],{"720d":function(t,e,s){"use strict";s.r(e);var i=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"page-home"},[s("div",{staticClass:"home-side-bar"},[s("el-menu",{attrs:{"default-active":"/page-list",router:""}},[s("el-menu-item",{attrs:{index:"/home/page-list"}},[s("i",{staticClass:"el-icon-mobile"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的作品")])]),s("el-menu-item",{attrs:{index:"/home/my-template"}},[s("i",{staticClass:"el-icon-document"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的模板")])]),s("el-menu-item",{attrs:{index:"/home/page-data"}},[s("i",{staticClass:"el-icon-menu"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的数据")])]),s("el-menu-item",{attrs:{index:"/home/template-list"}},[s("i",{staticClass:"el-icon-s-shop"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("创意模板")])])],1)],1),s("div",{staticClass:"clearfix my-page-list"},[s("router-view",{staticClass:"sub-page"})],1)])},a=[],l={},n=l,o=(s("8053"),s("4ac2")),c=Object(o["a"])(n,i,a,!1,null,"659890ee",null);e["default"]=c.exports},"7d47":function(t,e,s){},8053:function(t,e,s){"use strict";s("7d47")}}]);
2 | //# sourceMappingURL=chunk-0069f99e.71c57878.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-0069f99e.e3bb6e53.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0069f99e"],{"720d":function(t,e,s){"use strict";s.r(e);var i=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"page-home"},[s("div",{staticClass:"home-side-bar"},[s("el-menu",{attrs:{"default-active":"/page-list",router:""}},[s("el-menu-item",{attrs:{index:"/home/page-list"}},[s("i",{staticClass:"el-icon-mobile"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的作品")])]),s("el-menu-item",{attrs:{index:"/home/my-template"}},[s("i",{staticClass:"el-icon-document"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的模板")])]),s("el-menu-item",{attrs:{index:"/home/page-data"}},[s("i",{staticClass:"el-icon-menu"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("我的数据")])]),s("el-menu-item",{attrs:{index:"/home/template-list"}},[s("i",{staticClass:"el-icon-s-shop"}),s("span",{attrs:{slot:"title"},slot:"title"},[t._v("创意模板")])])],1)],1),s("div",{staticClass:"clearfix my-page-list"},[s("router-view",{staticClass:"sub-page"})],1)])},a=[],l={},n=l,o=(s("8053"),s("4ac2")),c=Object(o["a"])(n,i,a,!1,null,"659890ee",null);e["default"]=c.exports},"7d47":function(t,e,s){},8053:function(t,e,s){"use strict";s("7d47")}}]);
2 | //# sourceMappingURL=chunk-0069f99e.e3bb6e53.js.map
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/script-edit.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
脚本编辑
4 |
js脚本在编辑模式下无效果
5 |
6 |
9 |
10 |
11 |
12 |
13 |
14 |
39 |
40 |
43 |
--------------------------------------------------------------------------------
/service/controller/image.js:
--------------------------------------------------------------------------------
1 | /**
2 | * images lib 相关
3 | * @param app
4 | * @returns {{corsproxy(): Promise}}
5 | */
6 |
7 | module.exports = app => ({
8 | /**
9 | * 获取我的图片列表
10 | * @returns {Promise}
11 | */
12 | async getMyImages() {
13 | const { $service, $helper } = app;
14 | const imageList = await $service.image.getMyImages();
15 | $helper.returnBody(true, imageList)
16 | },
17 | /**
18 | * 上传我的图片
19 | * @returns {Promise}
20 | */
21 | async uploadImage() {
22 | const { ctx, $service, $helper } = app;
23 | let userData = ctx.userData;
24 | // 时间戳
25 | let timestamps = (new Date().getTime()).toString();
26 | let file = ctx.request.files.file;
27 | let fileResult = await $service.file.upload(file, 'image_lib/' + userData.username + '/' + timestamps);
28 | const imageData = await $service.image.addImage(fileResult.url);
29 | $helper.returnBody(true, imageData)
30 | },
31 | /**
32 | * 获取外部图片
33 | */
34 | async getExternalImages() {
35 | const { ctx, $service, $helper } = app;
36 | const imageData = await $service.image.getExternalImages().then(r => r)
37 | // $helper.returnBody(true, { data: JSON.parse(imageData) })
38 | // console.log(imageData)
39 | $helper.returnBody(true, { data: imageData })
40 | }
41 | })
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/avatar.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
45 |
46 |
49 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/grid.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
14 |
15 |
16 |
17 |
18 |
19 |
43 |
44 |
52 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Dcode-Editor
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/client/libs/keypress/keypress.js:
--------------------------------------------------------------------------------
1 | import keyCode from './keycode';
2 | const getKeyMap = (keymap) => Object.keys(keymap).map((input) => {
3 | const result = { callback: () => { console.log(11); } };
4 | input.split('.').forEach((keyName) => {
5 | switch (keyName.toLowerCase()) {
6 | case 'ctrl':
7 | case 'alt':
8 | case 'shift':
9 | case 'meta':
10 | result[keyName] = true;
11 | break;
12 | default:
13 | result.keyCode = keyCode(keyName);
14 | }
15 | });
16 | result.callback = keymap[input];
17 | return result;
18 | });
19 | export default {
20 | install(Vue) {
21 | Vue.directive('hotkey', {
22 | bind(el, binding) {
23 | const _keymap = getKeyMap(binding.value);
24 | el._keyHandler = (e) => {
25 | for (const hotkey of _keymap) {
26 | hotkey.keyCode === e.keyCode &&
27 | !!hotkey.ctrl === e.ctrlKey &&
28 | !!hotkey.alt === e.altKey &&
29 | !!hotkey.shift === e.shiftKey &&
30 | !!hotkey.meta === e.metaKey &&
31 | hotkey.callback(e);
32 | }
33 | };
34 | document.addEventListener('keydown', el._keyHandler);
35 | },
36 | unbind(el) {
37 | document.removeEventListener('keydown', el._keyHandler);
38 | }
39 | });
40 | }
41 | };
--------------------------------------------------------------------------------
/common/secret.js:
--------------------------------------------------------------------------------
1 | const CryptoJS = require('crypto-js'); //引用AES源码js
2 |
3 | const keyStr = "icklsdufidsakdfa"; //十六位十六进制数作为密钥
4 | const ivStr = ''; // 偏移量
5 |
6 | function Encrypt(data){
7 | var key = CryptoJS.enc.Utf8.parse(keyStr);
8 | var iv = CryptoJS.enc.Utf8.parse(ivStr);
9 | var encrypted =CryptoJS.AES.encrypt(data,key,{
10 | iv:iv,
11 | mode:CryptoJS.mode.ECB,
12 | padding:CryptoJS.pad.Pkcs7
13 | });
14 | //返回的是base64格式的密文
15 | return encrypted.ciphertext.toString();
16 | }
17 |
18 | // encrypted 为是base64格式的密文
19 | function Decrypt(encrypted){
20 | var encryptedHexStr = CryptoJS.enc.Hex.parse(encrypted);
21 | var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
22 | var key = CryptoJS.enc.Utf8.parse(keyStr);
23 | var iv = CryptoJS.enc.Utf8.parse(ivStr);
24 | var decrypted =CryptoJS.AES.decrypt(srcs,key,{
25 | iv:iv,
26 | mode:CryptoJS.mode.CBC,
27 | padding:CryptoJS.pad.Pkcs7
28 | });
29 | return decrypted.toString(CryptoJS.enc.Utf8);
30 | }
31 |
32 | // 测试加、解密
33 | function testAES(){
34 | var data = "1234567890123456"; // 明文
35 |
36 | console.log("加密前:" + data);
37 |
38 | // 测试加密
39 | var encrypted = Encrypt(data); // 密文
40 | console.log("加密后: " + encrypted);
41 |
42 | // var decryptedStr = Decrypt(encrypted);
43 | // console.log("解密后: " + decryptedStr);
44 | }
45 | // testAES()
46 | export default {
47 | Decrypt ,
48 | Encrypt
49 | }
50 |
--------------------------------------------------------------------------------
/service/controller/API.js:
--------------------------------------------------------------------------------
1 | module.exports = app => ({
2 | /**
3 | * 获取用户作品列表
4 | * @returns {Promise<*>}
5 | */
6 | async getWorks() {
7 | const { $model, $helper } = app;
8 | let works = await $model.page.find();
9 | $helper.returnBody(true, works)
10 | },
11 | /**
12 | * 获取用户列表
13 | * @returns {Promise<*>}
14 | */
15 | async getUsers() {
16 | const { $model, $helper } = app;
17 | let users = await $model.user.find();
18 | $helper.returnBody(true, users)
19 | },
20 |
21 | /**
22 | * 更新用户状态
23 | * @returns {Promise}
24 | */
25 | async updateUserStatus() {
26 | const { ctx, $service, $helper } = app;
27 | const { id, state } = ctx.request.body
28 | await $service.user.updateUserStatus(id, state);
29 | $helper.returnBody(true)
30 | },
31 |
32 | /**
33 | * 更新用户权限
34 | * @returns {Promise}
35 | */
36 | async updateUserPower() {
37 | const { ctx, $service, $helper } = app;
38 | const { id } = ctx.request.body
39 | await $service.user.updateUserPower(id);
40 | $helper.returnBody(true)
41 | },
42 |
43 | /**
44 | * 删除作品
45 | */
46 | async delWork() {
47 | const { ctx, $service, $helper } = app;
48 | let { id } = ctx.request.body;
49 | await $service.page.deletePage(id);
50 | $helper.returnBody(true)
51 | }
52 |
53 | })
--------------------------------------------------------------------------------
/client/plugins/tabars/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 标签
5 | 标签
6 | 标签
7 | 标签
8 |
9 |
10 |
11 |
12 |
52 |
53 |
58 |
--------------------------------------------------------------------------------
/client/common/js/secret.js:
--------------------------------------------------------------------------------
1 | const CryptoJS = require('crypto-js'); //引用AES源码js
2 |
3 | const keyStr = "===Oct1a_H==="; //十六位十六进制数作为密钥
4 | const ivStr = ''; // 偏移量
5 |
6 | function Encrypt(data) {
7 | var key = CryptoJS.enc.Utf8.parse(keyStr);
8 | var iv = CryptoJS.enc.Utf8.parse(ivStr);
9 | var encrypted = CryptoJS.AES.encrypt(data, key, {
10 | iv: iv,
11 | mode: CryptoJS.mode.ECB,
12 | padding: CryptoJS.pad.Pkcs7
13 | });
14 | //返回的是base64格式的密文
15 | return encrypted.ciphertext.toString();
16 | }
17 |
18 | // encrypted 为是base64格式的密文
19 | function Decrypt(encrypted) {
20 | var encryptedHexStr = CryptoJS.enc.Hex.parse(encrypted);
21 | var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
22 | var key = CryptoJS.enc.Utf8.parse(keyStr);
23 | var iv = CryptoJS.enc.Utf8.parse(ivStr);
24 | var decrypted = CryptoJS.AES.decrypt(srcs, key, {
25 | iv: iv,
26 | mode: CryptoJS.mode.CBC,
27 | padding: CryptoJS.pad.Pkcs7
28 | });
29 | return decrypted.toString(CryptoJS.enc.Utf8);
30 | }
31 |
32 | // 测试加、解密
33 | // function testAES() {
34 | // var data = "1234567890123456"; // 明文
35 |
36 | // console.log("加密前:" + data);
37 |
38 | // // 测试加密
39 | // var encrypted = Encrypt(data); // 密文
40 | // console.log("加密后: " + encrypted);
41 |
42 | // // var decryptedStr = Decrypt(encrypted);
43 | // // console.log("解密后: " + decryptedStr);
44 | // }
45 | // testAES()
46 | export default {
47 | Decrypt,
48 | Encrypt
49 | }
--------------------------------------------------------------------------------
/service/config/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | port: 3333,
3 | mongodb: {
4 | url: 'mongodb://localhost:27017/Oct1a',
5 | options: {}
6 | },
7 | middleware: ['handlerError'],
8 | jwt: { secret: 'Oct1a_H' },
9 | crypto: { secret: '#*#*Oct1a_H*#*#' },
10 | baseUrl: '',
11 | eqxiuCookie: '_tracker_distinct_id_=2020111920aaabbc; ARK_ID=JSdfda9e002ba3079ecdec774543e214ebdfda; _tracker_user_id_=b9564bd5d2714e12b5cc243eabfe3ea1; bigdata_user_reg_time=2020-12-17%2008%3A46%3A50; Hm_lvt_93cd06ebda2db598041456a9d18c7299=1618806303,1619361256,1620872002; _tracker_ab=abTest_v1_undefined_undefined; ab_trace_id=8794808596b941fa865a543cb2a7fef8; JSESSIONID=79319b30297241978acbcbf913cc818d; canvasId=51a92dcf-a5f0-4040-90a5-b108292fc4f5; ARK_STARTUP=eyJTVEFSVFVQIjp0cnVlLCJTVEFSVFVQVElNRSI6IjIwMjEtMDUtMjAgMDk6MTA6NTEuMTgwIn0%3D; eip-user-login-first={"e3ea1":"2021-05-20"}; _tracker_session_id_=3d01aaab-e93c-42d0-88d6-4cda23b74234; _tracker_launch_=1; FZ_STROAGE.eqxiu.com=eyJBUktTVVBFUiI6eyJwcm9kdWN0IjoiSDXllYbln44ifSwiU0VFU0lPTklEIjoiZjU1YjI0NTk0MDkzOTFlZSIsIlNFRVNJT05EQVRFIjoxNjIxNDczMDYxODgzLCJBTlNBUFBJRCI6ImYxY2MwYWUzZTBkMDc4MjIiLCJBTlMkREVCVUciOjAsIkFOU1VQTE9BRFVSTCI6Imh0dHBzOi8vYXJrLXB1c2gxLmVxeGl1LmNvbS8iLCJGUklTVERBWSI6IjIwMjEwNTE0IiwiRlJJU1RJTUUiOmZhbHNlLCJBUktfSUQiOiJKU2RmZGE5ZTAwMmJhMzA3OWVjZGVjNzc0NTQzZTIxNGViZGZkYSIsIkFSS0ZSSVNUUFJPRklMRSI6IjIwMjEtMDUtMTQgMTU6MzY6NTAuMzUxIn0%3D; _tracker_share_level_=0; _tracker_from_user_=; _tracker_from_id_='
12 | }
--------------------------------------------------------------------------------
/service/views/h5-long.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
31 |
34 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/client/plugins/banner/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
![]()
5 |
![]()
6 |
7 |
8 |
9 |
37 |
38 |
49 |
--------------------------------------------------------------------------------
/common/ajax.js:
--------------------------------------------------------------------------------
1 | /**
2 | * http请求封装
3 | * @param opt
4 | */
5 | /*-------------------Ajax start--------------------*/
6 |
7 | function ajax(options) {
8 | return new Promise((resolve, reject) => {
9 | options = options || {};
10 | options.type = (options.type || "GET").toUpperCase();
11 | options.dataType = options.dataType || "json";
12 | var params = formatParams(options.data);
13 | var xhr;
14 |
15 | //创建 - 第一步
16 | xhr = new XMLHttpRequest();
17 |
18 | //连接 和 发送 - 第二步
19 | if (options.type == "GET") {
20 | xhr.open("GET", options.url + "?" + params, true);
21 | xhr.send(null);
22 | } else if (options.type == "POST") {
23 | xhr.open("POST", options.url, true);
24 | //设置表单提交时的内容类型
25 | xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
26 | xhr.send(params);
27 | }
28 |
29 | //接收 - 第三步
30 | xhr.onreadystatechange = function () {
31 | if (xhr.readyState == 4) {
32 | var status = xhr.status;
33 | if (status >= 200 && status < 300 || status == 304) {
34 | resolve(xhr.responseText, xhr.responseXML)
35 | } else {
36 | reject(status)
37 | }
38 | }
39 | }
40 | })
41 | }
42 |
43 | //格式化参数
44 | function formatParams(data){
45 | var arr = [];
46 | for (var name in data) {
47 | arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
48 | }
49 | arr.push(("v=" + Math.random()).replace(".",""));
50 | return arr.join("&");
51 | }
52 |
53 | /*-------------------Ajax end-------------------*/
54 |
55 | export default ajax
56 |
--------------------------------------------------------------------------------
/client/api/modules/page.js:
--------------------------------------------------------------------------------
1 | /*
2 | 页面相关api
3 | **/
4 | import $axios from "@/service/httpServer";
5 | // 获取我的页面列表
6 | export const getMyPages = p => $axios.get('/page/getMyPages', p);
7 | // 获取我的页面详情
8 | export const getPageDetail = p => $axios.get('/page/detail', p);
9 | // 新增页面
10 | export const createPage = p => $axios.post('/page/create', p);
11 | // 更新页面
12 | export const updatePage = p => $axios.post('/page/update', p);
13 | // 删除页面
14 | export const deletePage = p => $axios.post('/page/delete', p);
15 | // 复制页面
16 | export const copyPage = p => $axios.post('/page/copy', p);
17 | // 设置为模板
18 | export const setTemplatePage = p => $axios.post('/page/setTemplate', p);
19 | // 发布页面
20 | export const publishPage = p => $axios.post('/page/setPublish', p);
21 |
22 | /**
23 | * ========================================================================
24 | * */
25 | // 获取我的模板
26 | export const getMyTemplates = p => $axios.get('/page/getMyTemplates', p);
27 |
28 |
29 | /**
30 | * ========================================================================
31 | * */
32 | // 获取模板市场模板
33 | export const getPublishTemplates = p => $axios.get('/page/getPublishTemplates', p);
34 |
35 | /**
36 | * ========================================================================
37 | * */
38 | // 获取协作人列表
39 | export const getCooperationUserListByPageId = p => $axios.get('/page/getCooperationList', p)
40 | // 按userIds添加协作人
41 | export const addCooperation = p => $axios.post('/page/addCooperation', p)
42 | // 删除协作人
43 | export const delCooperation = p => $axios.post('/page/delCooperation', p)
--------------------------------------------------------------------------------
/engine-template/engine-h5-swiper/src/components-template.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
57 |
--------------------------------------------------------------------------------
/client/pages/home/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 我的作品
8 |
9 |
10 |
11 | 我的模板
12 |
13 |
14 |
15 | 我的数据
16 |
17 |
18 |
19 | 创意模板
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
33 |
34 |
56 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-edit.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
14 |
15 |
16 |
17 |
41 |
42 |
56 |
63 |
--------------------------------------------------------------------------------
/client/common/styles/variables.scss:
--------------------------------------------------------------------------------
1 | /*=================================================================
2 | 颜色
3 | =================================================================*/
4 |
5 | $border-color: #e6ebed;
6 | $white: #fff;
7 | $primary: #00acee;
8 | $success: #3DBD37;
9 | $gray: #7F8593;
10 | $error: #ea5361;
11 | $color-gradient: linear-gradient(to right, #5ac66a 0%, #3caa7d 80%, #3AA27F 100%); // 渐变
12 | $color-gradient-hover: linear-gradient(to right, #5ac66a 0%, #3caa7d 80%, #3AA27F 100%); // 渐变
13 | $color-gradient: linear-gradient(to right, #5ac66a 0%, #3caa7d 80%, #3AA27F 100%); // 渐变
14 | // $page-bg-color : #F0F2F5;
15 | $page-bg-color: #f9f9f9;
16 |
17 | /*=================================================================
18 | 动画
19 | =================================================================*/
20 |
21 | $transition-time: 0.28s; // 动画时间
22 |
23 | /*=================================================================
24 | 侧边栏导航
25 | =================================================================*/
26 |
27 | $side-bar-background-color: #304156;
28 | $side-bar-background-color-active: #2F404F;
29 |
30 | /*=================================================================
31 | 页面布局相关
32 | =================================================================*/
33 |
34 | $header-height: 48px; // 顶部header的高度
35 | $side-bar-width: 68px; // 侧边栏
36 | $header-both-sides-padding: 24px; //页面边缘与内容间的padding
37 | $content-both-sides-padding: 32px; //页面边缘与内容间的padding
38 | // 页尾背景色
39 | $footer-background-color: #858585;
40 | // 首页 前三大模块中 hover 背景色
41 | $home-li-hover-background-color:#00acee;
--------------------------------------------------------------------------------
/common/uitls.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 生成uuid方法
3 | * @returns {string}
4 | * https://segmentfault.com/q/1010000039371012?utm_source=sf-similar-question
5 | */
6 | export const createUUID = function() {
7 | var d = new Date().getTime();
8 | if (window.performance && typeof window.performance.now === "function") {
9 | d += performance.now(); //use high-precision timer if available
10 | }
11 | var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
12 | var r = (d + Math.random() * 16) % 16 | 0; //按位或运算
13 | d = Math.floor(d / 16);
14 | return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); //将一个 Number 对象转换为 16 进制字符串
15 | });
16 | return uuid;
17 | }
18 |
19 | /**
20 | * 深拷贝
21 | * @param {*} obj 拷贝对象(object or array)
22 | * @param {*} cache 缓存数组
23 | */
24 | export const deepClone = function(obj, cache = []) {
25 | // typeof [] => 'object'
26 | // typeof {} => 'object'
27 | if (obj === null || typeof obj !== 'object') {
28 | return obj
29 | }
30 | // 如果传入的对象与缓存的相等, 则递归结束, 这样防止循环
31 | /**
32 | * 类似下面这种
33 | * var a = {b:1}
34 | * a.c = a
35 | * 资料: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value
36 | */
37 | const hit = cache.filter(c => c.original === obj)[0]
38 | if (hit) {
39 | return hit.copy
40 | }
41 |
42 | const copy = Array.isArray(obj) ? [] : {}
43 | // 将copy首先放入cache, 因为我们需要在递归deepCopy的时候引用它
44 | cache.push({
45 | original: obj,
46 | copy
47 | })
48 | Object.keys(obj).forEach(key => {
49 | copy[key] = deepClone(obj[key], cache)
50 | })
51 |
52 | return copy
53 | }
--------------------------------------------------------------------------------
/service/model/page.js:
--------------------------------------------------------------------------------
1 | module.exports = app => {
2 | const { mongoose } = app;
3 | const Schema = mongoose.Schema
4 | // Schema
5 | const schema = new Schema({
6 | title: { type: String, default: '未命名场景' },
7 | coverImage: { type: String, default: '' },
8 | description: { type: String, default: '我用Dcode-Editor可视化编辑器做了一个超酷炫的H5,快来看看吧。' },
9 | shareConfig: {
10 | shareWx: { type: Boolean, default: false },
11 | coverImage: { type: String, default: '' },
12 | title: { type: String, default: '这是#分享者#的大力推荐' },
13 | description: { type: String, default: '这是#分享者#大力推荐的H5' },
14 | },
15 | pages: Schema.Types.Mixed, //用于原始数据存储
16 | script: { type: String, default: '' }, // 第三方脚本插件
17 | author: {
18 | type: String,
19 | ref: "user"
20 | },
21 | width: { type: Number, default: 375 }, // 页面宽
22 | height: { type: Number, default: 611 }, // 页面高度
23 | pageMode: { type: String, default: 'h5' }, // 渲染模式
24 | flipType: { type: Number, default: 0 }, // 翻页模式
25 | slideNumber: { type: Boolean, default: false }, // 翻页是否显示页码翻页指示
26 | add_time: Number,
27 | up_time: Number,
28 | status: { type: Number, enum: [0, 1], default: 1 }, // 0 不允许访问, 1 允许访问
29 | isPublish: { type: Boolean, default: false }, // 发布状态
30 | isTemplate: { type: Boolean, default: false },
31 | members: [{
32 | type: String,
33 | ref: "user"
34 | }], // 共享人员列表
35 | version: {
36 | type: Number,
37 | default: 1
38 | }
39 | }, { timestamps: { createdAt: 'created', updatedAt: 'updated' } })
40 | return mongoose.model('page', schema);
41 | };
--------------------------------------------------------------------------------
/client/plugins/image-carousel/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
47 |
48 |
57 |
62 |
--------------------------------------------------------------------------------
/client/pages/editor/components/history.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
14 |
15 | 历史记录
16 | x
17 |
18 |
19 |
20 |
21 |
22 |
23 |
55 |
56 |
--------------------------------------------------------------------------------
/client/store/modules/user.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 用户相关
3 | */
4 | import { setLocalStorage, getLocalStorage } from '@/common/js/mUtils'
5 | const state = {
6 | access_token: '',
7 | permissionsList: [],
8 | userInfo: {},
9 | }
10 | const actions = {
11 |
12 | };
13 |
14 | const mutations = {
15 | /**
16 | * 更新用户data info数据
17 | */
18 | UPDATE_USER_INFO(state, data) {
19 | state.userInfo = {...data }
20 | // 存储状态
21 | mutations['SAVE_USER_TO_LOCAL'](state)
22 | },
23 | /**
24 | * 更新oauth相关
25 | */
26 | UPDATE_ACCESS_TOKEN(state, data) {
27 | state.access_token = data || ''
28 | // 存储状态
29 | mutations['SAVE_USER_TO_LOCAL'](state)
30 | },
31 | /**
32 | * 更新个人权限相关
33 | * @param state
34 | * @param data
35 | */
36 | UPDATE_USER_PERMISSION(state, data) {
37 | state.permissionsList = data || [];
38 | // 存储状态
39 | mutations['SAVE_USER_TO_LOCAL'](state)
40 | },
41 |
42 | /**
43 | * 将user state 数据存储在localstore里面
44 | * @param state
45 | */
46 | SAVE_USER_TO_LOCAL(state) {
47 | setLocalStorage('user', state)
48 | },
49 | /**
50 | * 从localstorage里取出数据更新user
51 | * @param state
52 | */
53 | UPDATE_USER_FROM_LOCAL(state) {
54 | let user = getLocalStorage('user')
55 | if (user) {
56 | for (let key in state) {
57 | state[key] = user[key]
58 | }
59 | }
60 | }
61 | }
62 |
63 |
64 | const getters = {
65 | authorization(state) {
66 | return state.access_token ? 'Bearer ' + state.access_token : ''
67 | },
68 | userInfo(state) {
69 | return state.userInfo
70 | }
71 | };
72 |
73 |
74 | export default {
75 | state,
76 | actions,
77 | getters,
78 | mutations
79 | }
--------------------------------------------------------------------------------
/client/libs/drag/droppable.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
70 |
--------------------------------------------------------------------------------
/client/plugins/avatar/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
45 |
46 |
60 |
--------------------------------------------------------------------------------
/service/api/image.js:
--------------------------------------------------------------------------------
1 | const request = require('request');
2 | const $config = require('../config')
3 | module.exports = app => ({
4 | /**
5 | * 获取我的图片列表
6 | * @returns {Promise<*>}
7 | */
8 | async getMyImages() {
9 | const { ctx, $model } = app;
10 | let userData = ctx.userData
11 | let query = { author: userData._id };
12 | return await $model.image.find(query).select('_id url').exec();
13 | },
14 | /**
15 | * 添加图片
16 | * @param url
17 | * @returns {Promise<*>}
18 | */
19 | async addImage(url) {
20 | const { ctx, $model } = app;
21 | let userData = ctx.userData;
22 | return await $model.image.create({
23 | author: userData._id,
24 | url: url
25 | });
26 | },
27 | /**
28 | * 获取外部图片
29 | */
30 | async getExternalImages() {
31 | const { ctx } = app;
32 | let url = 'https://material-api.eqxiu.com/m/material/category/template/list?categoryId=898438&searchCode=94231&sortBy=0&fee=&pageNo=5&pageSize=20'
33 | // let url = 'https://www.vcg.com/api/common/searchImage?assetFormat%5B%5D=png&phrase=%E4%BA%BA%E7%89%A9&graphicalStyle=6&transform=renwu&isRecommendCreativeFreshData=false'
34 | var options = {
35 | url,
36 | 'method': 'GET',
37 | 'headers': {
38 | 'cookie': $config.eqxiuCookie
39 | }
40 | };
41 | return new Promise((resolve, reject) => {
42 | request(options, function(error, response, body) {
43 | if (!error && response.statusCode == 200) {
44 | let arr = JSON.parse(body)
45 | resolve(arr.obj)
46 | // resolve(JSON.stringify(arr.list, ['equalw_url', 'url800', 'width', 'height']))
47 | } else {
48 | reject(error)
49 | }
50 | })
51 | })
52 | }
53 | })
--------------------------------------------------------------------------------
/client/pages/editor/components/keyboard.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{key}}
6 |
{{ele}}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
53 |
54 |
--------------------------------------------------------------------------------
/client/plugins/text/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
64 |
65 |
70 |
--------------------------------------------------------------------------------
/service/public/third-libs/flexible.js:
--------------------------------------------------------------------------------
1 | !function(a,b){function c(){var b=f.getBoundingClientRect().width;b/i>540&&(b=540*i);var c=b/10;f.style.fontSize=c+'px',k.rem=a.rem=c;}var d,e=a.document,f=e.documentElement,g=e.querySelector('meta[name="viewport"]'),h=e.querySelector('meta[name="flexible"]'),i=0,j=0,k=b.flexible||(b.flexible={});if(g){console.warn('将根据已有的meta标签来设置缩放比?');var l=g.getAttribute('content').match(/initial\-scale=([\d\.]+)/);l&&(j=parseFloat(l[1]),i=parseInt(1/j));}else if(h){var m=h.getAttribute('content');if(m){var n=m.match(/initial\-dpr=([\d\.]+)/),o=m.match(/maximum\-dpr=([\d\.]+)/);n&&(i=parseFloat(n[1]),j=parseFloat((1/i).toFixed(2))),o&&(i=parseFloat(o[1]),j=parseFloat((1/i).toFixed(2)));}}if(!i&&!j){var p=(a.navigator.appVersion.match(/android/gi),a.navigator.appVersion.match(/iphone/gi)),q=a.devicePixelRatio;i=p?q>=3&&(!i||i>=3)?3:q>=2&&(!i||i>=2)?2:1:1,j=1/i;}if(f.setAttribute('data-dpr',i),!g)if(g=e.createElement('meta'),g.setAttribute('name','viewport'),g.setAttribute('content','initial-scale='+j+', maximum-scale='+j+', minimum-scale='+j+', user-scalable=no'),f.firstElementChild)f.firstElementChild.appendChild(g);else{var r=e.createElement('div');r.appendChild(g),e.write(r.innerHTML);}a.addEventListener('resize',function(){clearTimeout(d),d=setTimeout(c,300);},!1),a.addEventListener('pageshow',function(a){a.persisted&&(clearTimeout(d),d=setTimeout(c,300));},!1),'complete'===e.readyState?e.body.style.fontSize=12*i+'px':e.addEventListener('DOMContentLoaded',function(){e.body.style.fontSize=12*i+'px';},!1),c(),k.dpr=a.dpr=i,k.refreshRem=c,k.rem2px=function(a){var b=parseFloat(a)*this.rem;return'string'==typeof a&&a.match(/rem$/)&&(b+='px'),b;},k.px2rem=function(a){var b=parseFloat(a)/this.rem;return'string'==typeof a&&a.match(/px$/)&&(b+='rem'),b;};}(window,window.lib||(window.lib={}));
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/imageSrcList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
69 |
70 |
73 |
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/NoticeBar.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
14 | 静止
15 | 滚动
16 |
17 |
18 | 是
19 | 否
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
58 |
59 |
62 |
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 | const fs = require('fs')
3 |
4 | function resolve(dir) {
5 | return path.join(__dirname, dir)
6 | }
7 |
8 | let devServer = {
9 | proxy: { // 代理
10 | '/': {
11 | target: 'http://localhost:3333', //设置你调用的接口域名和端口号 别忘了加http
12 | ws: false, //如果要代理 websockets
13 | changeOrigin: true, //将主机标头的原点更改为目标URL
14 | pathRewrite: {},
15 | }
16 | }
17 | }
18 |
19 | module.exports = {
20 | devServer: devServer,
21 | // 输出文件目录
22 | assetsDir: "static",
23 | outputDir: './service/public',
24 | // publicPath: "./service/public",
25 | publicPath: "./",
26 | // 修改 pages 入口
27 | pages: {
28 | index: {
29 | entry: 'client/main.js', // 入口
30 | template: 'public/engine-h5-long.html', // 模板
31 | filename: 'index.html', // 输出文件
32 | }
33 | },
34 | css: {
35 | loaderOptions: {
36 | sass: {
37 | // @/ 是 src/ 的别名,设置全局css变量
38 | data: fs.readFileSync(path.resolve(__dirname, `./client/common/styles/variables.scss`), 'utf-8') // 公共变量文件注入
39 | }
40 | }
41 | },
42 | // 扩展 webpack 配置
43 | chainWebpack: config => {
44 | // @ 默认指向 src 目录,这里要改成 examples
45 | // 另外也可以新增一个 ~ 指向 packages
46 | config.resolve.alias
47 | .set('@', path.resolve('client'))
48 | .set('@client', path.resolve('client'))
49 | .set('@plugins', path.resolve('plugins'))
50 | .set('@service', path.resolve('service'))
51 | config.module
52 | .rule('js')
53 | .include.add(/engine-template/).end()
54 | .include.add(/client/).end()
55 | .include.add(/common/).end()
56 | .use('babel')
57 | .loader('babel-loader')
58 |
59 | .tap(options => {
60 | // 修改它的选项...
61 | return options
62 | })
63 | // 移除 prefetch 插件,当页面太多时,会导致太多无意义的请求
64 | config.plugins.delete('prefetch')
65 |
66 | }
67 | }
--------------------------------------------------------------------------------
/service/controller/psd.js:
--------------------------------------------------------------------------------
1 | /**
2 | * psd解析
3 | * @param app
4 | * @returns {{corsproxy(): Promise}}
5 | * 文档:https://github.com/meltingice/psd.js
6 | */
7 | const PSD = require('psd');
8 | const path = require('path')
9 | module.exports = app => ({
10 | /**
11 | * 解析psd
12 | * @returns {Promise}
13 | */
14 | async psdPpload() {
15 | const { ctx, $config, $helper } = app;
16 | let file = ctx.request.files.file;
17 | let psdModel = ctx.request.body.psdModel //上传模式
18 | let psd = await PSD.open(file.path)
19 | let timeStr = +new Date();
20 | let descendantsList = psd.tree().descendants();
21 | descendantsList.reverse();
22 | let psdSourceList = []
23 | let currentPathDir = `/resource/upload_psd/${timeStr}`
24 | // 判断文件夹是否存在不存在则新建一个
25 | await $helper.dirExists(path.join(__dirname, '../public' + currentPathDir));
26 | // 遍历图层
27 | for (var i = 0; i < descendantsList.length; i++) {
28 | if (descendantsList[i].isGroup()) continue;
29 | if (!descendantsList[i].visible) continue;
30 | // 如果是文本,先处理文本,否则存为图片
31 | if (psdModel != "image" && descendantsList[i].export().text) {
32 | psdSourceList.push({
33 | ...descendantsList[i].export(),
34 | type: 'text',
35 | })
36 | } else {
37 | try {
38 | await descendantsList[i].saveAsPng(path.join(__dirname, '../public' + currentPathDir + `/${i}.png`))
39 | psdSourceList.push({
40 | ...descendantsList[i].export(),
41 | type: 'picture',
42 | imageSrc: ($config.baseUrl || '') + `${currentPathDir}/${i}.png`,
43 | })
44 | } catch (e) {
45 | // 转换不出来的图层先忽略
46 | continue;
47 | }
48 | }
49 | }
50 | $helper.returnBody(true, {
51 | elements: psdSourceList,
52 | document: psd.tree().export().document
53 | })
54 | }
55 | })
--------------------------------------------------------------------------------
/client/pages/editor/components/attr-configure/attr-props-components/props-attr/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
组件属性
5 |
6 |
11 |
12 |
13 |
14 |
15 |
60 |
61 |
64 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | 
2 | 
3 | 想完成但未完善问题(争取近期完善):
4 |
5 | - [ ] 导入PSD角度问题
6 | - [ ] 导入PSD的文本字体大小不一致问题
7 | - [ ] 个别PSD导入出现错误情况
8 | - [ ] 画布大小自定义
9 | - [ ] 组件锁定
10 | - [ ] 右键菜单不同区域显示不同菜单
11 | - [ ] 剪切组件
12 | - [ ] 预览添加手机壳模型
13 | - [ ] 组件拖拽多选
14 | - [ ] 添加新人引导动画
15 | - [ ] 完善表单数据功能
16 | - [ ] 完善模板库
17 |
18 | 已有功能:
19 |
20 | - [x] 拖拉组件至画布
21 | - [x] 面板可收缩展开
22 | - [x] 点击添加组件位置为默认位置
23 | - [x] 添加导入PSD时显示进度条
24 | - [x] 保存JSON文件
25 | - [x] 上传JSON文件
26 | - [x] 根据画布截图生成预览图
27 | - [x] 自定义画布右键菜单
28 | - [x] 添加常用快捷键
29 | - [x] 清空画布
30 | - [x] 画布标尺
31 | - [x] 解决一些小问题
32 | - [x] 创建外部图片库
33 | - [x] 历史记录面板
34 | - [x] 文本组件过滤敏感词
35 | - [x] 自动保存画布内容
36 | - [x] 用户登录界面美化
37 | - [x] 用户登录增加滑动验证
38 | - [x] 制作产品官网
39 | - [x] 作品状态设置,外部不可访问
40 | - [x] 增加二维码组件
41 | - [x] 导入PSD可选择文字可编辑与全转为图片模式
42 |
43 |
44 |
45 |
46 | ## 工程目录结构
47 |
48 | ```
49 | |-- client --------前端项目界面代码
50 | |--common --------前端界面对应静态资源
51 | |--components --------组件
52 | |--config --------配置文件
53 | |--eventBus --------eventBus
54 | |--filter --------过滤器
55 | |--mixins --------混入
56 | |--pages --------页面
57 | |--router --------路由配置
58 | |--store --------vuex状态管理
59 | |--service --------axios封装
60 | |--App.vue --------App
61 | |--main.js --------入口文件
62 | |--permission.js --------权限控制
63 | |-- server --------服务器端项目代码
64 | |--confog --------配置文件
65 | |--controller --------数据库链接相关
66 | |--extend --------框架扩展
67 | |--model -------Schema和Model
68 | |--middleware --------中间件
69 | |--core --------Koa MVC实现自动加载核心文件
70 | |--views --------ejs页面模板
71 | |--public --------静态资源
72 | |--router.js --------路由
73 | |--app.js --------服务端入口
74 | |-- common --------前后端公用代码模块(如加解密)
75 | |-- engine-template --------页面模板引擎,使用webpack打包成js提供页面引用
76 | |-- docs --------预留编写项目文档目录
77 | |-- config.json --------配置文件
78 | ```
--------------------------------------------------------------------------------
/client/components/page-header.vue:
--------------------------------------------------------------------------------
1 |
2 |
17 |
18 |
19 |
42 |
43 |
84 |
--------------------------------------------------------------------------------
/service/controller/user.js:
--------------------------------------------------------------------------------
1 | module.exports = app => ({
2 | /**
3 | * 获取个人信息
4 | * @returns {Promise}
5 | */
6 | async getUserInfo() {
7 | const { ctx, $helper } = app;
8 | $helper.returnBody(true, ctx.userData)
9 | },
10 | /**
11 | * 更新个人昵称
12 | * @returns {Promise}
13 | */
14 | async updateUserName() {
15 | const { ctx, $service, $helper } = app;
16 | const { name } = ctx.request.body
17 | const user = await $service.user.updateUserName(name);
18 | $helper.returnBody(true, user)
19 | },
20 |
21 | /**
22 | * 更新用户密码
23 | * @returns {Promise}
24 | */
25 | async updateUserPass() {
26 | const { ctx, $service, $helper } = app;
27 | const userData = ctx.userData;
28 | const { oldPass, newPass } = ctx.request.body;
29 | // 校验老密码是否正确
30 | const userCurrentPass = await $service.user.getUsersPasswordByUsername(userData.username);
31 | const verifyPass = await $helper.checkPassword(oldPass, userCurrentPass.password)
32 | if (!verifyPass) {
33 | $helper.returnBody(false, '', "原密码错误,请输入正确原密码!");
34 | return;
35 | }
36 | const pass = await $helper.createPassword(newPass)
37 | const user = await $service.user.updateUserPass(pass);
38 | $helper.returnBody(true, user)
39 | },
40 |
41 | /**
42 | * 更新个人头像
43 | * @returns {Promise}
44 | */
45 | async updateUserAvatar() {
46 | const { ctx, $service, $helper } = app;
47 | let userData = ctx.userData;
48 | let file = ctx.request.files.file;
49 | let fileResult = await $service.file.upload(file, 'avatar/' + userData.username);
50 | const user = await $service.user.updateUserAvatar(fileResult.url);
51 | $helper.returnBody(true, user)
52 | },
53 | /**
54 | * 模糊查询用户
55 | * @returns {Promise}
56 | */
57 | async getUserList() {
58 | const { ctx, $service, $helper } = app;
59 | const { keywords } = ctx.request.query;
60 | const users = await $service.user.getUserByKeyWords(keywords);
61 | $helper.returnBody(true, users)
62 | }
63 |
64 | })
--------------------------------------------------------------------------------
/client/mixins/elementEvents.js:
--------------------------------------------------------------------------------
1 | import { register_components_object } from '@client/plugins/index'
2 | import { camelCase } from 'lodash'
3 | /**
4 | * 元素点击事件相关方法
5 | * */
6 | export default {
7 | methods: {
8 | /**
9 | * 链接跳转
10 | */
11 | _event_link(eventData) {
12 | return new Promise((resolve) => {
13 | if (eventData.url) {
14 | window.location.href = eventData.url;
15 | }
16 | resolve()
17 | })
18 | },
19 | /**
20 | * 分享
21 | * @private
22 | */
23 | _event_share() {
24 | return new Promise((resolve) => {
25 | window.alert('分享')
26 | resolve()
27 | })
28 | },
29 | /**
30 | * 表单提交
31 | * @private
32 | */
33 | _event_submitForm() {
34 | // return new Promise((resolve) => {
35 | // window.alert('表单提交,待完善...')
36 | //获歇提交接口
37 | var apiUrl = eventData.url; //获歇页面表单数据
38 | var formdata = {};
39 | page.pages.forEach(function(data) {
40 | data.elements.forEach(function(item) {
41 | if (!item.isForm) return;
42 | var key = item.propsValue.keyName || '';
43 | formdata[key] = item.value;
44 | });
45 | });
46 | console.log(apiUrl);
47 | console.log(formdata);
48 |
49 | // resolve()
50 | // })
51 | },
52 |
53 | /**
54 | * 根据elname获取组件默认props数据
55 | * @param elName
56 | */
57 | getComponentProps(elName) {
58 | let elComponentData
59 | for (let key in register_components_object) {
60 | if (key.toLowerCase() === camelCase(elName).toLowerCase()) {
61 | elComponentData = register_components_object[key];
62 | break;
63 | }
64 | }
65 | if (!elComponentData) return {}
66 |
67 | let props = {}
68 | for (let key in elComponentData.props) {
69 | props[key] = [Object, Array].includes(elComponentData.props[key].type) ? elComponentData.props[key].default() : elComponentData.props[key].default
70 | }
71 | return props;
72 | },
73 |
74 |
75 | }
76 | }
--------------------------------------------------------------------------------
/client/components/upload-psd.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 | 将文件拖到此处,或点击上传
12 | 只能上传PSD文件,且不超过40MB
13 |
14 |
15 |
16 | 文字可编辑模式
17 | 图层全转为图片模式
18 |
19 |
20 |
21 |
22 |
64 |
65 |
70 |
--------------------------------------------------------------------------------
/client/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 |
4 | Vue.use(Router)
5 |
6 | /** 各个模块 */
7 | export default new Router({
8 | // mode: 'history',
9 | routes: [{
10 | path: '/',
11 | name: 'Layout',
12 | component: () =>
13 | import ('@/pages/layout'),
14 | redirect: { name: 'Index' },
15 | children: [{
16 | path: 'home',
17 | name: 'Home',
18 | component: () =>
19 | import ('@/pages/home/index'),
20 | redirect: { name: 'pageList' },
21 | children: [{
22 | path: 'page-list',
23 | name: 'pageList',
24 | component: () =>
25 | import ('@/pages/home/page-list'),
26 | }, {
27 | path: 'my-template',
28 | name: 'myTemplate',
29 | component: () =>
30 | import ('@/pages/home/my-template'),
31 | }, {
32 | path: 'page-data',
33 | name: 'pageData',
34 | component: () =>
35 | import ('@/pages/home/page-data'),
36 | }, {
37 | path: 'page-data-detail',
38 | name: 'pageDataDetail',
39 | component: () =>
40 | import ('@/pages/home/page-data-detail'),
41 | }, {
42 | path: 'template-list',
43 | name: 'templateList',
44 | component: () =>
45 | import ('@/pages/home/template-list'),
46 | }]
47 | }, {
48 | path: '/editor',
49 | name: 'Editor',
50 | component: () =>
51 | import ('@/pages/editor/Index')
52 | }, ],
53 | },
54 | {
55 | path: '/login',
56 | name: 'Login',
57 | component: () =>
58 | import ('@/pages/Login'),
59 | meta: {
60 | hideHeader: true,
61 | trust: true,
62 | noNeedLogin: true
63 | }
64 | }, { //官网
65 | path: '/index',
66 | name: 'Index',
67 | component: () =>
68 | import ('@/pages/website/index'),
69 | meta: {
70 | hideHeader: true,
71 | trust: true,
72 | noNeedLogin: true
73 | }
74 | }
75 |
76 | ]
77 | })
--------------------------------------------------------------------------------
/service/core/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 封装koa mvc基础架构初始化工作
3 | */
4 | const path = require('path')
5 | const Koa = require('koa');
6 | const { initConfig, initController, initService, initModel, initRouter, initMiddleware, initExtend, initSchedule } = require('./loader');
7 | class Application {
8 | constructor() {
9 | this.$app = new Koa();
10 | // 注册默认内置中间件
11 | this.initDefaultMiddleware();
12 |
13 | // 初始化config
14 | this.$config = initConfig(this);
15 | // 初始化controller
16 | this.$controller = initController(this);
17 | // 初始化service
18 | this.$service = initService(this);
19 | // 初始化middleware
20 | this.$middleware = initMiddleware(this);
21 | // 初始化model
22 | this.$model = initModel(this)
23 | // 初始化router
24 | this.$router = initRouter(this);
25 | // 初始化扩展
26 | initExtend(this);
27 | // 初始化定时任务schedule
28 | initSchedule(this)
29 |
30 | // 将ctx注入到app上
31 | this.$app.use(async(ctx, next) => {
32 | this.ctx = ctx;
33 | await next()
34 | })
35 | this.$app.use(this.$router.routes());
36 | }
37 |
38 | // 设置内置中间件
39 | initDefaultMiddleware() {
40 | const koaStatic = require('koa-static');
41 | const koaBody = require('koa-body');
42 | const cors = require('koa2-cors');
43 | const views = require('koa-views');
44 |
45 | // 配置静态web
46 | this.$app.use(koaStatic(path.resolve(__dirname, '../public')), {
47 | gzip: true,
48 | setHeaders: function(res) {
49 | res.header('Access-Control-Allow-Origin', '*')
50 | }
51 | });
52 | //跨域处理
53 | this.$app.use(cors());
54 | // body接口数据处理
55 | this.$app.use(koaBody({
56 | multipart: true,
57 | formidable: {
58 | maxFileSize: 3000 * 1024 * 1024 // 设置上传文件大小最大限制,默认30M
59 | }
60 | }));
61 | //配置需要渲染的文件路径及文件后缀
62 | this.$app.use(views(path.join(__dirname, '../views'), {
63 | extension: 'ejs'
64 | }))
65 | }
66 |
67 | // 启动服务
68 | start(port) {
69 | this.$app.listen(port, () => {
70 | console.log('API服务已启动...http://localhost:' + port);
71 | });
72 | }
73 | }
74 |
75 | module.exports = Application;
--------------------------------------------------------------------------------
/client/components/SketchRuleBg.vue:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
15 |
77 |
78 |
--------------------------------------------------------------------------------
/client/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import router from './router'
4 | import store from './store'
5 | import httpServer from '@client/service/httpServer' // axios拦截器配置
6 | import '@/permission' // 权限控制
7 | import * as mUtils from '@/common/js/mUtils' //工具类
8 | import config from '@/config'
9 | import filters from './filters/index' //过滤器
10 | import AES from '@/common/js/secret'
11 | import * as API from '@/api/index'
12 |
13 | import Element from 'element-ui'
14 | import '@/common/styles/element-variables.scss'
15 | import '@/common/styles/index.scss' // 自定义 css
16 | import 'animate.css' //动画 css
17 | import VueClipboard from 'vue-clipboard2' //获取剪切板
18 | import hotKey from '@client/libs/keypress/keypress' //快捷键
19 | import Contextmenu from "vue-contextmenujs"
20 |
21 | // 视频组件,todo:后期改为局部注册
22 | import vueMiniPlayer from 'vue-mini-player'
23 | import 'vue-mini-player/lib/vue-mini-player.css'
24 |
25 | import VCharts from 'v-charts'
26 | Vue.use(VCharts)
27 |
28 |
29 | Vue.use(Element);
30 | Vue.use(VueClipboard)
31 | Vue.use(hotKey)
32 | Vue.use(Contextmenu);
33 | Vue.use(vueMiniPlayer);
34 |
35 | /**
36 | * 引入公共方法mUtils
37 | */
38 | Vue.prototype.$mUtils = mUtils;
39 | Vue.prototype.AES = AES
40 | Vue.prototype.$axios = httpServer;
41 | Vue.prototype.$api = API;
42 | Vue.prototype.$API = API;
43 |
44 | /**
45 | * 公共配置信息
46 | */
47 | Vue.prototype.$config = config
48 |
49 | // 注册全局过滤器
50 | Object.keys(filters).forEach(key => {
51 | Vue.filter(key, filters[key])
52 | })
53 |
54 |
55 | // 登录后跳转回之前停留页面
56 | Vue.prototype.goBeforeLoginUrl = () => {
57 | let url = mUtils.Cookie.get('beforeLoginUrl')
58 | url = decodeURIComponent(url)
59 | if (!url || url.indexOf('/author') != -1) {
60 | router.push('/login')
61 | } else {
62 | router.push(url)
63 | mUtils.Cookie.set('beforeLoginUrl', '', 1 / 24 / 60, window.location.host, window.location.pathname.substring(0, window.location.pathname.length - 1))
64 | }
65 | };
66 |
67 | // 查询多个,全局替换
68 | String.prototype.replaceAll = function(s1, s2) {
69 | return this.replace(new RegExp(s1, "gm"), s2);
70 | }
71 |
72 | Vue.config.productionTip = false
73 |
74 | store.commit('UPDATE_USER_FROM_LOCAL')
75 |
76 | new Vue({
77 | router,
78 | store,
79 | render: h => h(App)
80 | }).$mount('#app')
--------------------------------------------------------------------------------
/public/static/js/chunk-39d883ed.8cccd16a.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-39d883ed"],{"566d":function(e,a,t){"use strict";t.r(a);var s=function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"clearfix my-page-list"},[t("div",{staticClass:"page-search-wrapper bg-white"},[t("el-tabs",{on:{"tab-click":e.handlePageModeClick},model:{value:e.searchParams.pageMode,callback:function(a){e.$set(e.searchParams,"pageMode",a)},expression:"searchParams.pageMode"}},e._l(e.pageModeList,(function(a,s){return t("el-tab-pane",{key:s,attrs:{name:a.value,disabled:a.disabled}},[t("div",{attrs:{slot:"label"},slot:"label"},[t("span",{staticClass:"nav-tabs-label"},[e._v(e._s(a.label))])])])})),1)],1),t("div",{staticClass:"scroll-wrapper page-list-wrapper"},[e.pageList.length?t("el-scrollbar",{staticStyle:{height:"100%"}},[t("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticClass:"page-content"},[t("div",{staticClass:"page-item-wrapper"},e._l(e.pageList,(function(a,s){return t("div",{key:s,staticClass:"page-item"},[t("thumbnailPanel",{attrs:{pageData:a,btnList:["useTemplate"],showMoreBtn:!1,showPublishState:!1},on:{refresh:e.getPageList,showPreview:e.showPreviewFn}})],1)})),0)])]):t("notFundData")],1),e.showPreview?t("previewPage",{attrs:{pageId:e.previewId},on:{closePreview:function(a){e.showPreview=!1}}}):e._e()],1)},i=[],n=(t("a450"),t("c5c7")),r=t("2f88"),o=t("bf8b"),l={components:{notFundData:n["a"],thumbnailPanel:r["a"],previewPage:o["a"]},data:function(){return{loading:!1,pageList:[],pageModeList:[],searchParams:{pageMode:"h5"},previewId:"",showPreview:!1}},created:function(){this.pageModeList=this.$config.pageModeList,this.getPageList()},methods:{handlePageModeClick:function(e){this.searchParams.pageMode=e.name,this.getPageList()},getPageList:function(){var e=this;this.$API.getPublishTemplates(this.searchParams).then((function(a){e.pageList=a.body||[]}))},showPreviewFn:function(e){this.previewId=e,this.showPreview=!0}}},c=l,d=(t("c8ea"),t("8bc8"),t("4ac2")),p=Object(d["a"])(c,s,i,!1,null,"26f12d29",null);a["default"]=p.exports},"8bc8":function(e,a,t){"use strict";t("d85e")},"9ddc":function(e,a,t){},c8ea:function(e,a,t){"use strict";t("9ddc")},d85e:function(e,a,t){}}]);
2 | //# sourceMappingURL=chunk-39d883ed.8cccd16a.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-39d883ed.4e3c9d4d.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-39d883ed"],{"566d":function(e,a,t){"use strict";t.r(a);var s=function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"clearfix my-page-list"},[t("div",{staticClass:"page-search-wrapper bg-white"},[t("el-tabs",{on:{"tab-click":e.handlePageModeClick},model:{value:e.searchParams.pageMode,callback:function(a){e.$set(e.searchParams,"pageMode",a)},expression:"searchParams.pageMode"}},e._l(e.pageModeList,(function(a,s){return t("el-tab-pane",{key:s,attrs:{name:a.value,disabled:a.disabled}},[t("div",{attrs:{slot:"label"},slot:"label"},[t("span",{staticClass:"nav-tabs-label"},[e._v(e._s(a.label))])])])})),1)],1),t("div",{staticClass:"scroll-wrapper page-list-wrapper"},[e.pageList.length?t("el-scrollbar",{staticStyle:{height:"100%"}},[t("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticClass:"page-content"},[t("div",{staticClass:"page-item-wrapper"},e._l(e.pageList,(function(a,s){return t("div",{key:s,staticClass:"page-item"},[t("thumbnailPanel",{attrs:{pageData:a,btnList:["useTemplate"],showMoreBtn:!1,showPublishState:!1},on:{refresh:e.getPageList,showPreview:e.showPreviewFn}})],1)})),0)])]):t("notFundData")],1),e.showPreview?t("previewPage",{attrs:{pageId:e.previewId},on:{closePreview:function(a){e.showPreview=!1}}}):e._e()],1)},i=[],n=(t("a450"),t("c5c7")),r=t("2f88"),o=t("bf8b"),l={components:{notFundData:n["a"],thumbnailPanel:r["a"],previewPage:o["a"]},data:function(){return{loading:!1,pageList:[],pageModeList:[],searchParams:{pageMode:"h5"},previewId:"",showPreview:!1}},created:function(){this.pageModeList=this.$config.pageModeList,this.getPageList()},methods:{handlePageModeClick:function(e){this.searchParams.pageMode=e.name,this.getPageList()},getPageList:function(){var e=this;this.$API.getPublishTemplates(this.searchParams).then((function(a){e.pageList=a.body||[]}))},showPreviewFn:function(e){this.previewId=e,this.showPreview=!0}}},c=l,d=(t("c8ea"),t("8bc8"),t("4ac2")),p=Object(d["a"])(c,s,i,!1,null,"26f12d29",null);a["default"]=p.exports},"8bc8":function(e,a,t){"use strict";t("d85e")},"9ddc":function(e,a,t){},c8ea:function(e,a,t){"use strict";t("9ddc")},d85e:function(e,a,t){}}]);
2 | //# sourceMappingURL=chunk-39d883ed.4e3c9d4d.js.map
--------------------------------------------------------------------------------
/service/public/static/js/chunk-39d883ed.8cccd16a.js:
--------------------------------------------------------------------------------
1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-39d883ed"],{"566d":function(e,a,t){"use strict";t.r(a);var s=function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"clearfix my-page-list"},[t("div",{staticClass:"page-search-wrapper bg-white"},[t("el-tabs",{on:{"tab-click":e.handlePageModeClick},model:{value:e.searchParams.pageMode,callback:function(a){e.$set(e.searchParams,"pageMode",a)},expression:"searchParams.pageMode"}},e._l(e.pageModeList,(function(a,s){return t("el-tab-pane",{key:s,attrs:{name:a.value,disabled:a.disabled}},[t("div",{attrs:{slot:"label"},slot:"label"},[t("span",{staticClass:"nav-tabs-label"},[e._v(e._s(a.label))])])])})),1)],1),t("div",{staticClass:"scroll-wrapper page-list-wrapper"},[e.pageList.length?t("el-scrollbar",{staticStyle:{height:"100%"}},[t("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticClass:"page-content"},[t("div",{staticClass:"page-item-wrapper"},e._l(e.pageList,(function(a,s){return t("div",{key:s,staticClass:"page-item"},[t("thumbnailPanel",{attrs:{pageData:a,btnList:["useTemplate"],showMoreBtn:!1,showPublishState:!1},on:{refresh:e.getPageList,showPreview:e.showPreviewFn}})],1)})),0)])]):t("notFundData")],1),e.showPreview?t("previewPage",{attrs:{pageId:e.previewId},on:{closePreview:function(a){e.showPreview=!1}}}):e._e()],1)},i=[],n=(t("a450"),t("c5c7")),r=t("2f88"),o=t("bf8b"),l={components:{notFundData:n["a"],thumbnailPanel:r["a"],previewPage:o["a"]},data:function(){return{loading:!1,pageList:[],pageModeList:[],searchParams:{pageMode:"h5"},previewId:"",showPreview:!1}},created:function(){this.pageModeList=this.$config.pageModeList,this.getPageList()},methods:{handlePageModeClick:function(e){this.searchParams.pageMode=e.name,this.getPageList()},getPageList:function(){var e=this;this.$API.getPublishTemplates(this.searchParams).then((function(a){e.pageList=a.body||[]}))},showPreviewFn:function(e){this.previewId=e,this.showPreview=!0}}},c=l,d=(t("c8ea"),t("8bc8"),t("4ac2")),p=Object(d["a"])(c,s,i,!1,null,"26f12d29",null);a["default"]=p.exports},"8bc8":function(e,a,t){"use strict";t("d85e")},"9ddc":function(e,a,t){},c8ea:function(e,a,t){"use strict";t("9ddc")},d85e:function(e,a,t){}}]);
2 | //# sourceMappingURL=chunk-39d883ed.8cccd16a.js.map
--------------------------------------------------------------------------------
/service/controller/auth.js:
--------------------------------------------------------------------------------
1 | module.exports = app => ({
2 | /**
3 | * 登录
4 | * @returns {Promise}
5 | */
6 | async login() {
7 | const { ctx, $service, $helper } = app;
8 | const { username, password } = ctx.request.body
9 | // 验证是否存在
10 | let user = await $service.user.getUsersByUsername(username);
11 | if (!user) {
12 | $helper.returnBody(false, {}, "用户不存在!");
13 | return;
14 | }
15 | // 校验密码
16 | const userCurrentPass = await $service.user.getUsersPasswordByUsername(username);
17 | const verifyPass = await $helper.checkPassword(password, userCurrentPass.password)
18 | if (!verifyPass) {
19 | $helper.returnBody(false, '', "密码错误,请重试!");
20 | return;
21 | }
22 |
23 | user = user.toObject();
24 | let userDataStr = JSON.parse(JSON.stringify(user));
25 | // 生成token
26 | let token = await $helper.createToken(userDataStr);
27 | $helper.returnBody(true, { access_token: token, userInfo: user }, "登录成功!")
28 | },
29 |
30 | /**
31 | * 注册
32 | * @returns {Promise}
33 | */
34 | async register() {
35 | const { ctx, $service, $helper } = app;
36 | const { username, password, email } = ctx.request.body
37 |
38 | // 密码长度拦截
39 | if (!password) {
40 | $helper.returnBody(false, {}, "密码不能为空!")
41 | return;
42 | } else if (password.length < 6) {
43 | $helper.returnBody(false, {}, "密码长度不能少于6位!")
44 | return;
45 | } else if (password.length > 16) {
46 | $helper.returnBody(false, {}, "密码长度不能超过16位!")
47 | return;
48 | }
49 |
50 | // 验证是否已注册
51 | const users = await $service.user.getUsersByQuery({
52 | $or: [
53 | { username },
54 | { email },
55 | ]
56 | });
57 |
58 | if (users.length > 0) {
59 | $helper.returnBody(false, {}, "用户名或邮箱已被注册!")
60 | return;
61 | }
62 |
63 | let pass = await $helper.createPassword(password.toString())
64 | let userData = await $service.user.createUser(username, pass, email);
65 | userData = userData.toObject();
66 | let userDataStr = JSON.parse(JSON.stringify(userData));
67 | // 生成token
68 | let token = await $helper.createToken(userDataStr);
69 | $helper.returnBody(true, { access_token: token, userInfo: userData }, "注册成功!")
70 | }
71 | })
--------------------------------------------------------------------------------
/client/components/preview-wrapper.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
39 |
40 |
99 |
--------------------------------------------------------------------------------