├── .gitignore
├── .vscode
├── ftp-sync.json
└── settings.json
├── AFront
├── .babelrc
├── .editorconfig
├── .gitignore
├── .postcssrc.js
├── README.md
├── XBlog.jpg
├── build
│ ├── build.js
│ ├── check-versions.js
│ ├── logo.png
│ ├── utils.js
│ ├── vue-loader.conf.js
│ ├── webpack.base.conf.js
│ ├── webpack.dev.conf.js
│ └── webpack.prod.conf.js
├── config
│ ├── dev.env.js
│ ├── index.js
│ └── prod.env.js
├── index.html
├── package-lock.json
├── package.json
├── src
│ ├── App.vue
│ ├── api
│ │ ├── api_article.js
│ │ ├── api_auth.js
│ │ ├── api_comment.js
│ │ ├── api_doError.js
│ │ ├── api_myinfo.js
│ │ ├── api_statistic.js
│ │ ├── api_tag.js
│ │ └── api_upload.js
│ ├── assets
│ │ ├── blog.jpg
│ │ ├── blog.webp
│ │ ├── body_placeholder.png
│ │ ├── employee.svg
│ │ ├── favicon.ico
│ │ ├── favicon.png
│ │ ├── node.png
│ │ ├── node.svg
│ │ └── wechat.png
│ ├── components
│ │ ├── commentReplyBox.vue
│ │ ├── copyright.vue
│ │ ├── doLogout.vue
│ │ ├── loading.vue
│ │ ├── nodata.vue
│ │ └── socialInfo.vue
│ ├── config.js
│ ├── main.js
│ ├── plugin
│ │ ├── bootstrap-datetimepicker
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .jscs.json
│ │ │ ├── .npmignore
│ │ │ ├── .travis.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── Gruntfile.js
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bower.json
│ │ │ ├── build
│ │ │ │ ├── css
│ │ │ │ │ ├── bootstrap-datetimepicker-standalone.css
│ │ │ │ │ ├── bootstrap-datetimepicker.css
│ │ │ │ │ └── bootstrap-datetimepicker.min.css
│ │ │ │ └── js
│ │ │ │ │ └── bootstrap-datetimepicker.min.js
│ │ │ ├── component.json
│ │ │ ├── composer.json
│ │ │ ├── docs
│ │ │ │ ├── ChangeLog.md
│ │ │ │ ├── ContributorsGuide.md
│ │ │ │ ├── Events.md
│ │ │ │ ├── Extras.md
│ │ │ │ ├── FAQ.md
│ │ │ │ ├── Functions.md
│ │ │ │ ├── Installing.md
│ │ │ │ ├── Options.md
│ │ │ │ ├── Version 4 Changelog.md
│ │ │ │ ├── Version 4 Contributors guide.md
│ │ │ │ └── index.md
│ │ │ ├── mkdocs.yml
│ │ │ ├── package.json
│ │ │ ├── src
│ │ │ │ ├── js
│ │ │ │ │ └── bootstrap-datetimepicker.js
│ │ │ │ ├── less
│ │ │ │ │ ├── _bootstrap-datetimepicker.less
│ │ │ │ │ └── bootstrap-datetimepicker-build.less
│ │ │ │ ├── nuget
│ │ │ │ │ ├── Bootstrap.v3.Datetimepicker.CSS.nuspec
│ │ │ │ │ ├── Bootstrap.v3.Datetimepicker.nuspec
│ │ │ │ │ ├── NuGet.exe
│ │ │ │ │ └── install.ps1
│ │ │ │ └── sass
│ │ │ │ │ ├── _bootstrap-datetimepicker.scss
│ │ │ │ │ └── bootstrap-datetimepicker-build.scss
│ │ │ ├── tasks
│ │ │ │ └── bump_version.js
│ │ │ └── test
│ │ │ │ ├── publicApiSpec.js
│ │ │ │ └── screen-capture
│ │ │ │ ├── base.html
│ │ │ │ ├── compile.js
│ │ │ │ ├── index.js
│ │ │ │ ├── out
│ │ │ │ └── .gitignore
│ │ │ │ ├── pic
│ │ │ │ └── .gitignore
│ │ │ │ ├── t1.html
│ │ │ │ ├── t2.html
│ │ │ │ ├── t3.html
│ │ │ │ ├── t4.html
│ │ │ │ └── t5.html
│ │ ├── bootstrap
│ │ │ ├── js
│ │ │ │ ├── affix.js
│ │ │ │ ├── alert.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── transition.js
│ │ │ └── scss
│ │ │ │ ├── bootstrap.slim.scss
│ │ │ │ └── bootstrap
│ │ │ │ ├── _alerts.scss
│ │ │ │ ├── _badges.scss
│ │ │ │ ├── _breadcrumbs.scss
│ │ │ │ ├── _button-groups.scss
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _carousel.scss
│ │ │ │ ├── _close.scss
│ │ │ │ ├── _code.scss
│ │ │ │ ├── _component-animations.scss
│ │ │ │ ├── _dropdowns.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _glyphicons.scss
│ │ │ │ ├── _grid.scss
│ │ │ │ ├── _input-groups.scss
│ │ │ │ ├── _jumbotron.scss
│ │ │ │ ├── _labels.scss
│ │ │ │ ├── _list-group.scss
│ │ │ │ ├── _media.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _modals.scss
│ │ │ │ ├── _navbar.scss
│ │ │ │ ├── _navs.scss
│ │ │ │ ├── _normalize.scss
│ │ │ │ ├── _pager.scss
│ │ │ │ ├── _pagination.scss
│ │ │ │ ├── _panels.scss
│ │ │ │ ├── _popovers.scss
│ │ │ │ ├── _print.scss
│ │ │ │ ├── _progress-bars.scss
│ │ │ │ ├── _responsive-embed.scss
│ │ │ │ ├── _responsive-utilities.scss
│ │ │ │ ├── _scaffolding.scss
│ │ │ │ ├── _tables.scss
│ │ │ │ ├── _theme.scss
│ │ │ │ ├── _thumbnails.scss
│ │ │ │ ├── _tooltip.scss
│ │ │ │ ├── _type.scss
│ │ │ │ ├── _utilities.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ ├── _wells.scss
│ │ │ │ └── mixins
│ │ │ │ ├── _alerts.scss
│ │ │ │ ├── _background-variant.scss
│ │ │ │ ├── _border-radius.scss
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _center-block.scss
│ │ │ │ ├── _clearfix.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _gradients.scss
│ │ │ │ ├── _grid-framework.scss
│ │ │ │ ├── _grid.scss
│ │ │ │ ├── _hide-text.scss
│ │ │ │ ├── _image.scss
│ │ │ │ ├── _labels.scss
│ │ │ │ ├── _list-group.scss
│ │ │ │ ├── _nav-divider.scss
│ │ │ │ ├── _nav-vertical-align.scss
│ │ │ │ ├── _opacity.scss
│ │ │ │ ├── _pagination.scss
│ │ │ │ ├── _panels.scss
│ │ │ │ ├── _progress-bar.scss
│ │ │ │ ├── _reset-filter.scss
│ │ │ │ ├── _reset-text.scss
│ │ │ │ ├── _resize.scss
│ │ │ │ ├── _responsive-visibility.scss
│ │ │ │ ├── _size.scss
│ │ │ │ ├── _tab-focus.scss
│ │ │ │ ├── _table-row.scss
│ │ │ │ ├── _text-emphasis.scss
│ │ │ │ ├── _text-overflow.scss
│ │ │ │ └── _vendor-prefixes.scss
│ │ ├── dropzone.js
│ │ ├── echarts
│ │ │ ├── china.js
│ │ │ └── dark.js
│ │ ├── exif.js
│ │ ├── fastclick.js
│ │ ├── highlight.pack.js
│ │ ├── imageOrientationFix.js
│ │ ├── mint-ui
│ │ │ ├── .npminstall.done
│ │ │ ├── CHANGELOG.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── lib
│ │ │ │ ├── actionsheet
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── badge
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── button
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── cell-swipe
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── cell
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── checklist
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── datetime-picker
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── field
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── font
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── header
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── index-list
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── index-section
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── index.js
│ │ │ │ ├── indicator
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── infinite-scroll
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── lazyload
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── loadmore
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── message-box
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── mint-ui.common.js
│ │ │ │ ├── navbar
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── palette-button
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── picker
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── popup
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── progress
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── radio
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── range
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── search
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── spinner
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── style.css
│ │ │ │ ├── style.min.css
│ │ │ │ ├── swipe-item
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── swipe
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── switch
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── tab-container-item
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── tab-container
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── tab-item
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ ├── tabbar
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ │ └── toast
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── style.css
│ │ │ ├── package.json
│ │ │ ├── packages
│ │ │ │ ├── README.md
│ │ │ │ ├── actionsheet
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── actionsheet.vue
│ │ │ │ ├── badge
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── badge.vue
│ │ │ │ ├── button
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── button.vue
│ │ │ │ ├── cell-swipe
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── cell-swipe.vue
│ │ │ │ ├── cell
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── cell.vue
│ │ │ │ ├── checklist
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── checklist.vue
│ │ │ │ ├── datetime-picker
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── datetime-picker.vue
│ │ │ │ ├── field
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── field.vue
│ │ │ │ ├── header
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── src
│ │ │ │ │ │ └── header.vue
│ │ │ │ ├── index-list
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── index-list.vue
│ │ │ │ ├── index-section
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── index-section.vue
│ │ │ │ ├── indicator
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── indicator.vue
│ │ │ │ ├── infinite-scroll
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── directive.js
│ │ │ │ │ │ └── infinite-scroll.js
│ │ │ │ ├── lazyload
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── src
│ │ │ │ │ │ └── lazyload.js
│ │ │ │ ├── loadmore
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── loadmore.vue
│ │ │ │ ├── message-box
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── message-box.js
│ │ │ │ │ │ └── message-box.vue
│ │ │ │ ├── navbar
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── navbar.vue
│ │ │ │ ├── palette-button
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── palette-button.vue
│ │ │ │ ├── picker
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── draggable.js
│ │ │ │ │ │ ├── picker-slot.vue
│ │ │ │ │ │ ├── picker.vue
│ │ │ │ │ │ └── translate.js
│ │ │ │ ├── popup
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── popup.vue
│ │ │ │ ├── progress
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── progress.vue
│ │ │ │ ├── radio
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── radio.vue
│ │ │ │ ├── range
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── draggable.js
│ │ │ │ │ │ └── index.vue
│ │ │ │ ├── search
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── search.vue
│ │ │ │ ├── spinner
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── package.json
│ │ │ │ ├── swipe-item
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── index.js
│ │ │ │ ├── swipe
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── swipe-item.vue
│ │ │ │ │ │ └── swipe.vue
│ │ │ │ ├── switch
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── switch.vue
│ │ │ │ ├── tab-container-item
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── src
│ │ │ │ │ │ └── tab-container-item.vue
│ │ │ │ ├── tab-container
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _index.js
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── tab-container.vue
│ │ │ │ ├── tab-item
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── tab-item.vue
│ │ │ │ ├── tabbar
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── cooking.conf.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src
│ │ │ │ │ │ └── tabbar.vue
│ │ │ │ └── toast
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── src
│ │ │ │ │ ├── toast.js
│ │ │ │ │ └── toast.vue
│ │ │ └── src
│ │ │ │ ├── assets
│ │ │ │ ├── font
│ │ │ │ │ ├── iconfont.css
│ │ │ │ │ └── iconfont.ttf
│ │ │ │ └── loading-spin.svg
│ │ │ │ ├── index.js
│ │ │ │ ├── mixins
│ │ │ │ └── emitter.js
│ │ │ │ ├── style
│ │ │ │ ├── border.css
│ │ │ │ ├── empty.css
│ │ │ │ └── var.css
│ │ │ │ └── utils
│ │ │ │ └── clickoutside.js
│ │ ├── parseUA.js
│ │ ├── vue-multiselect
│ │ │ ├── Multiselect.vue
│ │ │ ├── multiselectMixin.js
│ │ │ ├── pointerMixin.js
│ │ │ └── utils.js
│ │ └── vue-toast
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── index.html
│ │ │ ├── package.json
│ │ │ ├── src
│ │ │ ├── main.js
│ │ │ ├── manager
│ │ │ │ ├── index.js
│ │ │ │ ├── style.css
│ │ │ │ └── template.html
│ │ │ ├── polyfills.js
│ │ │ ├── toast
│ │ │ │ ├── index.js
│ │ │ │ ├── style.css
│ │ │ │ └── template.html
│ │ │ └── utils.js
│ │ │ └── webpack.config.js
│ ├── router.js
│ ├── theme
│ │ ├── _include-media.scss
│ │ ├── _mixins.scss
│ │ ├── _variables.scss
│ │ ├── cataBox.scss
│ │ ├── codeHighLight.css
│ │ ├── markdown.scss
│ │ ├── theme.scss
│ │ └── util.scss
│ ├── utils
│ │ ├── autoTextarea.js
│ │ ├── errSrc.js
│ │ ├── filters.js
│ │ ├── vStorage.js
│ │ ├── vStore.md
│ │ ├── vToast.js
│ │ ├── vToast
│ │ │ ├── main.js
│ │ │ ├── manager.vue
│ │ │ ├── polyfills.js
│ │ │ └── toast.vue
│ │ └── vue-storage-bk.js
│ ├── views
│ │ ├── admin.article.vue
│ │ ├── admin.articleList.vue
│ │ ├── admin.commentList.vue
│ │ ├── admin.dashboard.vue
│ │ ├── admin.myInfo.vue
│ │ ├── admin.tagList.vue
│ │ ├── admin.vue
│ │ ├── blog.article.vue
│ │ ├── blog.articleList.vue
│ │ ├── blog.friends.vue
│ │ ├── blog.historyList.vue
│ │ ├── blog.index.vue
│ │ ├── blog.login.vue
│ │ ├── blog.music.vue
│ │ ├── blog.myInfo.vue
│ │ ├── blog.nav.vue
│ │ ├── blog.tagList.vue
│ │ └── blog.vue
│ └── vuex
│ │ ├── actions.js
│ │ ├── getters.js
│ │ ├── mutation-types.js
│ │ └── store.js
├── static
│ └── .gitkeep
├── west_lake.jpg
└── yarn.lock
├── README.md
├── app.js
├── bin
└── www
├── cache.js
├── config
├── config.js
└── mongoose.js
├── controllers
├── article.controller.js
├── comments.controller.js
├── statistic.controller.js
├── tags.controller.js
└── users.controller.js
├── md
└── api.md
├── package-lock.json
├── package.json
├── public
├── favicon.ico
└── index.html
├── routes
├── api.routes.js
└── web.routes.js
├── utils
├── DO_ERROE_RES.js
├── base64.utils.js
├── cdn_sync.js
├── checkToken.utils.js
├── getClientIp.utils.js
└── pack.js
└── views
├── error.hbs
├── error_dev.hbs
├── index.hbs
└── layout.hbs
/.gitignore:
--------------------------------------------------------------------------------
1 | _config.yml
2 | .idea
3 | *.zip
4 | *.txt
5 | node_modules
6 | backup
7 | .DS_Store
8 | .svn
9 | uploads
10 | config_me.js
11 | .vscode
12 | public/
--------------------------------------------------------------------------------
/.vscode/ftp-sync.json:
--------------------------------------------------------------------------------
1 | {
2 | "remotePath": "/home/blog/XBlog",
3 | "host": "118.24.61.24",
4 | "username": "root",
5 | "password": "uTBGPkdkEppzhwQ6",
6 | "port": 22,
7 | "secure": false,
8 | "protocol": "sftp",
9 | "uploadOnSave": false,
10 | "passive": false,
11 | "debug": false,
12 | "privateKeyPath": null,
13 | "passphrase": null,
14 | "ignore": [
15 | "\\.vscode",
16 | "\\.git",
17 | "\\.DS_Store",
18 | "\\AFront"
19 | ],
20 | "generatedFiles": {
21 | "uploadOnSave": false,
22 | "extensionsToInclude": [],
23 | "path": ""
24 | }
25 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // 将设置放入此文件中以覆盖默认值和用户设置。
2 | {
3 | }
--------------------------------------------------------------------------------
/AFront/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-vue-jsx", "transform-runtime"]
12 | }
13 |
--------------------------------------------------------------------------------
/AFront/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/AFront/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | /dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Editor directories and files
9 | .idea
10 | .vscode
11 | *.suo
12 | *.ntvs*
13 | *.njsproj
14 | *.sln
15 |
--------------------------------------------------------------------------------
/AFront/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/AFront/README.md:
--------------------------------------------------------------------------------
1 | # XBlog
2 |
3 | > XBlog
4 |
5 | ## Build Setup
6 |
7 | ``` bash
8 | # install dependencies
9 | npm install
10 |
11 | # serve with hot reload at localhost:8080
12 | npm run dev
13 |
14 | # build for production with minification
15 | npm run build
16 |
17 | # build for production and view the bundle analyzer report
18 | npm run build --report
19 | ```
20 |
21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
22 |
--------------------------------------------------------------------------------
/AFront/XBlog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/XBlog.jpg
--------------------------------------------------------------------------------
/AFront/build/build.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | require('./check-versions')()
3 |
4 | process.env.NODE_ENV = 'production'
5 |
6 | const ora = require('ora')
7 | const rm = require('rimraf')
8 | const path = require('path')
9 | const chalk = require('chalk')
10 | const webpack = require('webpack')
11 | const config = require('../config')
12 | const webpackConfig = require('./webpack.prod.conf')
13 |
14 | const spinner = ora('building for production...')
15 | spinner.start()
16 |
17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
18 | if (err) throw err
19 | webpack(webpackConfig, (err, stats) => {
20 | spinner.stop()
21 | if (err) throw err
22 | process.stdout.write(stats.toString({
23 | colors: true,
24 | modules: false,
25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
26 | chunks: false,
27 | chunkModules: false
28 | }) + '\n\n')
29 |
30 | if (stats.hasErrors()) {
31 | console.log(chalk.red(' Build failed with errors.\n'))
32 | process.exit(1)
33 | }
34 |
35 | console.log(chalk.cyan(' Build complete.\n'))
36 | console.log(chalk.yellow(
37 | ' Tip: built files are meant to be served over an HTTP server.\n' +
38 | ' Opening index.html over file:// won\'t work.\n'
39 | ))
40 | })
41 | })
42 |
--------------------------------------------------------------------------------
/AFront/build/check-versions.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const chalk = require('chalk')
3 | const semver = require('semver')
4 | const packageConfig = require('../package.json')
5 | const shell = require('shelljs')
6 |
7 | function exec (cmd) {
8 | return require('child_process').execSync(cmd).toString().trim()
9 | }
10 |
11 | const versionRequirements = [
12 | {
13 | name: 'node',
14 | currentVersion: semver.clean(process.version),
15 | versionRequirement: packageConfig.engines.node
16 | }
17 | ]
18 |
19 | if (shell.which('npm')) {
20 | versionRequirements.push({
21 | name: 'npm',
22 | currentVersion: exec('npm --version'),
23 | versionRequirement: packageConfig.engines.npm
24 | })
25 | }
26 |
27 | module.exports = function () {
28 | const warnings = []
29 |
30 | for (let i = 0; i < versionRequirements.length; i++) {
31 | const mod = versionRequirements[i]
32 |
33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
34 | warnings.push(mod.name + ': ' +
35 | chalk.red(mod.currentVersion) + ' should be ' +
36 | chalk.green(mod.versionRequirement)
37 | )
38 | }
39 | }
40 |
41 | if (warnings.length) {
42 | console.log('')
43 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
44 | console.log()
45 |
46 | for (let i = 0; i < warnings.length; i++) {
47 | const warning = warnings[i]
48 | console.log(' ' + warning)
49 | }
50 |
51 | console.log()
52 | process.exit(1)
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/AFront/build/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/build/logo.png
--------------------------------------------------------------------------------
/AFront/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const utils = require('./utils')
3 | const config = require('../config')
4 | const isProduction = process.env.NODE_ENV === 'production'
5 | const sourceMapEnabled = isProduction
6 | ? config.build.productionSourceMap
7 | : config.dev.cssSourceMap
8 |
9 | module.exports = {
10 | loaders: utils.cssLoaders({
11 | sourceMap: sourceMapEnabled,
12 | extract: isProduction
13 | }),
14 | cssSourceMap: sourceMapEnabled,
15 | cacheBusting: config.dev.cacheBusting,
16 | transformToRequire: {
17 | video: ['src', 'poster'],
18 | source: 'src',
19 | img: 'src',
20 | image: 'xlink:href'
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/AFront/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/AFront/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/AFront/src/api/api_doError.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Description:统一的错误处理
3 | * 统一的错误处理方法: 8-数据库查找错误;9-非admin用户;10-token错误或超时((Token 2h内有效)
4 | * 其余由api自己处理: 2~5-失败;
5 | */
6 | import Vue from "vue";
7 | import store from '../vuex/store';
8 | import Toast from 'Toast';
9 |
10 | export const doError = function (code) {
11 | code = parseInt(code);
12 | switch (code) {
13 | case 8:
14 | window.$router.back();
15 | Toast({
16 | message: '数据库查找错误!', iconClass: 'fa fa-warning',
17 | position: 'center',
18 | duration: 3000
19 | });
20 | return code;
21 | break;
22 | case 9:
23 | Toast({
24 | message: '您没有操作权限!', iconClass: 'fa fa-warning',
25 | position: 'center',
26 | duration: 3000
27 | });
28 | return code;
29 | break;
30 | case 10:
31 | Toast({
32 | message: 'Token超时,请再登陆!', iconClass: 'fa fa-warning',
33 | position: 'center',
34 | duration: 3000
35 | });
36 | //清空本地数据
37 | Vue.$localStorage.$delete('authorization');
38 | Vue.$localStorage.$delete('commentInfo');
39 | //修改登录状态
40 | store.dispatch('setLoginState', false);
41 | // 跳转
42 | window.$router.replace({
43 | name:'login'
44 | });
45 | return 10;
46 | break;
47 | default:
48 | return code;
49 | break;
50 | }
51 | };
52 |
--------------------------------------------------------------------------------
/AFront/src/api/api_upload.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Description: 上传
3 | * 图片上传前打压缩+方向矫正操作,传入file后接受成功或失败promise
4 | */
5 | import API from "../config.js";
6 | import Vue from "vue";
7 |
8 | //图片上传
9 | export const ImageUpload = function (_file) {
10 | //1. 传入filer参数
11 | return new Promise(function (resolve, reject) {
12 | // 2. 文件上传
13 | let form = new FormData();
14 | form.append('uploadImg', _file);
15 |
16 | Vue.http.post(API.imgUpload, form).then(function (result) {
17 | let response = result.data;
18 | // console.log(response)
19 | if (parseInt(response.code) === 1) {
20 | resolve(response.data);
21 | } else {
22 | reject(response.code)
23 | }
24 | }, function (error) {
25 | reject(error)
26 | });
27 | })
28 | };
29 |
--------------------------------------------------------------------------------
/AFront/src/assets/blog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/blog.jpg
--------------------------------------------------------------------------------
/AFront/src/assets/blog.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/blog.webp
--------------------------------------------------------------------------------
/AFront/src/assets/body_placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/body_placeholder.png
--------------------------------------------------------------------------------
/AFront/src/assets/employee.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/AFront/src/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/favicon.ico
--------------------------------------------------------------------------------
/AFront/src/assets/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/favicon.png
--------------------------------------------------------------------------------
/AFront/src/assets/node.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/node.png
--------------------------------------------------------------------------------
/AFront/src/assets/wechat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billyhoomm/x-blog/c501c85cc4a86d9d83f3cab9fea284890acb75b5/AFront/src/assets/wechat.png
--------------------------------------------------------------------------------
/AFront/src/components/copyright.vue:
--------------------------------------------------------------------------------
1 |
2 | 2017-2018 All Rights Reserved.Designed by billyhu.鄂ICP备16001878号.
The page has moved to: 6 | this page
-------------------------------------------------------------------------------- /AFront/src/plugin/bootstrap-datetimepicker/docs/Version 4 Contributors guide.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |The page has moved to: 6 | this page
-------------------------------------------------------------------------------- /AFront/src/plugin/bootstrap-datetimepicker/mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Bootstrap 3 Datepicker 2 | theme: bootstrap 3 | extra_javascript: ['//cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment-with-locales.js','//cdn.rawgit.com/Eonasdan/bootstrap-datetimepicker/e8bddc60e73c1ec2475f827be36e1957af72e2ea/src/js/bootstrap-datetimepicker.js'] 4 | extra_css: ['//cdn.rawgit.com/Eonasdan/bootstrap-datetimepicker/e8bddc60e73c1ec2475f827be36e1957af72e2ea/build/css/bootstrap-datetimepicker.css'] 5 | repo_url: https://github.com/Eonasdan/bootstrap-datetimepicker 6 | pages: 7 | - ['index.md', 'Usage'] 8 | - ['Installing.md', 'Installing'] 9 | - ['Functions.md', 'Functions'] 10 | - ['Options.md', 'Options'] 11 | - ['Events.md', 'Events'] 12 | - ['Changelog.md', 'Change Log'] 13 | - ['ContributorsGuide.md', 'Dev Guide'] 14 | - ['Extras.md', 'Extras'] 15 | - ['FAQ.md', 'FAQs'] 16 | - ['Version 4 Changelog.md', ''] 17 | - ['Version 4 Contributors guide.md', ''] -------------------------------------------------------------------------------- /AFront/src/plugin/bootstrap-datetimepicker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": { 3 | "name": "Jonathan Peterson" 4 | }, 5 | "bugs": { 6 | "url": "https://github.com/eonasdan/bootstrap-datetimepicker/issues" 7 | }, 8 | "dependencies": { 9 | "moment": "~2.8", 10 | "moment-timezone" : "~0.4", 11 | "bootstrap": "^3.3", 12 | "jquery": ">=1.8.3 <2.2.0" 13 | }, 14 | "description": "A date/time picker component designed to work with Bootstrap 3 and Momentjs. For usage, installation and demos see Project Site on GitHub", 15 | "devDependencies": { 16 | "grunt": "latest", 17 | "grunt-contrib-jasmine": "^0.7.0", 18 | "grunt-contrib-jshint": "latest", 19 | "grunt-contrib-less": "latest", 20 | "grunt-contrib-uglify": "latest", 21 | "grunt-jscs": "latest", 22 | "grunt-string-replace": "latest", 23 | "load-grunt-tasks": "latest", 24 | "grunt-nuget": "^0.1.4" 25 | }, 26 | "homepage": "http://eonasdan.github.io/bootstrap-datetimepicker/", 27 | "keywords": [ 28 | "twitter-bootstrap", 29 | "bootstrap", 30 | "datepicker", 31 | "datetimepicker", 32 | "timepicker", 33 | "moment" 34 | ], 35 | "license": "MIT", 36 | "main": "src/js/bootstrap-datetimepicker.js", 37 | "name": "eonasdan-bootstrap-datetimepicker", 38 | "repository": { 39 | "type": "git", 40 | "url": "https://github.com/eonasdan/bootstrap-datetimepicker.git" 41 | }, 42 | "version": "4.17.37" 43 | } 44 | -------------------------------------------------------------------------------- /AFront/src/plugin/bootstrap-datetimepicker/src/less/bootstrap-datetimepicker-build.less: -------------------------------------------------------------------------------- 1 | // Import bootstrap variables including default color palette and fonts 2 | @import "bootstrap/less/variables.less"; 3 | 4 | // Import datepicker component 5 | @import "_bootstrap-datetimepicker.less"; 6 | 7 | //this is here so the compiler doesn't complain about a missing bootstrap mixin 8 | .sr-only { 9 | position: absolute; 10 | width: 1px; 11 | height: 1px; 12 | margin: -1px; 13 | padding: 0; 14 | overflow: hidden; 15 | clip: rect(0,0,0,0); 16 | border: 0; 17 | } 18 | -------------------------------------------------------------------------------- /AFront/src/plugin/bootstrap-datetimepicker/src/nuget/Bootstrap.v3.Datetimepicker.CSS.nuspec: -------------------------------------------------------------------------------- 1 | 2 |{{ index }}
4 |setOptions({})
lets to change settings of component.
43 | * position {String} position of component | default: 'left bottom' | possible '[left, right] [top, bottom]'
44 | * maxToasts {Number} max toasts number | default: 6
45 |
46 | Funcion showToast(string, {})
lets to change settings of current toast.
47 | * theme {String} style for toast | default: default | possible: info warning error success
48 | * timeLife {Number} time of life for current toast
49 | * closeBtn {Boolean} turn off|on button for close toast and disabled|enabled "timeLife"
50 |
51 | ### Example
52 |
53 | Look [here](https://github.com/AStaroverov/vue-toast/blob/master/index.html).
54 |
--------------------------------------------------------------------------------
/AFront/src/plugin/vue-toast/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-toast",
3 | "version": "2.0.3",
4 | "description": "toasts for vuejs",
5 | "main": "./dist/vue-toast.min.js",
6 | "dependencies": {},
7 | "devDependencies": {
8 | "autoprefixer": "^6.1.0",
9 | "babel-core": "^5.8.33",
10 | "babel-loader": "^5.3.3",
11 | "css-loader": "^0.22.0",
12 | "extract-text-webpack-plugin": "^0.9.1",
13 | "postcss": "^5.0.10",
14 | "postcss-hexrgba": "^0.2.0",
15 | "postcss-loader": "^0.7.0",
16 | "postcss-nested": "^1.0.0",
17 | "style-loader": "^0.13.0",
18 | "vue-html-loader": "^1.0.0",
19 | "webpack": "^1.12.3",
20 | "webpack-dev-server": "^1.12.1"
21 | },
22 | "scripts": {
23 | "build": "webpack --config webpack.config.js",
24 | "build_min": "NODE_ENV=production webpack --config webpack.config.js",
25 | "serverv": "webpack-dev-server --hot --inline"
26 | },
27 | "repository": {
28 | "type": "git",
29 | "url": "git+https://github.com/AStaroverov/vue-toast.git"
30 | },
31 | "keywords": [
32 | "vuejs",
33 | "vue",
34 | "vue-component",
35 | "component"
36 | ],
37 | "author": "AStaroverov",
38 | "license": "MIT",
39 | "bugs": {
40 | "url": "https://github.com/AStaroverov/vue-toast/issues"
41 | },
42 | "homepage": "https://github.com/AStaroverov/vue-toast#readme"
43 | }
44 |
--------------------------------------------------------------------------------
/AFront/src/plugin/vue-toast/src/main.js:
--------------------------------------------------------------------------------
1 | import './polyfills.js'
2 | import manager from './manager'
3 |
4 | export default manager
5 |
--------------------------------------------------------------------------------
/AFront/src/plugin/vue-toast/src/manager/style.css:
--------------------------------------------------------------------------------
1 | .vue-toast-manager_container {
2 | position: fixed;
3 | width: 100%;
4 |
5 | &.--top {
6 | top: 10px;
7 | }
8 | &.--bottom {
9 | bottom: 10px;
10 | }
11 | &.--left {
12 | left: 10px;
13 | }
14 | &.--right {
15 | right: 10px;
16 | }
17 | }
18 |
19 | .vue-toast-manager_toasts {
20 | position: relative;
21 | }
22 |
--------------------------------------------------------------------------------
/AFront/src/plugin/vue-toast/src/manager/template.html:
--------------------------------------------------------------------------------
1 | {{error.stack}}4 | -------------------------------------------------------------------------------- /views/index.hbs: -------------------------------------------------------------------------------- 1 |
Welcome to {{title}}
3 | -------------------------------------------------------------------------------- /views/layout.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |