├── .gradle ├── buildOutputCleanup │ ├── built.bin │ ├── cache.properties.lock │ └── cache.properties └── 4.1 │ ├── fileChanges │ └── last-build.bin │ └── fileHashes │ ├── fileHashes.bin │ └── fileHashes.lock ├── web ├── script │ ├── env.js │ ├── tmp │ │ └── war │ │ │ └── MANIFEST.MF │ ├── config.js │ ├── webpack.dev.config.js │ └── webpack.base.config.js ├── td_icon.ico ├── .travis.yml ├── src │ ├── images │ │ ├── logo.jpg │ │ ├── logo-min.jpg │ │ └── cropper-test.png │ ├── styles │ │ ├── login_bg.jpg │ │ ├── fonts │ │ │ ├── ionicons.eot │ │ │ ├── ionicons.ttf │ │ │ └── ionicons.woff │ │ ├── loading.less │ │ └── common.less │ ├── views │ │ ├── main-components │ │ │ ├── shrinkable-menu │ │ │ │ ├── styles │ │ │ │ │ └── menu.less │ │ │ │ ├── components │ │ │ │ │ ├── sidebarMenu.vue │ │ │ │ │ └── sidebarMenuShrink.vue │ │ │ │ └── shrinkable-menu.vue │ │ │ ├── breadcrumb-nav.vue │ │ │ ├── message-tip.vue │ │ │ ├── lockscreen │ │ │ │ ├── components │ │ │ │ │ ├── locking-page.vue │ │ │ │ │ └── unlock.vue │ │ │ │ └── lockscreen.vue │ │ │ └── fullscreen.vue │ │ ├── my-components │ │ │ ├── split-pane │ │ │ │ └── split-pane │ │ │ │ │ ├── index.js │ │ │ │ │ └── split-pane.less │ │ │ ├── markdown-editor │ │ │ │ ├── markdown-editor.less │ │ │ │ └── markdown-editor.vue │ │ │ ├── text-editor │ │ │ │ ├── tinymce │ │ │ │ │ ├── plugins │ │ │ │ │ │ ├── help │ │ │ │ │ │ │ ├── img │ │ │ │ │ │ │ │ └── logo.png │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── emoticons │ │ │ │ │ │ │ ├── img │ │ │ │ │ │ │ │ ├── smiley-cool.gif │ │ │ │ │ │ │ │ ├── smiley-cry.gif │ │ │ │ │ │ │ │ ├── smiley-kiss.gif │ │ │ │ │ │ │ │ ├── smiley-wink.gif │ │ │ │ │ │ │ │ ├── smiley-yell.gif │ │ │ │ │ │ │ │ ├── smiley-frown.gif │ │ │ │ │ │ │ │ ├── smiley-sealed.gif │ │ │ │ │ │ │ │ ├── smiley-smile.gif │ │ │ │ │ │ │ │ ├── smiley-innocent.gif │ │ │ │ │ │ │ │ ├── smiley-laughing.gif │ │ │ │ │ │ │ │ ├── smiley-surprised.gif │ │ │ │ │ │ │ │ ├── smiley-undecided.gif │ │ │ │ │ │ │ │ ├── smiley-embarassed.gif │ │ │ │ │ │ │ │ ├── smiley-money-mouth.gif │ │ │ │ │ │ │ │ ├── smiley-tongue-out.gif │ │ │ │ │ │ │ │ └── smiley-foot-in-mouth.gif │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── hr │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── toc │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── code │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── image │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── link │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── lists │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── media │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── paste │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── print │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── save │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── table │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── anchor │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── bbcode │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── advlist │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── charmap │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── preview │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── autolink │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── autosave │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── fullpage │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── tabfocus │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── template │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── autoresize │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── codesample │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── css │ │ │ │ │ │ │ │ └── prism.css │ │ │ │ │ │ ├── fullscreen │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── imagetools │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── importcss │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── pagebreak │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── textcolor │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── wordcount │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── colorpicker │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── contextmenu │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── nonbreaking │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── noneditable │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ ├── textpattern │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── visualchars │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── legacyoutput │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── spellchecker │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── visualblocks │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── searchreplace │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── directionality │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── plugin.min.js │ │ │ │ │ │ └── insertdatetime │ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── skins │ │ │ │ │ │ └── lightgray │ │ │ │ │ │ │ ├── img │ │ │ │ │ │ │ ├── trans.gif │ │ │ │ │ │ │ ├── anchor.gif │ │ │ │ │ │ │ ├── loader.gif │ │ │ │ │ │ │ └── object.gif │ │ │ │ │ │ │ ├── fonts │ │ │ │ │ │ │ ├── tinymce.eot │ │ │ │ │ │ │ ├── tinymce.ttf │ │ │ │ │ │ │ ├── tinymce.woff │ │ │ │ │ │ │ ├── tinymce-small.eot │ │ │ │ │ │ │ ├── tinymce-small.ttf │ │ │ │ │ │ │ ├── tinymce-mobile.woff │ │ │ │ │ │ │ └── tinymce-small.woff │ │ │ │ │ │ │ └── content.mobile.min.css │ │ │ │ │ └── themes │ │ │ │ │ │ ├── inlite │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── modern │ │ │ │ │ │ └── index.js │ │ │ │ └── text-editor.vue │ │ │ ├── area-linkage │ │ │ │ ├── area-linkage.less │ │ │ │ └── util │ │ │ │ │ └── index.js │ │ │ ├── count-to │ │ │ │ └── count-to.less │ │ │ ├── file-upload │ │ │ │ └── upload.less │ │ │ ├── draggable-list │ │ │ │ └── draggable-list.less │ │ │ └── image-editor │ │ │ │ └── image-editor.less │ │ ├── advanced-router │ │ │ ├── advanced-router.less │ │ │ ├── component │ │ │ │ ├── expandRow.vue │ │ │ │ └── shopping-info.vue │ │ │ └── mutative-router.vue │ │ ├── tables │ │ │ ├── components │ │ │ │ ├── editable-table.less │ │ │ │ ├── ExportExcel.vue │ │ │ │ ├── dragableTable.vue │ │ │ │ └── table.less │ │ │ └── data │ │ │ │ └── search.js │ │ ├── international │ │ │ └── international.less │ │ ├── access │ │ │ ├── access-test.vue │ │ │ ├── access.less │ │ │ └── access.vue │ │ ├── home │ │ │ ├── components │ │ │ │ ├── styles │ │ │ │ │ ├── infor-card.less │ │ │ │ │ └── to-do-list-item.less │ │ │ │ ├── mapDataTable.vue │ │ │ │ ├── toDoListItem.vue │ │ │ │ ├── inforCard.vue │ │ │ │ ├── dataSourcePie.vue │ │ │ │ ├── userFlow.vue │ │ │ │ ├── map.vue │ │ │ │ └── visiteVolume.vue │ │ │ ├── map-data │ │ │ │ ├── get-geography-value.js │ │ │ │ ├── get-city-value.js │ │ │ │ └── get-style-json.js │ │ │ └── home.less │ │ ├── error-page │ │ │ ├── error-page.less │ │ │ ├── 404.vue │ │ │ ├── 403.vue │ │ │ ├── 500.vue │ │ │ ├── 404.less │ │ │ ├── 500.less │ │ │ └── 403.less │ │ ├── form │ │ │ ├── work-flow │ │ │ │ └── work-flow.less │ │ │ └── article-publish │ │ │ │ ├── preview.less │ │ │ │ └── article-publish.less │ │ ├── login.less │ │ ├── own-space │ │ │ └── own-space.less │ │ └── login.vue │ ├── vendors │ │ ├── vendors.base.js │ │ └── vendors.exten.js │ ├── store │ │ ├── index.js │ │ └── modules │ │ │ └── user.js │ ├── app.vue │ ├── locale │ │ ├── index.js │ │ └── locale.js │ ├── template │ │ └── index.ejs │ ├── main.js │ └── router │ │ └── index.js ├── .eslintignore ├── .babelrc ├── .gitignore ├── .editorconfig ├── .postcssrc.js ├── build.gradle ├── .eslintrc.json ├── index.html ├── LICENSE └── package.json ├── server ├── src │ └── main │ │ ├── resources │ │ ├── i18n │ │ │ ├── messages.properties │ │ │ ├── messages_en_US.properties │ │ │ └── messages_zh_CN.properties │ │ └── application.properties │ │ └── java │ │ └── com │ │ └── marspie │ │ ├── framework │ │ ├── common │ │ │ ├── utils │ │ │ │ ├── DateUtil.java │ │ │ │ └── StringUtil.java │ │ │ ├── repository │ │ │ │ └── BaseRepository.java │ │ │ ├── controller │ │ │ │ └── BaseController.java │ │ │ ├── services │ │ │ │ └── BaseServices.java │ │ │ ├── web │ │ │ │ ├── enums │ │ │ │ │ └── ResultCode.java │ │ │ │ └── R.java │ │ │ ├── advice │ │ │ │ └── ExceptionHandlerAdvice.java │ │ │ ├── entity │ │ │ │ └── BaseEntity.java │ │ │ └── filter │ │ │ │ ├── JWTAuthenticationFilter.java │ │ │ │ └── JWTLoginFilter.java │ │ └── config │ │ │ ├── WebConfiguration.java │ │ │ └── WebSecurityConfig.java │ │ ├── modules │ │ └── sys │ │ │ ├── entity │ │ │ ├── MenuEntity.java │ │ │ ├── RoleEntity.java │ │ │ └── UserEntity.java │ │ │ ├── repository │ │ │ ├── MenuRepository.java │ │ │ ├── RoleRepository.java │ │ │ └── UserRepository.java │ │ │ ├── controller │ │ │ ├── MenuController.java │ │ │ ├── RoleController.java │ │ │ ├── UserController.java │ │ │ └── SignupController.java │ │ │ └── services │ │ │ ├── UserService.java │ │ │ └── WebAuthenticationProvider.java │ │ └── Application.java └── build.gradle ├── qrcode.jpg ├── settings.gradle ├── .gitignore ├── README.md └── LICENSE /.gradle/buildOutputCleanup/built.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/4.1/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/script/env.js: -------------------------------------------------------------------------------- 1 | export default "production"; -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties.lock: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /server/src/main/resources/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/main/resources/i18n/messages_en_US.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/src/main/resources/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/script/tmp/war/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/qrcode.jpg -------------------------------------------------------------------------------- /web/td_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/td_icon.ico -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'lazyjava4' 2 | include 'server' 3 | include 'web' 4 | 5 | -------------------------------------------------------------------------------- /web/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "6" 4 | script: 5 | - npm run test 6 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Thu Sep 21 22:12:03 CST 2017 2 | gradle.version=4.1 3 | -------------------------------------------------------------------------------- /web/src/images/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/images/logo.jpg -------------------------------------------------------------------------------- /web/src/images/logo-min.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/images/logo-min.jpg -------------------------------------------------------------------------------- /web/src/styles/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/styles/login_bg.jpg -------------------------------------------------------------------------------- /web/src/images/cropper-test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/images/cropper-test.png -------------------------------------------------------------------------------- /web/src/styles/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/styles/fonts/ionicons.eot -------------------------------------------------------------------------------- /web/src/styles/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/styles/fonts/ionicons.ttf -------------------------------------------------------------------------------- /web/src/styles/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/styles/fonts/ionicons.woff -------------------------------------------------------------------------------- /.gradle/4.1/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/.gradle/4.1/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /web/.eslintignore: -------------------------------------------------------------------------------- 1 | src/vendors 2 | src/libs/table2excel.js 3 | build 4 | router.js 5 | src/views/my-components/text-editor/tinymce -------------------------------------------------------------------------------- /web/script/config.js: -------------------------------------------------------------------------------- 1 | import Env from './env'; 2 | 3 | let config = { 4 | env: Env 5 | }; 6 | export default config; 7 | -------------------------------------------------------------------------------- /.gradle/4.1/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/.gradle/4.1/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /web/src/views/main-components/shrinkable-menu/styles/menu.less: -------------------------------------------------------------------------------- 1 | .ivu-shrinkable-menu{ 2 | height: 100%; 3 | width: 100%; 4 | } -------------------------------------------------------------------------------- /web/src/views/my-components/split-pane/split-pane/index.js: -------------------------------------------------------------------------------- 1 | import splitPane from './split-pane.vue'; 2 | 3 | export default splitPane; 4 | -------------------------------------------------------------------------------- /web/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["env"], 3 | "plugins": ["transform-runtime", "syntax-dynamic-import"], 4 | "comments": false 5 | } 6 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log 2 | node_modules 3 | .project 4 | .vscode 5 | .history 6 | .DS_Store 7 | \.settings/ 8 | build/env.js 9 | dist/ 10 | -------------------------------------------------------------------------------- /web/src/vendors/vendors.base.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import iView from 'iview'; 3 | import VueRouter from 'vue-router'; 4 | import Vuex from 'vuex'; 5 | -------------------------------------------------------------------------------- /web/src/views/advanced-router/advanced-router.less: -------------------------------------------------------------------------------- 1 | .advanced-router{ 2 | height: 240px !important; 3 | &-tip-p{ 4 | padding: 10px 0; 5 | } 6 | } -------------------------------------------------------------------------------- /web/src/views/my-components/markdown-editor/markdown-editor.less: -------------------------------------------------------------------------------- 1 | .CodeMirror, .CodeMirror-scroll { 2 | min-height: 600px !important; 3 | } 4 | .CodeMirror{ 5 | height: 400px; 6 | } -------------------------------------------------------------------------------- /web/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | charset = utf-8 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/help/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/help/img/logo.png -------------------------------------------------------------------------------- /web/src/views/tables/components/editable-table.less: -------------------------------------------------------------------------------- 1 | .show-edit-btn{ 2 | display: none; 3 | margin-left: -10px; 4 | } 5 | .ivu-table-cell:hover .show-edit-btn{ 6 | display: inline-block; 7 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /web/src/views/my-components/area-linkage/area-linkage.less: -------------------------------------------------------------------------------- 1 | .area-linkage-page{ 2 | &-row1{ 3 | height: 366px !important; 4 | } 5 | &-row2{ 6 | height: 112px !important; 7 | } 8 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-cool.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-cool.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-cry.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-cry.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-kiss.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-kiss.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-wink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-wink.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-yell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-yell.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-frown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-frown.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-sealed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-sealed.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-smile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-smile.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-innocent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-innocent.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-laughing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-laughing.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-surprised.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-surprised.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-undecided.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-undecided.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-embarassed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-embarassed.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-money-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-money-mouth.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-tongue-out.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-tongue-out.gif -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marspie/LazyJava4/HEAD/web/src/views/my-components/text-editor/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif -------------------------------------------------------------------------------- /web/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/src/views/international/international.less: -------------------------------------------------------------------------------- 1 | .switch-language{ 2 | &-row1{ 3 | height: 240px !important; 4 | } 5 | &-tip{ 6 | font-size: 12px; 7 | color: gray; 8 | margin-top: 30px; 9 | } 10 | } -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/utils/DateUtil.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.utils; 2 | 3 | /** 4 | * @author alex.yao 5 | * @version 1.0.0 6 | * @create 2018-01-09 17:14 7 | **/ 8 | public class DateUtil { 9 | } 10 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/utils/StringUtil.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.utils; 2 | 3 | /** 4 | * @author alex.yao 5 | * @version 1.0.0 6 | * @create 2018-01-09 17:14 7 | **/ 8 | public class StringUtil { 9 | } 10 | -------------------------------------------------------------------------------- /web/src/vendors/vendors.exten.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | // import echarts from 'echarts'; 3 | import Cookies from 'js-cookie'; 4 | import clipboard from 'clipboard'; 5 | import html2canvas from 'html2canvas'; 6 | import rasterizehtml from 'rasterizehtml'; 7 | -------------------------------------------------------------------------------- /web/src/styles/loading.less: -------------------------------------------------------------------------------- 1 | .demo-spin-icon-load{ 2 | animation: ani-demo-spin 1s linear infinite; 3 | } 4 | @keyframes ani-demo-spin { 5 | from { transform: rotate(0deg);} 6 | 50% { transform: rotate(180deg);} 7 | to { transform: rotate(360deg);} 8 | } -------------------------------------------------------------------------------- /web/src/views/my-components/count-to/count-to.less: -------------------------------------------------------------------------------- 1 | .countto-page-row{ 2 | height: 200px; 3 | } 4 | .count-to-con{ 5 | display: block; 6 | width: 100%; 7 | text-align: center; 8 | } 9 | .pre-code-show-con p{ 10 | height: 30px; 11 | margin: 0; 12 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/hr/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "hr" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/hr') 5 | // ES2015: 6 | // import 'tinymce/plugins/hr' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | test/unit/coverage 8 | test/e2e/reports 9 | selenium-debug.log 10 | 11 | # Editor directories and files 12 | .idea 13 | *.suo 14 | *.ntvs* 15 | *.njsproj 16 | *.sln 17 | -------------------------------------------------------------------------------- /web/src/views/access/access-test.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/toc/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "toc" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/toc') 5 | // ES2015: 6 | // import 'tinymce/plugins/toc' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/code/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "code" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/code') 5 | // ES2015: 6 | // import 'tinymce/plugins/code' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/help/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "help" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/help') 5 | // ES2015: 6 | // import 'tinymce/plugins/help' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/image/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "image" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/image') 5 | // ES2015: 6 | // import 'tinymce/plugins/image' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/link/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "link" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/link') 5 | // ES2015: 6 | // import 'tinymce/plugins/link' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/lists/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "lists" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/lists') 5 | // ES2015: 6 | // import 'tinymce/plugins/lists' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/media/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "media" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/media') 5 | // ES2015: 6 | // import 'tinymce/plugins/media' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/paste/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "paste" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/paste') 5 | // ES2015: 6 | // import 'tinymce/plugins/paste' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/print/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "print" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/print') 5 | // ES2015: 6 | // import 'tinymce/plugins/print' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/save/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "save" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/save') 5 | // ES2015: 6 | // import 'tinymce/plugins/save' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/table/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "table" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/table') 5 | // ES2015: 6 | // import 'tinymce/plugins/table' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/themes/inlite/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "inlite" theme for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/themes/inlite') 5 | // ES2015: 6 | // import 'tinymce/themes/inlite' 7 | require('./theme.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/themes/modern/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "modern" theme for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/themes/modern') 5 | // ES2015: 6 | // import 'tinymce/themes/modern' 7 | require('./theme.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/anchor/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "anchor" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/anchor') 5 | // ES2015: 6 | // import 'tinymce/plugins/anchor' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/bbcode/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "bbcode" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/bbcode') 5 | // ES2015: 6 | // import 'tinymce/plugins/bbcode' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/advlist/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "advlist" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/advlist') 5 | // ES2015: 6 | // import 'tinymce/plugins/advlist' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/charmap/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "charmap" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/charmap') 5 | // ES2015: 6 | // import 'tinymce/plugins/charmap' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/preview/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "preview" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/preview') 5 | // ES2015: 6 | // import 'tinymce/plugins/preview' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/home/components/styles/infor-card.less: -------------------------------------------------------------------------------- 1 | .infor-card-icon-con{ 2 | height: 100%; 3 | } 4 | .height-100{ 5 | height: 100%; 6 | } 7 | .infor-card-con{ 8 | height: 100px; 9 | } 10 | .infor-intro-text{ 11 | font-size:12px; 12 | font-weight:500; 13 | color:#C8C8C8; 14 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/autolink/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autolink" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autolink') 5 | // ES2015: 6 | // import 'tinymce/plugins/autolink' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/autosave/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autosave" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autosave') 5 | // ES2015: 6 | // import 'tinymce/plugins/autosave' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/fullpage/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "fullpage" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/fullpage') 5 | // ES2015: 6 | // import 'tinymce/plugins/fullpage' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/tabfocus/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "tabfocus" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/tabfocus') 5 | // ES2015: 6 | // import 'tinymce/plugins/tabfocus' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/template/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "template" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/template') 5 | // ES2015: 6 | // import 'tinymce/plugins/template' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/autoresize/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autoresize" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autoresize') 5 | // ES2015: 6 | // import 'tinymce/plugins/autoresize' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/codesample/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "codesample" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/codesample') 5 | // ES2015: 6 | // import 'tinymce/plugins/codesample' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "emoticons" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/emoticons') 5 | // ES2015: 6 | // import 'tinymce/plugins/emoticons' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/fullscreen/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "fullscreen" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/fullscreen') 5 | // ES2015: 6 | // import 'tinymce/plugins/fullscreen' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/imagetools/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "imagetools" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/imagetools') 5 | // ES2015: 6 | // import 'tinymce/plugins/imagetools' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/importcss/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "importcss" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/importcss') 5 | // ES2015: 6 | // import 'tinymce/plugins/importcss' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/pagebreak/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "pagebreak" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/pagebreak') 5 | // ES2015: 6 | // import 'tinymce/plugins/pagebreak' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/textcolor/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "textcolor" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/textcolor') 5 | // ES2015: 6 | // import 'tinymce/plugins/textcolor' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/wordcount/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "wordcount" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/wordcount') 5 | // ES2015: 6 | // import 'tinymce/plugins/wordcount' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/colorpicker/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "colorpicker" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/colorpicker') 5 | // ES2015: 6 | // import 'tinymce/plugins/colorpicker' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/contextmenu/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "contextmenu" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/contextmenu') 5 | // ES2015: 6 | // import 'tinymce/plugins/contextmenu' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/nonbreaking/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "nonbreaking" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/nonbreaking') 5 | // ES2015: 6 | // import 'tinymce/plugins/nonbreaking' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/noneditable/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "noneditable" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/noneditable') 5 | // ES2015: 6 | // import 'tinymce/plugins/noneditable' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/textpattern/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "textpattern" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/textpattern') 5 | // ES2015: 6 | // import 'tinymce/plugins/textpattern' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/visualchars/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "visualchars" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/visualchars') 5 | // ES2015: 6 | // import 'tinymce/plugins/visualchars' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/skins/lightgray/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position:absolute;display:inline-block;background-color:green;opacity:.5}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%} -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/legacyoutput/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "legacyoutput" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/legacyoutput') 5 | // ES2015: 6 | // import 'tinymce/plugins/legacyoutput' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/spellchecker/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "spellchecker" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/spellchecker') 5 | // ES2015: 6 | // import 'tinymce/plugins/spellchecker' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/visualblocks/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "visualblocks" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/visualblocks') 5 | // ES2015: 6 | // import 'tinymce/plugins/visualblocks' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/searchreplace/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "searchreplace" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/searchreplace') 5 | // ES2015: 6 | // import 'tinymce/plugins/searchreplace' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/directionality/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "directionality" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/directionality') 5 | // ES2015: 6 | // import 'tinymce/plugins/directionality' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/insertdatetime/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "insertdatetime" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/insertdatetime') 5 | // ES2015: 6 | // import 'tinymce/plugins/insertdatetime' 7 | require('./plugin.js'); 8 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/entity/MenuEntity.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.entity; 2 | 3 | import com.marspie.framework.common.entity.BaseEntity; 4 | 5 | import javax.persistence.Entity; 6 | 7 | /** 8 | * @author alex.yao 9 | * @version 1.0.0 10 | * @create 2018-01-09 17:27 11 | **/ 12 | @Entity 13 | public class MenuEntity extends BaseEntity { 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/entity/RoleEntity.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.entity; 2 | 3 | import com.marspie.framework.common.entity.BaseEntity; 4 | 5 | import javax.persistence.Entity; 6 | 7 | /** 8 | * @author alex.yao 9 | * @version 1.0.0 10 | * @create 2018-01-09 17:27 11 | **/ 12 | @Entity 13 | public class RoleEntity extends BaseEntity { 14 | } 15 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/repository/MenuRepository.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.repository; 2 | 3 | import com.marspie.framework.common.repository.BaseRepository; 4 | import com.marspie.modules.sys.entity.MenuEntity; 5 | 6 | /** 7 | * @author alex.yao 8 | * @version 1.0.0 9 | * @create 2018-01-09 17:28 10 | **/ 11 | public interface MenuRepository extends BaseRepository{ 12 | } 13 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/repository/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.repository; 2 | 3 | import com.marspie.framework.common.repository.BaseRepository; 4 | import com.marspie.modules.sys.entity.RoleEntity; 5 | 6 | /** 7 | * @author alex.yao 8 | * @version 1.0.0 9 | * @create 2018-01-09 17:28 10 | **/ 11 | public interface RoleRepository extends BaseRepository{ 12 | } 13 | -------------------------------------------------------------------------------- /web/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | 4 | import app from './modules/app'; 5 | import user from './modules/user'; 6 | 7 | Vue.use(Vuex); 8 | 9 | const store = new Vuex.Store({ 10 | state: { 11 | // 12 | }, 13 | mutations: { 14 | // 15 | }, 16 | actions: { 17 | 18 | }, 19 | modules: { 20 | app, 21 | user 22 | } 23 | }); 24 | 25 | export default store; 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## LazyJava4 ## 2 | 3 | ## 4 | java 1.8.144 5 | IntelliJ IDEA Pro 2017.2.1 6 | maven 3.5.0 7 | gradle 4.1 8 | 9 | 10 | 11 | ## 学习乐园 12 | 源码地址:我的[GitHub地址](https://github.com/marspie "GitHub")
13 | 作者:[MarsPie火星派](http://www.marspie.com/ "MarsPie火星派")
14 | 关注微信公众号【MarsPie火星派】,及时得到技术文章推送
15 | ![公众号](https://github.com/marspie/LazyJava4/blob/master/qrcode.jpg) 16 | 17 | ## License 18 | [MIT](https://opensource.org/licenses/MIT "MIT") 19 | 20 | Copyright (c) 2018, Marspie -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.repository; 2 | 3 | import com.marspie.framework.common.repository.BaseRepository; 4 | import com.marspie.modules.sys.entity.UserEntity; 5 | 6 | /** 7 | * @author alex.yao 8 | * @version 1.0.0 9 | * @create 2018-01-09 17:28 10 | **/ 11 | public interface UserRepository extends BaseRepository{ 12 | 13 | UserEntity findByUsername(String username); 14 | } 15 | -------------------------------------------------------------------------------- /web/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.moowork.node" version "1.1.1" 3 | id 'java' 4 | } 5 | //调用npm run build命令的Gradle任务 6 | task npmBuild(type: NpmTask, dependsOn: npmInstall) { 7 | group = 'node' 8 | args = ['run', 'build'] 9 | } 10 | 11 | //Gradle的java插件的jar任务,依赖npmBuild,即web子模块打jar包前必须运行npm run build 12 | jar.dependsOn npmBuild 13 | 14 | //调用npm run dev 15 | task npmDev(type: NpmTask, dependsOn: npmInstall) { 16 | group = 'node' 17 | args = ['run', 'dev'] 18 | } 19 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/repository/BaseRepository.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.repository; 2 | 3 | import com.marspie.framework.common.entity.BaseEntity; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * @author alex.yao 10 | * @create 2018-01-09 16:12 11 | **/ 12 | public interface BaseRepository, ID extends Serializable> extends JpaRepository { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /web/src/views/error-page/error-page.less: -------------------------------------------------------------------------------- 1 | .error-page{ 2 | &-show{ 3 | width: 100%; 4 | height: 180px; 5 | transform: scale(0.4); 6 | } 7 | &-cover{ 8 | position: absolute; 9 | width: 100%; 10 | height: 100%; 11 | left: 0; 12 | top: 0; 13 | } 14 | &-intro-con{ 15 | height: 180px; 16 | p{ 17 | display: block; 18 | width: 100%; 19 | text-align: center; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /web/src/views/home/components/styles/to-do-list-item.less: -------------------------------------------------------------------------------- 1 | .to-do-list-item-text{ 2 | word-break:keep-all; 3 | white-space:nowrap; 4 | overflow: hidden; 5 | text-overflow: ellipsis; 6 | font-weight: 500; 7 | cursor: pointer; 8 | height: 36px; 9 | 10 | .height-100{ 11 | height: 100%; 12 | } 13 | .infor-icon-row{ 14 | color: #c8c8c8; 15 | } 16 | } 17 | .hasDid{ 18 | text-decoration: line-through; 19 | color: gray; 20 | font-weight: 100; 21 | } -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/controller/BaseController.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.controller; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.web.bind.annotation.RestController; 6 | 7 | import javax.persistence.MappedSuperclass; 8 | 9 | /** 10 | * @author alex.yao 11 | * @create 2018-01-01 16:12 12 | **/ 13 | public class BaseController { 14 | 15 | protected Logger logger = LoggerFactory.getLogger(getClass()); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /web/src/views/form/work-flow/work-flow.less: -------------------------------------------------------------------------------- 1 | .step{ 2 | &-header-con{ 3 | text-align: center; 4 | h3{ 5 | margin: 10px 0; 6 | } 7 | h5{ 8 | margin: 0 0 5px; 9 | } 10 | } 11 | &-content{ 12 | padding: 5px 20px 26px; 13 | margin-bottom: 20px; 14 | border-bottom: 1px solid #dbdddf; 15 | } 16 | &-form{ 17 | padding-bottom: 10px; 18 | border-bottom: 1px solid #dbdddf; 19 | margin-bottom: 20px; 20 | } 21 | } -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/controller/MenuController.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.controller; 2 | 3 | import com.marspie.framework.common.controller.BaseController; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RestController; 6 | 7 | /** 8 | * @author alex.yao 9 | * @version 1.0.0 10 | * @create 2018-01-09 17:20 11 | **/ 12 | @RestController 13 | @RequestMapping("/menu") 14 | public class MenuController extends BaseController { 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/controller/RoleController.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.controller; 2 | 3 | import com.marspie.framework.common.controller.BaseController; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RestController; 6 | 7 | /** 8 | * @author alex.yao 9 | * @version 1.0.0 10 | * @create 2018-01-09 17:20 11 | **/ 12 | @RestController 13 | @RequestMapping("/roles") 14 | public class RoleController extends BaseController { 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /web/src/views/tables/components/ExportExcel.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 22 | -------------------------------------------------------------------------------- /web/src/views/my-components/area-linkage/util/index.js: -------------------------------------------------------------------------------- 1 | let util = {}; 2 | 3 | util.levelArr = [0, 1, 2, 3]; 4 | 5 | util.oneOf = (item, arr) => { 6 | return arr.some(i => { 7 | return i === item; 8 | }); 9 | }; 10 | util.getIndex = (list, name) => { 11 | for (const i in list) { 12 | if (list[i] === name) { 13 | return i; 14 | } 15 | } 16 | }; 17 | 18 | util.dataType = ['all', 'code', 'name']; 19 | 20 | util.checkLevel = val => { 21 | return util.oneOf(val, util.levelArr); 22 | }; 23 | 24 | export default util; 25 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/services/BaseServices.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.services; 2 | 3 | import com.marspie.framework.common.entity.BaseEntity; 4 | import com.marspie.framework.common.repository.BaseRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * @author alex.yao 11 | * @version 1.0.0 12 | * @create 2018-01-09 16:12 13 | **/ 14 | public abstract class BaseServices> { 15 | 16 | @Autowired 17 | protected D dao; 18 | } 19 | -------------------------------------------------------------------------------- /server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #spring.datasource.url=jdbc:h2:mem:lazyjava4 2 | #spring.datasource.username=sa 3 | #spring.datasource.password= 4 | #spring.datasource.data=classpath:data.sql 5 | #spring.datasource.driver-class-name=org.h2.Driver 6 | 7 | #spring.h2.console.settings.web-allow-others=true 8 | #spring.h2.console.path=/h2-console 9 | #spring.h2.console.enabled=true 10 | 11 | 12 | ## jpa 13 | #spring.jpa.database=H2 14 | spring.jpa.show-sql=true 15 | spring.jpa.hibernate.ddl-auto=update 16 | 17 | ## logger 18 | #logging.level.org.springframework.web=DEBUG 19 | logging.level.org.hibernate=DEBUG -------------------------------------------------------------------------------- /web/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "standard", 3 | "root": true, 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "env": { 9 | "browser": true, 10 | "node": true 11 | }, 12 | "plugins": [ "html", "standard" ], 13 | "rules": { 14 | "indent": ["error", 4, { "SwitchCase": 1 }], 15 | "quotes": ["error", "single"], 16 | "semi": ["error", "always"], 17 | "no-console": ["error"], 18 | "no-empty": 2, 19 | "no-eq-null": 2, 20 | "no-new": 0, 21 | "no-fallthrough": 0, 22 | "no-unreachable": 0 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /web/src/app.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | 26 | 38 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | iView admin 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /web/src/views/main-components/breadcrumb-nav.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 28 | 29 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/web/enums/ResultCode.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.web.enums; 2 | 3 | /** 4 | * @author alex.yao 5 | * @version 1.0.0 6 | * @create 2018-01-10 15:32 7 | **/ 8 | public enum ResultCode { 9 | 10 | SUCCESS(0, "请求成功"), 11 | WEAK_NET_WORK(-1, "网络异常,请稍后重试"), 12 | PASSWORD_ERROR(101, "用户名或密码错误"), 13 | PARAMETER_ERROR(102, "参数错误"); 14 | 15 | private int code; 16 | private String msg; 17 | 18 | ResultCode(int code, String msg) { 19 | this.code = code; 20 | this.msg = msg; 21 | } 22 | 23 | public int getCode() { 24 | return code; 25 | } 26 | 27 | public String getMsg() { 28 | return msg; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /web/src/views/access/access.less: -------------------------------------------------------------------------------- 1 | .access{ 2 | &-user-con{ 3 | height: 200px; 4 | } 5 | &-current-user-con{ 6 | text-align: center; 7 | padding-top: 10px; 8 | img{ 9 | display: block; 10 | width: 100px; 11 | height: 100px; 12 | border: 2px solid #dddde2; 13 | border-radius: 50%; 14 | margin: 0px auto 10px; 15 | } 16 | p{ 17 | display: block; 18 | padding: 20px 0 0; 19 | b{ 20 | margin: 0 10px; 21 | color: #2d8cf0; 22 | } 23 | } 24 | } 25 | &-change-access-con{ 26 | &-row{ 27 | height: 200px; 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/config/WebConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.config; 2 | 3 | import org.apache.catalina.servlets.WebdavServlet; 4 | import org.springframework.boot.web.servlet.ServletRegistrationBean; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * @author alex.yao 10 | * @version 1.0.0 11 | * @create 2018-01-12 9:27 12 | **/ 13 | @Configuration 14 | public class WebConfiguration { 15 | @Bean 16 | ServletRegistrationBean h2servletRegistration() { 17 | ServletRegistrationBean registrationBean = new ServletRegistrationBean(new WebdavServlet()); 18 | registrationBean.addUrlMappings("/console/*"); 19 | return registrationBean; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /web/src/views/home/components/mapDataTable.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 32 | -------------------------------------------------------------------------------- /web/src/views/home/map-data/get-geography-value.js: -------------------------------------------------------------------------------- 1 | export default { 2 | '海门': [121.15, 31.89], 3 | '鄂尔多斯': [109.781327, 39.608266], 4 | '招远': [120.38, 37.35], 5 | '舟山': [122.207216, 29.985295], 6 | '齐齐哈尔': [123.97, 47.33], 7 | '广州': [113.23, 23.16], 8 | '盐城': [120.13, 33.38], 9 | '赤峰': [118.87, 42.28], 10 | '深圳': [114.07, 22.62], 11 | '青岛': [120.33, 36.07], 12 | '北京': [116.46, 39.92], 13 | '乳山': [121.52, 36.89], 14 | '金昌': [102.188043, 38.520089], 15 | '泉州': [118.58, 24.93], 16 | '莱西': [120.53, 36.86], 17 | '日照': [119.46, 35.42], 18 | '胶南': [119.97, 35.88], 19 | '南通': [121.05, 32.08], 20 | '拉萨': [91.11, 29.97], 21 | '云浮': [112.02, 22.93], 22 | '梅州': [116.1, 24.55], 23 | '文登': [122.05, 37.2], 24 | '上海': [121.48, 31.22] 25 | }; 26 | -------------------------------------------------------------------------------- /web/src/store/modules/user.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie'; 2 | 3 | const user = { 4 | state: {}, 5 | mutations: { 6 | logout (state, vm) { 7 | Cookies.remove('user'); 8 | Cookies.remove('password'); 9 | Cookies.remove('access'); 10 | // 恢复默认样式 11 | let themeLink = document.querySelector('link[name="theme"]'); 12 | themeLink.setAttribute('href', ''); 13 | // 清空打开的页面等数据,但是保存主题数据 14 | let theme = ''; 15 | if (localStorage.theme) { 16 | theme = localStorage.theme; 17 | } 18 | localStorage.clear(); 19 | if (theme) { 20 | localStorage.theme = theme; 21 | } 22 | } 23 | } 24 | }; 25 | 26 | export default user; 27 | -------------------------------------------------------------------------------- /web/src/views/login.less: -------------------------------------------------------------------------------- 1 | .login{ 2 | width: 100%; 3 | height: 100%; 4 | background-image: url('https://file.iviewui.com/iview-admin/login_bg.jpg'); 5 | background-size: cover; 6 | background-position: center; 7 | position: relative; 8 | &-con{ 9 | position: absolute; 10 | right: 160px; 11 | top: 50%; 12 | transform: translateY(-60%); 13 | width: 300px; 14 | &-header{ 15 | font-size: 16px; 16 | font-weight: 300; 17 | text-align: center; 18 | padding: 30px 0; 19 | } 20 | .form-con{ 21 | padding: 10px 0 0; 22 | } 23 | .login-tip{ 24 | font-size: 10px; 25 | text-align: center; 26 | color: #c3c3c3; 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /web/src/locale/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Locales from './locale'; 3 | import zhLocale from 'iview/src/locale/lang/zh-CN'; 4 | import enLocale from 'iview/src/locale/lang/en-US'; 5 | import zhTLocale from 'iview/src/locale/lang/zh-TW'; 6 | 7 | // 自动设置语言 8 | const navLang = navigator.language; 9 | const localLang = (navLang === 'zh-CN' || navLang === 'en-US') ? navLang : false; 10 | const lang = window.localStorage.lang || localLang || 'zh-CN'; 11 | 12 | Vue.config.lang = lang; 13 | 14 | // 多语言配置 15 | const locales = Locales; 16 | const mergeZH = Object.assign(zhLocale, locales['zh-CN']); 17 | const mergeEN = Object.assign(enLocale, locales['en-US']); 18 | const mergeTW = Object.assign(zhTLocale, locales['zh-TW']); 19 | Vue.locale('zh-CN', mergeZH); 20 | Vue.locale('en-US', mergeEN); 21 | Vue.locale('zh-TW', mergeTW); 22 | -------------------------------------------------------------------------------- /web/src/template/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= htmlWebpackPlugin.options.title %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /web/src/views/home/map-data/get-city-value.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | {name: '海门', value: 45}, 3 | {name: '鄂尔多斯', value: 34}, 4 | {name: '招远', value: 47}, 5 | {name: '舟山', value: 22}, 6 | {name: '齐齐哈尔', value: 74}, 7 | {name: '广州', value: 138}, 8 | {name: '盐城', value: 15}, 9 | {name: '北京', value: 250}, 10 | {name: '深圳', value: 141}, 11 | {name: '赤峰', value: 16}, 12 | {name: '青岛', value: 89}, 13 | {name: '乳山', value: 18}, 14 | {name: '金昌', value: 34}, 15 | {name: '泉州', value: 21}, 16 | {name: '莱西', value: 66}, 17 | {name: '日照', value: 45}, 18 | {name: '胶南', value: 23}, 19 | {name: '南通', value: 54}, 20 | {name: '拉萨', value: 22}, 21 | {name: '云浮', value: 78}, 22 | {name: '梅州', value: 23}, 23 | {name: '文登', value: 78}, 24 | {name: '上海', value: 218} 25 | ]; 26 | -------------------------------------------------------------------------------- /web/src/views/home/home.less: -------------------------------------------------------------------------------- 1 | .user-infor{ 2 | height: 135px; 3 | } 4 | .avator-img{ 5 | display: block; 6 | width: 80%; 7 | max-width: 100px; 8 | height: auto; 9 | } 10 | .card-user-infor-name{ 11 | font-size: 2em; 12 | color: #2d8cf0; 13 | } 14 | .card-title{ 15 | color: #abafbd; 16 | } 17 | .made-child-con-middle{ 18 | height: 100%; 19 | } 20 | .to-do-list-con{ 21 | height: 145px; 22 | overflow: auto; 23 | } 24 | .to-do-item{ 25 | padding: 2px; 26 | } 27 | .infor-card-con{ 28 | height: 100px; 29 | } 30 | .infor-card-icon-con{ 31 | height: 100%; 32 | color: white; 33 | border-radius: 3px 0 0 3px; 34 | } 35 | .map-con{ 36 | height: 305px; 37 | } 38 | .map-incon{ 39 | height: 100%; 40 | } 41 | .data-source-row{ 42 | height: 200px; 43 | } 44 | .line-chart-con{ 45 | height: 150px; 46 | } 47 | -------------------------------------------------------------------------------- /web/src/views/main-components/message-tip.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/entity/UserEntity.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.entity; 2 | 3 | import com.marspie.framework.common.entity.BaseEntity; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.Table; 7 | 8 | 9 | /** 10 | * @author alex.yao 11 | * @version 1.0.0 12 | * @create 2018-01-09 17:26 13 | **/ 14 | @Entity 15 | @Table(name = "tbl_user") 16 | public class UserEntity extends BaseEntity { 17 | 18 | private String username; 19 | private String password; 20 | 21 | public String getUsername() { 22 | return username; 23 | } 24 | 25 | public void setUsername(String username) { 26 | this.username = username; 27 | } 28 | 29 | public String getPassword() { 30 | return password; 31 | } 32 | 33 | public void setPassword(String password) { 34 | this.password = password; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /web/src/views/my-components/file-upload/upload.less: -------------------------------------------------------------------------------- 1 | .admin-upload-list{ 2 | display: inline-block; 3 | width: 60px; 4 | height: 60px; 5 | text-align: center; 6 | line-height: 60px; 7 | border: 1px solid transparent; 8 | border-radius: 4px; 9 | overflow: hidden; 10 | background: #fff; 11 | position: relative; 12 | box-shadow: 0 1px 1px rgba(0,0,0,.2); 13 | margin-right: 4px; 14 | } 15 | .admin-upload-list img{ 16 | width: 100%; 17 | height: 100%; 18 | } 19 | .admin-upload-list-cover{ 20 | display: none; 21 | position: absolute; 22 | top: 0; 23 | bottom: 0; 24 | left: 0; 25 | right: 0; 26 | background: rgba(0,0,0,.6); 27 | } 28 | .admin-upload-list:hover .admin-upload-list-cover{ 29 | display: block; 30 | } 31 | .admin-upload-list-cover i{ 32 | color: #fff; 33 | font-size: 20px; 34 | cursor: pointer; 35 | margin: 0 2px; 36 | } -------------------------------------------------------------------------------- /server/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '1.5.9.RELEASE' 3 | id 'java' 4 | } 5 | 6 | jar { 7 | baseName = 'server' 8 | version = '1.0-SNAPSHOT' 9 | } 10 | 11 | repositories { 12 | //使用淘宝的maven镜像 13 | maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'} 14 | mavenCentral() 15 | } 16 | 17 | dependencies { 18 | // server打包时把web的资源先打包,并作为依赖,加入到server项目生成的jar包中 19 | compile project(':web')//server模块依赖web模块 20 | compile('org.springframework.boot:spring-boot-starter-data-jpa') 21 | compile('org.springframework.boot:spring-boot-starter-security') 22 | compile('org.springframework.boot:spring-boot-starter-web') 23 | compile('io.jsonwebtoken:jjwt:0.9.0') 24 | compile('com.alibaba:fastjson:1.2.44') 25 | runtime('com.h2database:h2') 26 | testCompile('org.springframework.boot:spring-boot-starter-test') 27 | testCompile('org.springframework.security:spring-security-test') 28 | } -------------------------------------------------------------------------------- /web/src/views/my-components/draggable-list/draggable-list.less: -------------------------------------------------------------------------------- 1 | .iview-admin-draggable-list{ 2 | height: 100%; 3 | } 4 | .iview-admin-draggable-list li{ 5 | padding: 9px; 6 | border: 1px solid #e7ebee; 7 | border-radius: 3px; 8 | margin-bottom: 5px; 9 | cursor: pointer; 10 | position: relative; 11 | transition: all .2s; 12 | } 13 | .iview-admin-draggable-list li:hover{ 14 | color: #87b4ee; 15 | border-color: #87b4ee; 16 | transition: all .2s; 17 | } 18 | .iview-admin-draggable-delete{ 19 | height: 100%; 20 | position: absolute; 21 | right: -8px; 22 | top: 0px; 23 | display: none; 24 | } 25 | .iview-admin-draggable-list li:hover .iview-admin-draggable-delete{ 26 | display: block; 27 | } 28 | .placeholder-style{ 29 | display: block !important; 30 | color: transparent; 31 | border-style: dashed !important; 32 | } 33 | .delte-item-animation{ 34 | opacity: 0; 35 | transition: all .2s; 36 | } 37 | .iview-admin-draggable-list{ 38 | overflow: auto 39 | } -------------------------------------------------------------------------------- /web/src/views/own-space/own-space.less: -------------------------------------------------------------------------------- 1 | .own-space{ 2 | &-btn-box{ 3 | margin-bottom: 10px; 4 | button{ 5 | padding-left: 0; 6 | span{ 7 | color: #2D8CF0; 8 | transition: all .2s; 9 | } 10 | span:hover{ 11 | color: #0C25F1; 12 | transition: all .2s; 13 | } 14 | } 15 | } 16 | &-tra{ 17 | width:10px; 18 | height:10px; 19 | transform:rotate(45deg); 20 | position:absolute; 21 | top:50%; 22 | margin-top:-6px; 23 | left:-3px; 24 | box-shadow:0 0 2px 3px rgba(0,0,0,.1); 25 | background-color:white;z-index:100; 26 | } 27 | &-input-identifycode-con{ 28 | position:absolute; 29 | width:200px; 30 | height:100px; 31 | right:-220px; 32 | top:50%; 33 | margin-top:-50px; 34 | border-radius:4px; 35 | box-shadow:0 0 2px 3px rgba(0,0,0,.1); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /web/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 iView 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Marspie 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /web/src/views/error-page/404.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | 20 | 35 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.controller; 2 | 3 | import com.marspie.framework.common.controller.BaseController; 4 | import com.marspie.modules.sys.entity.UserEntity; 5 | import com.marspie.modules.sys.services.UserService; 6 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 7 | import org.springframework.web.bind.annotation.*; 8 | 9 | import javax.annotation.Resource; 10 | import java.util.List; 11 | 12 | /** 13 | * @author alex.yao 14 | * @version 1.0.0 15 | * @create 2018-01-09 17:20 16 | **/ 17 | @RestController 18 | @RequestMapping("/users") 19 | public class UserController extends BaseController { 20 | 21 | @Resource 22 | private UserService userService; 23 | @Resource 24 | BCryptPasswordEncoder bCryptPasswordEncoder; 25 | 26 | @PostMapping("/save") 27 | public void save(@RequestBody UserEntity user) { 28 | user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); 29 | userService.save(user); 30 | } 31 | 32 | @GetMapping("list") 33 | public List get() { 34 | return userService.findAll(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /web/src/styles/common.less: -------------------------------------------------------------------------------- 1 | .margin-top-8{ 2 | margin-top: 8px; 3 | } 4 | .margin-top-10{ 5 | margin-top: 10px; 6 | } 7 | .margin-top-20{ 8 | margin-top: 20px; 9 | } 10 | .margin-left-10{ 11 | margin-left: 10px; 12 | } 13 | .margin-bottom-10{ 14 | margin-bottom: 10px; 15 | } 16 | .margin-bottom-100{ 17 | margin-bottom: 100px; 18 | } 19 | .margin-right-10{ 20 | margin-right: 10px; 21 | } 22 | .padding-left-6{ 23 | padding-left: 6px; 24 | } 25 | .padding-left-8{ 26 | padding-left: 5px; 27 | } 28 | .padding-left-10{ 29 | padding-left: 10px; 30 | } 31 | .padding-left-20{ 32 | padding-left: 20px; 33 | } 34 | .height-100{ 35 | height: 100%; 36 | } 37 | .height-120px{ 38 | height: 100px; 39 | } 40 | .height-200px{ 41 | height: 200px; 42 | } 43 | .height-492px{ 44 | height: 492px; 45 | } 46 | .height-460px{ 47 | height: 460px; 48 | } 49 | .line-gray{ 50 | height: 0; 51 | border-bottom: 2px solid #dcdcdc; 52 | } 53 | .notwrap{ 54 | word-break:keep-all; 55 | white-space:nowrap; 56 | overflow: hidden; 57 | text-overflow: ellipsis; 58 | } 59 | .padding-left-5{ 60 | padding-left: 10px; 61 | } 62 | [v-cloak]{ 63 | display: none; 64 | } -------------------------------------------------------------------------------- /web/src/views/error-page/403.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | 20 | 35 | -------------------------------------------------------------------------------- /web/src/views/my-components/markdown-editor/markdown-editor.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 20 | 21 | 34 | -------------------------------------------------------------------------------- /web/src/views/form/article-publish/preview.less: -------------------------------------------------------------------------------- 1 | .preview{ 2 | &-main{ 3 | width: 100%; 4 | height: 100%; 5 | background: #d7e1ed; 6 | } 7 | &-header{ 8 | padding-right: 20px; 9 | height: 60px; 10 | background: #4a5161; 11 | text-align: right; 12 | ul{ 13 | display: inline-block !important; 14 | } 15 | } 16 | &-placeholderCon{ 17 | height: 200px; 18 | } 19 | &-placeholder{ 20 | height: 40px; 21 | margin-bottom: 10px; 22 | background: #9fafd4; 23 | border-radius: 3px; 24 | } 25 | &-tags-con{ 26 | padding: 5px 0; 27 | margin: 10px 0; 28 | } 29 | &-tip{ 30 | font-size: 12px; 31 | color: #c3c3c3; 32 | } 33 | &-content-con{ 34 | border-top: 1px solid #edeff1; 35 | border-bottom: 1px solid #edeff1; 36 | padding: 12px 0 20px; 37 | margin-bottom: 20px; 38 | } 39 | &-classifition-con{ 40 | padding: 5px 0; 41 | } 42 | &-classifition-item{ 43 | margin-right: 8px; 44 | } 45 | &-publish-time{ 46 | font-size: 12px; 47 | color: gray; 48 | margin-top: 5px; 49 | } 50 | } -------------------------------------------------------------------------------- /web/src/views/error-page/500.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 21 | 22 | 37 | -------------------------------------------------------------------------------- /web/src/views/tables/data/search.js: -------------------------------------------------------------------------------- 1 | export const columns1 = [ 2 | { 3 | key: 'name', 4 | title: '姓名' 5 | }, 6 | { 7 | key: 'tel', 8 | title: '电话号码' 9 | } 10 | ]; 11 | 12 | export const searchTable1 = [ 13 | { 14 | name: 'Aresn', 15 | tel: '17712345678' 16 | }, 17 | { 18 | name: 'Lison', 19 | tel: '17787654321' 20 | }, 21 | { 22 | name: 'Lili', 23 | tel: '12212345678' 24 | }, 25 | { 26 | name: 'Lucy', 27 | tel: '13312345678' 28 | } 29 | ]; 30 | 31 | export const searchTable2 = [ 32 | { 33 | name: 'Aresn', 34 | tel: '17712345678' 35 | }, 36 | { 37 | name: 'Lison', 38 | tel: '17787654321' 39 | }, 40 | { 41 | name: 'Lili', 42 | tel: '12212345678' 43 | }, 44 | { 45 | name: 'Lucy', 46 | tel: '13312345678' 47 | } 48 | ]; 49 | 50 | export const searchTable3 = [ 51 | { 52 | name: 'Aresn', 53 | tel: '17712345678' 54 | }, 55 | { 56 | name: 'Lison', 57 | tel: '17787654321' 58 | }, 59 | { 60 | name: 'Lili', 61 | tel: '12212345678' 62 | }, 63 | { 64 | name: 'Lucy', 65 | tel: '13312345678' 66 | } 67 | ]; 68 | -------------------------------------------------------------------------------- /web/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import iView from 'iview'; 3 | import {router} from './router/index'; 4 | import {appRouter} from './router/router'; 5 | import store from './store'; 6 | import App from './app.vue'; 7 | import '@/locale'; 8 | import 'iview/dist/styles/iview.css'; 9 | import VueI18n from 'vue-i18n'; 10 | import util from './libs/util'; 11 | 12 | Vue.use(VueI18n); 13 | Vue.use(iView); 14 | 15 | new Vue({ 16 | el: '#app', 17 | router: router, 18 | store: store, 19 | render: h => h(App), 20 | data: { 21 | currentPageName: '' 22 | }, 23 | mounted () { 24 | this.currentPageName = this.$route.name; 25 | // 显示打开的页面的列表 26 | this.$store.commit('setOpenedList'); 27 | this.$store.commit('initCachepage'); 28 | // 权限菜单过滤相关 29 | this.$store.commit('updateMenulist'); 30 | // iview-admin检查更新 31 | // util.checkUpdate(this); 32 | }, 33 | created () { 34 | let tagsList = []; 35 | appRouter.map((item) => { 36 | if (item.children.length <= 1) { 37 | tagsList.push(item.children[0]); 38 | } else { 39 | tagsList.push(...item.children); 40 | } 41 | }); 42 | this.$store.commit('setTagsList', tagsList); 43 | } 44 | }); 45 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/controller/SignupController.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.controller; 2 | 3 | import com.marspie.framework.common.controller.BaseController; 4 | import com.marspie.modules.sys.entity.UserEntity; 5 | import com.marspie.modules.sys.services.UserService; 6 | import org.springframework.util.DigestUtils; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import javax.annotation.Resource; 13 | 14 | /** 15 | * @author alex.yao 16 | * @version 1.0.0 17 | * @create 2018-01-09 17:20 18 | **/ 19 | @RestController 20 | @RequestMapping("/signup") 21 | public class SignupController extends BaseController { 22 | 23 | @Resource 24 | private UserService userService; 25 | 26 | @PostMapping 27 | public void signUp(@RequestBody UserEntity user) throws Exception { 28 | UserEntity user1 = userService.findByUsername(user.getUsername()); 29 | if(null != user1){ 30 | throw new Exception("用户已经存在~"); 31 | } 32 | user.setPassword(DigestUtils.md5DigestAsHex((user.getPassword()).getBytes())); 33 | userService.save(user); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /web/src/views/home/components/toDoListItem.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 24 | 25 | -------------------------------------------------------------------------------- /web/src/views/tables/components/dragableTable.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 51 | 52 | -------------------------------------------------------------------------------- /web/src/views/my-components/split-pane/split-pane/split-pane.less: -------------------------------------------------------------------------------- 1 | @prefix: ~"split-pane"; 2 | @container: ~"@{prefix}-container"; 3 | @trigger: ~"@{prefix}-trigger"; 4 | 5 | .@{prefix}{ 6 | position: relative; 7 | &-container{ 8 | height: 100%; 9 | width: 100%; 10 | } 11 | 12 | &-horizontal{ 13 | & > div > .@{trigger}{ 14 | transform: translateX(-50%); 15 | cursor: col-resize; 16 | width: 2px; 17 | height: 100%; 18 | margin: 0 1px; 19 | } 20 | } 21 | 22 | &-vertical{ 23 | & > div > .@{trigger}{ 24 | transform: translateY(-50%); 25 | cursor: row-resize; 26 | height: 2px; 27 | width: 100%; 28 | margin: 1px 0; 29 | } 30 | } 31 | 32 | &-trigger{ 33 | position: absolute; 34 | z-index: 3; 35 | background: #BDBDBD; 36 | } 37 | 38 | &-left-area{ 39 | height: 100%; 40 | float: left; 41 | z-index: 2; 42 | overflow: auto; 43 | } 44 | 45 | &-right-area{ 46 | height: 100%; 47 | float: left; 48 | z-index: 2; 49 | overflow: auto; 50 | } 51 | 52 | &-top-area{ 53 | width: 100%; 54 | z-index: 2; 55 | overflow: auto; 56 | } 57 | 58 | &-bottom-area{ 59 | width: 100%; 60 | z-index: 2; 61 | overflow: auto; 62 | } 63 | } -------------------------------------------------------------------------------- /web/src/views/advanced-router/component/expandRow.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 37 | -------------------------------------------------------------------------------- /web/src/views/error-page/404.less: -------------------------------------------------------------------------------- 1 | @keyframes error404animation { 2 | 0% { 3 | transform: rotateZ(0deg); 4 | } 5 | 20% { 6 | transform: rotateZ(-60deg); 7 | } 8 | 40% { 9 | transform: rotateZ(-10deg); 10 | } 11 | 60% { 12 | transform: rotateZ(50deg); 13 | } 14 | 80% { 15 | transform: rotateZ(-20deg); 16 | } 17 | 100% { 18 | transform: rotateZ(0deg); 19 | } 20 | } 21 | .error404{ 22 | &-body-con{ 23 | width: 700px; 24 | height: 500px; 25 | position: absolute; 26 | left: 50%; 27 | top: 50%; 28 | transform: translate(-50%,-50%); 29 | &-title{ 30 | text-align: center; 31 | font-size: 240px; 32 | font-weight: 700; 33 | color: #2d8cf0; 34 | height: 260px; 35 | line-height: 260px; 36 | margin-top: 40px; 37 | span{ 38 | display: inline-block; 39 | color: #19be6b; 40 | font-size: 230px; 41 | animation: error404animation 3s ease 0s infinite alternate; 42 | } 43 | } 44 | &-message{ 45 | display: block; 46 | text-align: center; 47 | font-size: 30px; 48 | font-weight: 500; 49 | letter-spacing: 12px; 50 | color: #dddde2; 51 | } 52 | } 53 | &-btn-con{ 54 | text-align: center; 55 | padding: 20px 0; 56 | margin-bottom: 40px; 57 | } 58 | } -------------------------------------------------------------------------------- /web/src/views/main-components/lockscreen/components/locking-page.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 45 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/Application.java: -------------------------------------------------------------------------------- 1 | package com.marspie; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | import org.springframework.boot.web.servlet.ServletRegistrationBean; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.security.core.userdetails.UserDetailsService; 10 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 11 | import org.springframework.web.context.WebApplicationContext; 12 | import org.springframework.web.servlet.DispatcherServlet; 13 | 14 | @SpringBootApplication 15 | public class Application { 16 | 17 | private static final Logger logger = LoggerFactory.getLogger(Application.class); 18 | 19 | public static void main(String[] args) { 20 | SpringApplication.run(Application.class); 21 | // logger.info("SpringBoot server stated on port: 8080"); 22 | } 23 | 24 | //增加一个SpringMVC的DispatcherServlet,接收前台/api开头的请求 25 | // @Bean 26 | // public ServletRegistrationBean apiV1ServletBean(WebApplicationContext wac) { 27 | // DispatcherServlet servlet = new DispatcherServlet(wac); 28 | // ServletRegistrationBean bean = new ServletRegistrationBean(servlet, "/api/*"); 29 | // bean.setName("ApiServlet"); 30 | // return bean; 31 | // } 32 | 33 | @Bean 34 | public BCryptPasswordEncoder bCryptPasswordEncoder() { 35 | return new BCryptPasswordEncoder(); 36 | } 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/print/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('4', tinymce.util.Tools.resolve), g('1', ['4'], function (a) { return a('tinymce.PluginManager'); }), g('2', [], function () { var a = function (a) { a.addCommand('mcePrint', function () { a.getWin().print(); }); }; return {register: a}; }), g('3', [], function () { var a = function (a) { a.addButton('print', {title: 'Print', cmd: 'mcePrint'}), a.addMenuItem('print', {text: 'Print', cmd: 'mcePrint', icon: 'print'}); }; return {register: a}; }), g('0', ['1', '2', '3'], function (a, b, c) { return a.add('print', function (a) { b.register(a), c.register(a), a.addShortcut('Meta+P', '', 'mcePrint'); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/web/R.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.web; 2 | 3 | import com.marspie.framework.common.web.enums.ResultCode; 4 | 5 | /** 6 | * @author alex.yao 7 | * @version 1.0.0 8 | * @create 2018-01-10 15:30 9 | **/ 10 | public class R { 11 | 12 | private int code; 13 | private String msg; 14 | private T data; 15 | 16 | public R() { 17 | } 18 | 19 | public R(ResultCode resultCode, T data) { 20 | this(resultCode); 21 | this.data = data; 22 | } 23 | 24 | public R(ResultCode resultCode) { 25 | this.code = resultCode.getCode(); 26 | this.msg = resultCode.getMsg(); 27 | } 28 | 29 | public static R success(Object data) { 30 | return new R(ResultCode.SUCCESS, data); 31 | } 32 | 33 | public static R warn(ResultCode resultCode, String msg) { 34 | R result = new R(resultCode); 35 | result.setMsg(msg); 36 | return result; 37 | } 38 | 39 | public static R warn(ResultCode resultCode) { 40 | return new R(resultCode); 41 | } 42 | 43 | public int getCode() { 44 | return code; 45 | } 46 | 47 | public void setCode(int code) { 48 | this.code = code; 49 | } 50 | 51 | public String getMsg() { 52 | return msg; 53 | } 54 | 55 | public void setMsg(String msg) { 56 | this.msg = msg; 57 | } 58 | 59 | public Object getData() { 60 | return data; 61 | } 62 | 63 | public void setData(T data) { 64 | this.data = data; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /web/src/views/tables/components/table.less: -------------------------------------------------------------------------------- 1 | .dragging-tip-enter-active{ 2 | opacity: 1; 3 | transition: opacity .3s; 4 | } 5 | .dragging-tip-enter, .dragging-tip-leave-to{ 6 | opacity: 0; 7 | transition: opacity .3s 8 | } 9 | .dragging-tip-con{ 10 | display: block; 11 | text-align: center; 12 | width: 100%; 13 | height: 50px; 14 | } 15 | .dragging-tip-con span{ 16 | font-size: 18px; 17 | } 18 | .record-tip-con{ 19 | display: block; 20 | width: 100%; 21 | height: 292px; 22 | overflow: auto; 23 | } 24 | .record-item{ 25 | box-sizing: content-box; 26 | display: block; 27 | overflow: hidden; 28 | height: 24px; 29 | line-height: 24px; 30 | padding: 8px 10px; 31 | border-bottom: 1px dashed gainsboro; 32 | } 33 | .record-tip-con span{ 34 | font-size: 14px; 35 | } 36 | .edittable-test-con{ 37 | height: 160px; 38 | } 39 | .edittable-table-height-con{ 40 | height: 190px; 41 | } 42 | .edittable-con-1{ 43 | box-sizing: content-box; 44 | padding: 15px 0 0; 45 | height: 196px; 46 | } 47 | .edittable-table-get-currentdata-con{ 48 | height: 190px !important; 49 | } 50 | .exportable-table-download-con1{ 51 | padding: 16px 0 16px 20px; 52 | border-bottom: 1px dashed #c3c3c3; 53 | margin-bottom: 16px; 54 | } 55 | .exportable-table-download-con2{ 56 | padding-left: 20px; 57 | } 58 | .show-image{ 59 | padding: 20px 0px; 60 | } 61 | .show-image img{ 62 | display: block; 63 | width: 100%; 64 | height: auto; 65 | } 66 | .searchable-table{ 67 | &-con1{ 68 | height: 230px !important; 69 | } 70 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/hr/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('4', tinymce.util.Tools.resolve), g('1', ['4'], function (a) { return a('tinymce.PluginManager'); }), g('2', [], function () { var a = function (a) { a.addCommand('InsertHorizontalRule', function () { a.execCommand('mceInsertContent', !1, '
'); }); }; return {register: a}; }), g('3', [], function () { var a = function (a) { a.addButton('hr', {icon: 'hr', tooltip: 'Horizontal line', cmd: 'InsertHorizontalRule'}), a.addMenuItem('hr', {icon: 'hr', text: 'Horizontal line', cmd: 'InsertHorizontalRule', context: 'insert'}); }; return {register: a}; }), g('0', ['1', '2', '3'], function (a, b, c) { return a.add('hr', function (a) { b.register(a), c.register(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/script/webpack.dev.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 4 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 5 | const merge = require('webpack-merge'); 6 | const webpackBaseConfig = require('./webpack.base.config.js'); 7 | const fs = require('fs'); 8 | const package = require('../package.json'); 9 | 10 | fs.open('./script/env.js', 'w', function(err, fd) { 11 | const buf = 'export default "development";'; 12 | fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {}); 13 | }); 14 | 15 | module.exports = merge(webpackBaseConfig, { 16 | devtool: '#source-map', 17 | output: { 18 | publicPath: '/dist', 19 | filename: '[name].js', 20 | chunkFilename: '[name].chunk.js' 21 | }, 22 | plugins: [ 23 | new ExtractTextPlugin({ 24 | filename: '[name].css', 25 | allChunks: true 26 | }), 27 | new webpack.optimize.CommonsChunkPlugin({ 28 | name: ['vender-exten', 'vender-base'], 29 | minChunks: Infinity 30 | }), 31 | new HtmlWebpackPlugin({ 32 | title: 'iView admin v' + package.version, 33 | filename: '../index.html', 34 | inject: false 35 | }), 36 | new CopyWebpackPlugin([ 37 | { 38 | from: 'src/views/main-components/theme-switch/theme' 39 | }, 40 | { 41 | from: 'src/views/my-components/text-editor/tinymce' 42 | } 43 | ], { 44 | ignore: [ 45 | 'text-editor.vue' 46 | ] 47 | }) 48 | ] 49 | }); -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/services/UserService.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.services; 2 | 3 | import com.marspie.framework.common.services.BaseServices; 4 | import com.marspie.modules.sys.entity.UserEntity; 5 | import com.marspie.modules.sys.repository.UserRepository; 6 | import org.springframework.security.core.userdetails.UserDetails; 7 | import org.springframework.security.core.userdetails.UserDetailsService; 8 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 9 | import org.springframework.stereotype.Service; 10 | import org.springframework.transaction.annotation.Transactional; 11 | 12 | import java.util.List; 13 | 14 | import static java.util.Collections.emptyList; 15 | 16 | /** 17 | * @author alex.yao 18 | * @version 1.0.0 19 | * @create 2018-01-10 10:00 20 | **/ 21 | @Service 22 | @Transactional 23 | public class UserService extends BaseServices implements UserDetailsService { 24 | 25 | public List findAll() { 26 | return dao.findAll(); 27 | } 28 | 29 | public void save(UserEntity user) { 30 | dao.save(user); 31 | } 32 | 33 | public UserEntity findByUsername(String username) { 34 | return dao.findByUsername(username); 35 | } 36 | 37 | @Override 38 | public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 39 | UserEntity myUser = dao.findByUsername(username); 40 | if(myUser == null){ 41 | throw new UsernameNotFoundException(username); 42 | } 43 | //TODO:: add user role 44 | return new org.springframework.security.core.userdetails.User(myUser.getUsername(), myUser.getPassword(), emptyList()); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /web/src/views/home/components/inforCard.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 30 | 31 | 60 | 61 | -------------------------------------------------------------------------------- /web/src/views/error-page/500.less: -------------------------------------------------------------------------------- 1 | @keyframes error500animation { 2 | 0% { 3 | transform: rotateZ(0deg); 4 | } 5 | 20% { 6 | transform: rotateZ(-10deg); 7 | } 8 | 40% { 9 | transform: rotateZ(5deg); 10 | } 11 | 60% { 12 | transform: rotateZ(-5deg); 13 | } 14 | 80% { 15 | transform: rotateZ(10deg); 16 | } 17 | 100% { 18 | transform: rotateZ(0deg); 19 | } 20 | } 21 | .error500{ 22 | &-body-con{ 23 | width: 700px; 24 | height: 500px; 25 | position: absolute; 26 | left: 50%; 27 | top: 50%; 28 | transform: translate(-50%,-50%); 29 | &-title{ 30 | text-align: center; 31 | font-size: 240px; 32 | font-weight: 700; 33 | color: #2d8cf0; 34 | height: 260px; 35 | line-height: 260px; 36 | margin-top: 40px; 37 | .error500-0-span{ 38 | display: inline-block; 39 | position: relative; 40 | width: 170px; 41 | height: 170px; 42 | border-radius: 50%; 43 | border: 20px solid #ed3f14; 44 | color: #ed3f14; 45 | margin-right: 10px; 46 | i{ 47 | display: inline-block; 48 | font-size: 120px; 49 | position: absolute; 50 | bottom: -10px; 51 | left: 10px; 52 | transform-origin: center bottom; 53 | animation: error500animation 3s ease 0s infinite alternate; 54 | } 55 | } 56 | } 57 | &-message{ 58 | display: block; 59 | text-align: center; 60 | font-size: 30px; 61 | font-weight: 500; 62 | letter-spacing: 4px; 63 | color: #dddde2; 64 | } 65 | } 66 | &-btn-con{ 67 | text-align: center; 68 | padding: 20px 0; 69 | margin-bottom: 40px; 70 | } 71 | } -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/advice/ExceptionHandlerAdvice.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.advice; 2 | 3 | import com.marspie.framework.common.web.R; 4 | import com.marspie.framework.common.web.enums.ResultCode; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.validation.ObjectError; 8 | import org.springframework.web.bind.MethodArgumentNotValidException; 9 | import org.springframework.web.bind.annotation.ControllerAdvice; 10 | import org.springframework.web.bind.annotation.ExceptionHandler; 11 | import org.springframework.web.bind.annotation.ResponseBody; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * 统一异常处理类 17 | * 18 | * @author alex.yao 19 | * @version 1.0.0 20 | * @create 2018-01-10 15:23 21 | **/ 22 | @ControllerAdvice 23 | @ResponseBody 24 | public class ExceptionHandlerAdvice { 25 | 26 | private Logger logger = LoggerFactory.getLogger(ExceptionHandlerAdvice.class); 27 | 28 | @ExceptionHandler(MethodArgumentNotValidException.class) 29 | public R handleIllegalParamException(MethodArgumentNotValidException e) { 30 | List errors = e.getBindingResult().getAllErrors(); 31 | String tips = "参数不合法"; 32 | if (errors.size() > 0) { 33 | tips = errors.get(0).getDefaultMessage(); 34 | } 35 | return R.warn(ResultCode.PARAMETER_ERROR, tips); 36 | } 37 | 38 | // @ExceptionHandler(ResultException.class) 39 | // public Result handleResultException(ResultException e, HttpServletRequest request) { 40 | // logger.debug("uri={} | requestBody={}", request.getRequestURI(), 41 | // JSON.toJSONString(UserController.MODEL_HOLDER.get())); 42 | // return ResultUtils.warn(e.getResultCode()); 43 | // } 44 | 45 | // @ExceptionHandler(Exception.class) 46 | // public Result handleException(Exception e, HttpServletRequest request) { 47 | // logger.error("uri={} | requestBody={}", request.getRequestURI(), 48 | // JSON.toJSONString(UserController.MODEL_HOLDER.get()), e); 49 | // return ResultUtil.warn(ResultCode.WEAK_NET_WORK); 50 | // } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.entity; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | import com.fasterxml.jackson.core.JsonParser; 6 | 7 | import javax.persistence.*; 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * @author alex.yao 13 | * @create 2018-01-09 16:12 14 | **/ 15 | @MappedSuperclass 16 | public class BaseEntity implements Serializable { 17 | 18 | /** 19 | * primary key 20 | */ 21 | @Id 22 | @GeneratedValue(strategy = GenerationType.AUTO) 23 | private long id; 24 | 25 | /** 26 | * 创建时间 27 | */ 28 | private Date createTime; 29 | 30 | /** 31 | * 修改时间 32 | */ 33 | private Date modifyTime; 34 | 35 | public Boolean deleted = false; 36 | 37 | public long getId() { 38 | return id; 39 | } 40 | 41 | public void setId(long id) { 42 | this.id = id; 43 | } 44 | 45 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00") 46 | @Column(updatable = false) 47 | public Date getCreateTime() { 48 | return createTime; 49 | } 50 | 51 | public void setCreateTime(Date createTime) { 52 | this.createTime = createTime; 53 | } 54 | 55 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00") 56 | public Date getModifyTime() { 57 | return modifyTime; 58 | } 59 | 60 | public void setModifyTime(Date modifyTime) { 61 | this.modifyTime = modifyTime; 62 | } 63 | 64 | public Boolean getDeleted() { 65 | return deleted; 66 | } 67 | 68 | public void setDeleted(Boolean deleted) { 69 | this.deleted = deleted; 70 | } 71 | 72 | @PrePersist 73 | public void initDefaultData() { 74 | this.createTime = new Date(); 75 | this.modifyTime = new Date(); 76 | } 77 | @PreUpdate 78 | public void initUpdateDefaultData() { 79 | this.createTime = new Date(); 80 | } 81 | 82 | @Override 83 | public String toString() { 84 | return JSON.toJSON(this).toString(); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /web/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import iView from 'iview'; 3 | import Util from '../libs/util'; 4 | import VueRouter from 'vue-router'; 5 | import Cookies from 'js-cookie'; 6 | import {routers, otherRouter, appRouter} from './router'; 7 | 8 | Vue.use(VueRouter); 9 | 10 | // 路由配置 11 | const RouterConfig = { 12 | // mode: 'history', 13 | routes: routers 14 | }; 15 | 16 | export const router = new VueRouter(RouterConfig); 17 | 18 | router.beforeEach((to, from, next) => { 19 | iView.LoadingBar.start(); 20 | Util.title(to.meta.title); 21 | if (Cookies.get('locking') === '1' && to.name !== 'locking') { // 判断当前是否是锁定状态 22 | next({ 23 | replace: true, 24 | name: 'locking' 25 | }); 26 | } else if (Cookies.get('locking') === '0' && to.name === 'locking') { 27 | next(false); 28 | } else { 29 | if (!Cookies.get('user') && to.name !== 'login') { // 判断是否已经登录且前往的页面不是登录页 30 | next({ 31 | name: 'login' 32 | }); 33 | } else if (Cookies.get('user') && to.name === 'login') { // 判断是否已经登录且前往的是登录页 34 | Util.title(); 35 | next({ 36 | name: 'home_index' 37 | }); 38 | } else { 39 | const curRouterObj = Util.getRouterObjByName([otherRouter, ...appRouter], to.name); 40 | if (curRouterObj && curRouterObj.access !== undefined) { // 需要判断权限的路由 41 | if (curRouterObj.access === parseInt(Cookies.get('access'))) { 42 | Util.toDefaultPage([otherRouter, ...appRouter], to.name, router, next); // 如果在地址栏输入的是一级菜单则默认打开其第一个二级菜单的页面 43 | } else { 44 | next({ 45 | replace: true, 46 | name: 'error-403' 47 | }); 48 | } 49 | } else { // 没有配置权限的路由, 直接通过 50 | Util.toDefaultPage([...routers], to.name, router, next); 51 | } 52 | } 53 | } 54 | }); 55 | 56 | router.afterEach((to) => { 57 | Util.openNewPage(router.app, to.name, to.params, to.query); 58 | iView.LoadingBar.finish(); 59 | window.scrollTo(0, 0); 60 | }); 61 | -------------------------------------------------------------------------------- /web/src/locale/locale.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'zh-CN': { 3 | home: '首页', 4 | switchLangTitle: '切换语言', 5 | international: '多语言切换', 6 | iviewComponentTitle: 'iview组件多语言切换', 7 | tip: '注:iview-admin只是为了示范如何实现多语言切换,所以只对当前页做了翻译。', 8 | intro: 'iview目前支持15种语言,只要你看得到的iview组件出现iview内置文字的地方都会根据你设置的语言类型自动切换对应的语言。', 9 | placeholderText: '请输入文字...', 10 | placeholderDate: '选择日期', 11 | name: '姓名', 12 | company: '公司', 13 | btnText: '点击查看模态框', 14 | modalText: '在这里你可以看到iview模态框默认的确定和取消按钮会切换语言', 15 | poptip: '国际化的气泡提示', 16 | showPoptipText: '点击显示气泡提示' 17 | }, 18 | 'zh-TW': { 19 | home: '首頁', 20 | switchLangTitle: '切換語言', 21 | international: '多語言切換', 22 | iviewComponentTitle: 'iview組件多語言切換', 23 | tip: '注:iview-admin只是為了示範如何實現多語言切換,所以只對當前頁做了翻譯。', 24 | intro: 'iview目前支持15種語言,只要你看得到的iview組件出現iview內置文字的地方都會根據你設置的語言類型自動切換對應的語言。', 25 | placeholderText: '請輸入文字...', 26 | placeholderDate: '選擇日期', 27 | name: '姓名', 28 | company: '公司', 29 | btnText: '點擊查看模態框', 30 | modalText: '在這裡你可以看到iview模態框默認的確定和取消按鈕會切換語言', 31 | poptip: '國際化的氣泡提示', 32 | showPoptipText: '點擊顯示氣泡提示' 33 | }, 34 | 'en-US': { 35 | home: 'home', 36 | switchLangTitle: 'Switch Lang', 37 | international: 'Switch Lang', 38 | tip: 'Note: iview-admin just to demonstrate how to achieve multi-language switching, so only the current page to do the translation.', 39 | iviewComponentTitle: 'The effect on the iview', 40 | intro: 'iview currently supports 15 languages, as long as you see the iview component where the text will be based on your language type automatically set the corresponding language.', 41 | placeholderText: 'please enter text...', 42 | placeholderDate: 'Select Date', 43 | name: 'name', 44 | company: 'company', 45 | btnText: 'Click to show modal', 46 | modalText: 'Here you can see the iview modal box by default to the OK and Cancel buttons that will switch the language', 47 | poptip: 'international poptip', 48 | showPoptipText: 'Click to show poptip' 49 | } 50 | }; 51 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/directionality/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('4', tinymce.util.Tools.resolve), g('1', ['4'], function (a) { return a('tinymce.PluginManager'); }), g('6', ['4'], function (a) { return a('tinymce.util.Tools'); }), g('5', ['6'], function (a) { var b = function (b, c) { var d, e = b.dom, f = b.selection.getSelectedBlocks(); f.length && (d = e.getAttrib(f[0], 'dir'), a.each(f, function (a) { e.getParent(a.parentNode, '*[dir="' + c + '"]', e.getRoot()) || e.setAttrib(a, 'dir', d !== c ? c : null); }), b.nodeChanged()); }; return {setDir: b}; }), g('2', ['5'], function (a) { var b = function (b) { b.addCommand('mceDirectionLTR', function () { a.setDir(b, 'ltr'); }), b.addCommand('mceDirectionRTL', function () { a.setDir(b, 'rtl'); }); }; return {register: b}; }), g('3', ['6'], function (a) { var b = function (b) { var c = []; return a.each('h1 h2 h3 h4 h5 h6 div p'.split(' '), function (a) { c.push(a + '[dir=' + b + ']'); }), c.join(','); }, c = function (a) { a.addButton('ltr', {title: 'Left to right', cmd: 'mceDirectionLTR', stateSelector: b('ltr')}), a.addButton('rtl', {title: 'Right to left', cmd: 'mceDirectionRTL', stateSelector: b('rtl')}); }; return {register: c}; }), g('0', ['1', '2', '3'], function (a, b, c) { return a.add('directionality', function (a) { b.register(a), c.register(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/home/map-data/get-style-json.js: -------------------------------------------------------------------------------- 1 | export default [{ 2 | 'featureType': 'water', 3 | 'elementType': 'all', 4 | 'stylers': { 5 | 'visibility': 'off' 6 | } 7 | }, { 8 | 'featureType': 'land', 9 | 'elementType': 'all', 10 | 'stylers': { 11 | 'color': 'red' 12 | } 13 | }, { 14 | 'featureType': 'railway', 15 | 'elementType': 'all', 16 | 'stylers': { 17 | 'visibility': 'off' 18 | } 19 | }, { 20 | 'featureType': 'highway', 21 | 'elementType': 'all', 22 | 'stylers': { 23 | 'color': '#fdfdfd' 24 | } 25 | }, { 26 | 'featureType': 'highway', 27 | 'elementType': 'labels', 28 | 'stylers': { 29 | 'visibility': 'off' 30 | } 31 | }, { 32 | 'featureType': 'arterial', 33 | 'elementType': 'geometry', 34 | 'stylers': { 35 | 'color': '#00ff00' 36 | } 37 | }, { 38 | 'featureType': 'arterial', 39 | 'elementType': 'geometry.fill', 40 | 'stylers': { 41 | 'color': '#fefefe' 42 | } 43 | }, { 44 | 'featureType': 'poi', 45 | 'elementType': 'all', 46 | 'stylers': { 47 | 'visibility': 'off' 48 | } 49 | }, { 50 | 'featureType': 'green', 51 | 'elementType': 'all', 52 | 'stylers': { 53 | 'visibility': 'off' 54 | } 55 | }, { 56 | 'featureType': 'subway', 57 | 'elementType': 'all', 58 | 'stylers': { 59 | 'visibility': 'off' 60 | } 61 | }, { 62 | 'featureType': 'manmade', 63 | 'elementType': 'all', 64 | 'stylers': { 65 | 'color': 'red' 66 | } 67 | }, { 68 | 'featureType': 'local', 69 | 'elementType': 'all', 70 | 'stylers': { 71 | 'color': 'red' 72 | } 73 | }, { 74 | 'featureType': 'arterial', 75 | 'elementType': 'labels', 76 | 'stylers': { 77 | 'visibility': 'off' 78 | } 79 | }, { 80 | 'featureType': 'boundary', 81 | 'elementType': 'all', 82 | 'stylers': { 83 | 'color': '#000' 84 | } 85 | }, { 86 | 'featureType': 'building', 87 | 'elementType': 'all', 88 | 'stylers': { 89 | 'color': '#d1d1d1' 90 | } 91 | }, { 92 | 'featureType': 'label', 93 | 'elementType': 'labels.text.fill', 94 | 'stylers': { 95 | 'color': '#999999' 96 | } 97 | }]; 98 | -------------------------------------------------------------------------------- /web/src/views/home/components/dataSourcePie.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 59 | -------------------------------------------------------------------------------- /web/src/views/advanced-router/component/shopping-info.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 19 | 20 | 75 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/filter/JWTAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.filter; 2 | import io.jsonwebtoken.Jwts; 3 | import org.springframework.security.authentication.AuthenticationManager; 4 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 5 | import org.springframework.security.core.context.SecurityContextHolder; 6 | import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; 7 | 8 | import javax.servlet.FilterChain; 9 | import javax.servlet.ServletException; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.util.ArrayList; 14 | 15 | /** 16 | * @author alex.yao 17 | * @version 1.0.0 18 | * @create 2018-01-10 10:42 19 | **/ 20 | public class JWTAuthenticationFilter extends BasicAuthenticationFilter { 21 | public JWTAuthenticationFilter(AuthenticationManager authManager) { 22 | super(authManager); 23 | } 24 | 25 | @Override 26 | protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException { 27 | String header = req.getHeader("Authorization"); 28 | 29 | if (header == null || !header.startsWith("Bearer ")) { 30 | chain.doFilter(req, res); 31 | return; 32 | } 33 | 34 | UsernamePasswordAuthenticationToken authentication = getAuthentication(req); 35 | 36 | SecurityContextHolder.getContext().setAuthentication(authentication); 37 | chain.doFilter(req, res); 38 | } 39 | 40 | private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { 41 | String token = request.getHeader("Authorization"); 42 | if (token != null) { 43 | // parse the token. 44 | String user = Jwts.parser() 45 | .setSigningKey("JwtSecret") 46 | .parseClaimsJws(token.replace("Bearer ", "")) 47 | .getBody() 48 | .getSubject(); 49 | 50 | if (user != null) { 51 | return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>()); 52 | } 53 | return null; 54 | } 55 | return null; 56 | } 57 | } -------------------------------------------------------------------------------- /web/src/views/home/components/userFlow.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 82 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/emoticons/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('3', tinymce.util.Tools.resolve), g('1', ['3'], function (a) { return a('tinymce.PluginManager'); }), g('5', ['3'], function (a) { return a('tinymce.util.Tools'); }), g('4', ['5'], function (a) { var b = [['cool', 'cry', 'embarassed', 'foot-in-mouth'], ['frown', 'innocent', 'kiss', 'laughing'], ['money-mouth', 'sealed', 'smile', 'surprised'], ['tongue-out', 'undecided', 'wink', 'yell']], c = function (c) { var d; return d = '', a.each(b, function (b) { d += '', a.each(b, function (a) { var b = c + '/img/smiley-' + a + '.gif'; d += ''; }), d += ''; }), d += '
'; }; return {getHtml: c}; }), g('2', ['4'], function (a) { var b = function (a, b, c) { a.insertContent(a.dom.createHTML('img', {src: b, alt: c})); }, c = function (c, d) { var e = a.getHtml(d); c.addButton('emoticons', {type: 'panelbutton', panel: {role: 'application', autohide: !0, html: e, onclick: function (a) { var d = c.dom.getParent(a.target, 'a'); d && (b(c, d.getAttribute('data-mce-url'), d.getAttribute('data-mce-alt')), this.hide()); }}, tooltip: 'Emoticons'}); }; return {register: c}; }), g('0', ['1', '2'], function (a, b) { return a.add('emoticons', function (a, c) { b.register(a, c); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/my-components/image-editor/image-editor.less: -------------------------------------------------------------------------------- 1 | .image-editor{ 2 | .cropper{ 3 | box-sizing: border-box; 4 | border: 1px solid #c3c3c3; 5 | width: 100%; 6 | height: 100%; 7 | img{ 8 | max-height: 100%; 9 | } 10 | } 11 | .fileinput{ 12 | display: none; 13 | } 14 | .filelabel{ 15 | display: block; 16 | padding: 6px 15px; 17 | background: #2d8cf0; 18 | display: inline-block; 19 | border: 1px solid #2d8cf0; 20 | border-radius: 4px; 21 | cursor: pointer; 22 | color: white; 23 | font-size: 12px; 24 | text-align: center; 25 | transition: all .2s; 26 | &:hover{ 27 | background: #5cadff; 28 | border: 1px solid #5cadff; 29 | transition: all .2s; 30 | } 31 | } 32 | &-con1{ 33 | height: 300px; 34 | &-preview-con{ 35 | width: 100% !important; 36 | height: 200px !important; 37 | border: 1px solid #c3c3c3; 38 | #preview1{ 39 | width: 100%; 40 | height: 100%; 41 | overflow: hidden; 42 | } 43 | } 44 | } 45 | &-con2{ 46 | height: 300px; 47 | p{ 48 | font-size: 14px; 49 | padding: 6px; 50 | border-bottom: 1px solid #c3c3c3; 51 | b{ 52 | display: inline-block; 53 | width: 80px; 54 | } 55 | } 56 | } 57 | &-con3{ 58 | height: 300px; 59 | .cropper3{ 60 | box-sizing: border-box; 61 | border: 1px solid #c3c3c3; 62 | width: 100%; 63 | height: 100%; 64 | img{ 65 | max-height: 100%; 66 | } 67 | } 68 | &-btn-box{ 69 | text-align: center; 70 | } 71 | .filelabel3{ 72 | width: 190px; 73 | box-sizing: border-box; 74 | } 75 | .crop3-btn-box{ 76 | text-align: center; 77 | } 78 | &-preview-con{ 79 | width: 100% !important; 80 | height: 300px !important; 81 | border: 1px solid #c3c3c3; 82 | #preview3{ 83 | width: 100%; 84 | height: 100%; 85 | overflow: hidden; 86 | } 87 | } 88 | } 89 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/nonbreaking/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('5', tinymce.util.Tools.resolve), g('1', ['5'], function (a) { return a('tinymce.PluginManager'); }), g('6', [], function () { var a = function (a, b) { for (var c = '', d = 0; d < b; d++)c += a; return c; }, b = function (a) { return !!a.plugins.visualchars && a.plugins.visualchars.isEnabled(); }, c = function (c, d) { var e = b(c) ? ' ' : ' '; c.insertContent(a(e, d)), c.dom.setAttrib(c.dom.select('span.mce-nbsp'), 'data-mce-bogus', '1'); }; return {insertNbsp: c}; }), g('2', ['6'], function (a) { var b = function (b) { b.addCommand('mceNonBreaking', function () { a.insertNbsp(b, 1); }); }; return {register: b}; }), g('7', [], function () { var a = function (a) { var b = a.getParam('nonbreaking_force_tab', 0); return typeof tabs === 'boolean' ? b === !0 ? 3 : 0 : b; }; return {getKeyboardSpaces: a}; }), g('3', ['7', '6'], function (a, b) { var c = function (c) { var d = a.getKeyboardSpaces(c); d > 0 && c.on('keydown', function (a) { if (a.keyCode === 9) { if (a.shiftKey) return; a.preventDefault(), b.insertNbsp(c, d); } }); }; return {setup: c}; }), g('4', [], function () { var a = function (a) { a.addButton('nonbreaking', {title: 'Nonbreaking space', cmd: 'mceNonBreaking'}), a.addMenuItem('nonbreaking', {text: 'Nonbreaking space', cmd: 'mceNonBreaking', context: 'insert'}); }; return {register: a}; }), g('0', ['1', '2', '3', '4'], function (a, b, c, d) { return a.add('nonbreaking', function (a) { b.register(a), d.register(a), c.setup(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/main-components/shrinkable-menu/components/sidebarMenu.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | 65 | -------------------------------------------------------------------------------- /web/src/views/main-components/shrinkable-menu/shrinkable-menu.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 24 | 25 | 84 | -------------------------------------------------------------------------------- /web/src/views/form/article-publish/article-publish.less: -------------------------------------------------------------------------------- 1 | .article-link-con{ 2 | height: 32px; 3 | width: 100%; 4 | } 5 | .fixed-link-enter{ 6 | opacity: 0; 7 | } 8 | .fixed-link-enter-active, .fixed-link-leave-active { 9 | transition: opacity .3s 10 | } 11 | .fixed-link-enter-to{ 12 | opacity: 1 13 | } 14 | .openness-radio-con{ 15 | margin-left: 40px; 16 | padding-left: 10px; 17 | height: 130px; 18 | border-left: 1px dashed #ebe9f3; 19 | overflow: hidden; 20 | } 21 | .publish-time-picker-con{ 22 | margin-left: 40px; 23 | padding-left: 10px; 24 | height: 100px; 25 | border-left: 1px dashed #ebe9f3; 26 | overflow: hidden; 27 | } 28 | .openness-con-enter{ 29 | height: 0; 30 | } 31 | .openness-con-enter-active, .openness-con-leave-active{ 32 | transition: height .3s; 33 | } 34 | .openness-con-enter-to{ 35 | height: 130px; 36 | } 37 | .openness-con-leave{ 38 | height: 130px; 39 | } 40 | .openness-con-leave-to{ 41 | height: 0; 42 | } 43 | .publish-button-con{ 44 | border-top: 1px solid #f3eff1; 45 | padding-top: 14px; 46 | } 47 | .publish-button{ 48 | float: right; 49 | margin-left: 10px; 50 | } 51 | .publish-time-enter{ 52 | height: 0; 53 | } 54 | .publish-time-enter-active, .publish-time-leave-active{ 55 | transition: height .3s; 56 | } 57 | .publish-time-enter-to{ 58 | height: 100px; 59 | } 60 | .publish-time-leave{ 61 | height: 100px; 62 | } 63 | .publish-time-leave-to{ 64 | height: 0; 65 | } 66 | .classification-con{ 67 | height: 200px; 68 | margin-top: -16px; 69 | border-left: 1px solid #dddee1; 70 | border-right: 1px solid #dddee1; 71 | border-bottom: 1px solid #dddee1; 72 | border-radius: 0 0 3px 3px; 73 | padding: 10px; 74 | overflow: auto; 75 | } 76 | .add-new-tag-con{ 77 | margin-top: 20px; 78 | border-top: 1px dashed #dbdddf; 79 | padding: 20px 0; 80 | height: 60px; 81 | overflow: hidden; 82 | } 83 | .add-new-tag-enter{ 84 | height: 0; 85 | margin-top: 0; 86 | padding: 0px 0; 87 | } 88 | .add-new-tag-enter-active, .add-new-tag-leave-active{ 89 | transition: all .3s; 90 | } 91 | .add-new-tag-enter-to{ 92 | height: 60px; 93 | margin-top: 20px; 94 | padding: 20px 0; 95 | } 96 | .add-new-tag-leave{ 97 | height: 60px; 98 | margin-top: 20px; 99 | padding: 20px 0; 100 | } 101 | .add-new-tag-leave-to{ 102 | height: 0; 103 | margin-top: 0; 104 | padding: 0px 0; 105 | } -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/config/WebSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.config; 2 | 3 | import com.marspie.framework.common.filter.JWTAuthenticationFilter; 4 | import com.marspie.framework.common.filter.JWTLoginFilter; 5 | import com.marspie.modules.sys.services.WebAuthenticationProvider; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.http.HttpMethod; 8 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 9 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 10 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 11 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 12 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 13 | import org.springframework.security.core.userdetails.UserDetailsService; 14 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 15 | /** 16 | * @author alex.yao 17 | * @version 1.0.0 18 | * @create 2018-01-10 10:44 19 | **/ 20 | @Configuration 21 | @EnableWebSecurity 22 | @EnableGlobalMethodSecurity(prePostEnabled = true) 23 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 24 | private UserDetailsService userDetailsService; 25 | private BCryptPasswordEncoder bCryptPasswordEncoder; 26 | 27 | public WebSecurityConfig(UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) { 28 | this.userDetailsService = userDetailsService; 29 | this.bCryptPasswordEncoder = bCryptPasswordEncoder; 30 | } 31 | 32 | @Override 33 | protected void configure(HttpSecurity http) throws Exception { 34 | http.cors().and().csrf().disable().authorizeRequests() 35 | .antMatchers("/**").permitAll() 36 | // 所有请求需要身份认证 37 | // .anyRequest().authenticated() 38 | .and() 39 | .addFilter(new JWTLoginFilter(authenticationManager())) 40 | .addFilter(new JWTAuthenticationFilter(authenticationManager())); 41 | } 42 | 43 | @Override 44 | public void configure(AuthenticationManagerBuilder auth) throws Exception { 45 | // auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); 46 | // 使用自定义身份验证组件 47 | auth.authenticationProvider(new WebAuthenticationProvider(userDetailsService,bCryptPasswordEncoder)); 48 | } 49 | } -------------------------------------------------------------------------------- /web/src/views/main-components/shrinkable-menu/components/sidebarMenuShrink.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 58 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/code/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('4', tinymce.util.Tools.resolve), g('1', ['4'], function (a) { return a('tinymce.PluginManager'); }), g('8', ['4'], function (a) { return a('tinymce.dom.DOMUtils'); }), g('6', ['8'], function (a) { var b = function (a) { return a.getParam('code_dialog_width', 600); }, c = function (b) { return b.getParam('code_dialog_height', Math.min(a.DOM.getViewPort().h - 200, 500)); }; return {getMinWidth: b, getMinHeight: c}; }), g('7', [], function () { var a = function (a, b) { a.focus(), a.undoManager.transact(function () { a.setContent(b); }), a.selection.setCursorLocation(), a.nodeChanged(); }, b = function (a) { return a.getContent({source_view: !0}); }; return {setContent: a, getContent: b}; }), g('5', ['6', '7'], function (a, b) { var c = function (c) { var d = a.getMinWidth(c), e = a.getMinHeight(c), f = c.windowManager.open({title: 'Source code', body: {type: 'textbox', name: 'code', multiline: !0, minWidth: d, minHeight: e, spellcheck: !1, style: 'direction: ltr; text-align: left'}, onSubmit: function (a) { b.setContent(c, a.data.code); }}); f.find('#code').value(b.getContent(c)); }; return {open: c}; }), g('2', ['5'], function (a) { var b = function (b) { b.addCommand('mceCodeEditor', function () { a.open(b); }); }; return {register: b}; }), g('3', ['5'], function (a) { var b = function (b) { b.addButton('code', {icon: 'code', tooltip: 'Source code', onclick: function () { a.open(b); }}), b.addMenuItem('code', {icon: 'code', text: 'Source code', onclick: function () { a.open(b); }}); }; return {register: b}; }), g('0', ['1', '2', '3'], function (a, b, c) { return a.add('code', function (a) { return b.register(a), c.register(a), {}; }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/main-components/lockscreen/lockscreen.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 66 | 67 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/colorpicker/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('3', tinymce.util.Tools.resolve), g('1', ['3'], function (a) { return a('tinymce.PluginManager'); }), g('4', ['3'], function (a) { return a('tinymce.util.Color'); }), g('2', ['4'], function (a) { var b = function (a, b) { a.find('#preview')[0].getEl().style.background = b; }, c = function (c, d) { var e = new a(d), f = e.toRgb(); c.fromJSON({r: f.r, g: f.g, b: f.b, hex: e.toHex().substr(1)}), b(c, e.toHex()); }, d = function (a, d, e) { var f = a.windowManager.open({title: 'Color', items: {type: 'container', layout: 'flex', direction: 'row', align: 'stretch', padding: 5, spacing: 10, items: [{type: 'colorpicker', value: e, onchange: function () { var a = this.rgb(); f && (f.find('#r').value(a.r), f.find('#g').value(a.g), f.find('#b').value(a.b), f.find('#hex').value(this.value().substr(1)), b(f, this.value())); }}, {type: 'form', padding: 0, labelGap: 5, defaults: {type: 'textbox', size: 7, value: '0', flex: 1, spellcheck: !1, onchange: function () { var a, b, d = f.find('colorpicker')[0]; return a = this.name(), b = this.value(), a === 'hex' ? (b = '#' + b, c(f, b), void d.value(b)) : (b = {r: f.find('#r').value(), g: f.find('#g').value(), b: f.find('#b').value()}, d.value(b), void c(f, b)); }}, items: [{name: 'r', label: 'R', autofocus: 1}, {name: 'g', label: 'G'}, {name: 'b', label: 'B'}, {name: 'hex', label: '#', value: '000000'}, {name: 'preview', type: 'container', border: 1}]}]}, onSubmit: function () { d('#' + f.toJSON().hex); }}); c(f, e); }; return {open: d}; }), g('0', ['1', '2'], function (a, b) { return a.add('colorpicker', function (a) { a.settings.color_picker_callback || (a.settings.color_picker_callback = function (c, d) { b.open(a, c, d); }); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/error-page/403.less: -------------------------------------------------------------------------------- 1 | @keyframes error403animation { 2 | 0% { 3 | transform: rotateZ(0deg); 4 | } 5 | 40% { 6 | transform: rotateZ(-20deg); 7 | } 8 | 45% { 9 | transform: rotateZ(-15deg); 10 | } 11 | 50% { 12 | transform: rotateZ(-20deg); 13 | } 14 | 55% { 15 | transform: rotateZ(-15deg); 16 | } 17 | 60% { 18 | transform: rotateZ(-20deg); 19 | } 20 | 100% { 21 | transform: rotateZ(0deg); 22 | } 23 | } 24 | .error403{ 25 | &-body-con{ 26 | width: 700px; 27 | height: 500px; 28 | position: absolute; 29 | left: 50%; 30 | top: 50%; 31 | transform: translate(-50%,-50%); 32 | &-title{ 33 | text-align: center; 34 | font-size: 240px; 35 | font-weight: 700; 36 | color: #2d8cf0; 37 | height: 260px; 38 | line-height: 260px; 39 | margin-top: 40px; 40 | .error403-0-span{ 41 | display: inline-block; 42 | position: relative; 43 | width: 170px; 44 | height: 170px; 45 | border-radius: 50%; 46 | border: 20px solid #ed3f14; 47 | color: #ed3f14; 48 | margin-right: 10px; 49 | i{ 50 | display: inline-block; 51 | font-size: 120px; 52 | position: absolute; 53 | left: 50%; 54 | top: 50%; 55 | transform: translate(-50%,-50%); 56 | } 57 | } 58 | .error403-key-span{ 59 | display: inline-block; 60 | position: relative; 61 | width: 100px; 62 | height: 190px; 63 | border-radius: 50%; 64 | margin-right: 10px; 65 | i{ 66 | display: inline-block; 67 | font-size: 190px; 68 | position: absolute; 69 | left: 20px; 70 | transform: translate(-50%,-60%); 71 | transform-origin: center bottom; 72 | animation: error403animation 2.8s ease 0s infinite; 73 | } 74 | } 75 | } 76 | &-message{ 77 | display: block; 78 | text-align: center; 79 | font-size: 30px; 80 | font-weight: 500; 81 | letter-spacing: 4px; 82 | color: #dddde2; 83 | } 84 | } 85 | &-btn-con{ 86 | text-align: center; 87 | padding: 20px 0; 88 | margin-bottom: 40px; 89 | } 90 | } -------------------------------------------------------------------------------- /web/src/views/access/access.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 44 | 45 | 74 | 75 | 78 | -------------------------------------------------------------------------------- /web/src/views/home/components/map.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /web/src/views/home/components/visiteVolume.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 77 | -------------------------------------------------------------------------------- /web/src/views/main-components/fullscreen.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 75 | -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/modules/sys/services/WebAuthenticationProvider.java: -------------------------------------------------------------------------------- 1 | package com.marspie.modules.sys.services; 2 | 3 | import com.marspie.modules.sys.entity.UserEntity; 4 | import org.springframework.security.authentication.AuthenticationProvider; 5 | import org.springframework.security.authentication.BadCredentialsException; 6 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 7 | import org.springframework.security.core.Authentication; 8 | import org.springframework.security.core.AuthenticationException; 9 | import org.springframework.security.core.GrantedAuthority; 10 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 11 | import org.springframework.security.core.userdetails.UserDetails; 12 | import org.springframework.security.core.userdetails.UserDetailsService; 13 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 14 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 15 | import org.springframework.util.DigestUtils; 16 | 17 | import java.util.ArrayList; 18 | 19 | /** 20 | * 自定义身份认证组件 21 | * @author alex.yao 22 | * @version 1.0.0 23 | * @create 2018-01-10 13:36 24 | **/ 25 | public class WebAuthenticationProvider implements AuthenticationProvider { 26 | 27 | private UserDetailsService userDetailsService; 28 | 29 | private BCryptPasswordEncoder bCryptPasswordEncoder; 30 | 31 | public WebAuthenticationProvider(UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder){ 32 | this.userDetailsService = userDetailsService; 33 | this.bCryptPasswordEncoder = bCryptPasswordEncoder; 34 | } 35 | 36 | @Override 37 | public Authentication authenticate(Authentication authentication) throws AuthenticationException { 38 | // 获取认证的用户名 & 密码 39 | String name = authentication.getName(); 40 | String password = authentication.getCredentials().toString(); 41 | 42 | // 认证逻辑 43 | UserDetails userDetails = userDetailsService.loadUserByUsername(name); 44 | if(null != userDetails){ 45 | String encodePassword = DigestUtils.md5DigestAsHex((password).getBytes()); 46 | if(userDetails.getPassword().equals(encodePassword)){ 47 | // 这里设置权限和角色 48 | ArrayList authorities = new ArrayList(); 49 | authorities.add( new SimpleGrantedAuthority("ROLE_ADMIN") ); 50 | // 生成令牌 51 | Authentication auth = new UsernamePasswordAuthenticationToken(name, password, authorities); 52 | return auth; 53 | }else { 54 | throw new BadCredentialsException("密码错误~"); 55 | } 56 | }else { 57 | throw new UsernameNotFoundException("用户不存在~"); 58 | } 59 | } 60 | 61 | @Override 62 | public boolean supports(Class authentication) { 63 | return authentication.equals(UsernamePasswordAuthenticationToken.class); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /web/src/views/advanced-router/mutative-router.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 22 | 23 | 93 | -------------------------------------------------------------------------------- /web/src/views/main-components/lockscreen/components/unlock.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | 81 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/anchor/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('5', tinymce.util.Tools.resolve), g('1', ['5'], function (a) { return a('tinymce.PluginManager'); }), g('7', [], function () { var a = function (a) { return /^[A-Za-z][A-Za-z0-9\-:._]*$/.test(a); }, b = function (a) { var b = a.selection.getNode(), c = b.tagName === 'A' && a.dom.getAttrib(b, 'href') === ''; return c ? b.id || b.name : ''; }, c = function (a, b) { var c = a.selection.getNode(), d = c.tagName === 'A' && a.dom.getAttrib(c, 'href') === ''; d ? (c.removeAttribute('name'), c.id = b) : (a.focus(), a.selection.collapse(!0), a.execCommand('mceInsertContent', !1, a.dom.createHTML('a', {id: b}))); }; return {isValidId: a, getId: b, insert: c}; }), g('6', ['7'], function (a) { var b = function (b, c) { return a.isValidId(c) ? (a.insert(b, c), !1) : (b.windowManager.alert('Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.'), !0); }, c = function (c) { var d = a.getId(c); c.windowManager.open({title: 'Anchor', body: {type: 'textbox', name: 'id', size: 40, label: 'Id', value: d}, onsubmit: function (a) { var d = a.data.id; b(c, d) && a.preventDefault(); }}); }; return {open: c}; }), g('2', ['6'], function (a) { var b = function (b) { b.addCommand('mceAnchor', function () { a.open(b); }); }; return {register: b}; }), g('3', [], function () { var a = function (a) { return !a.attr('href') && (a.attr('id') || a.attr('name')) && !a.firstChild; }, b = function (b) { return function (c) { for (var d = 0; d < c.length; d++)a(c[d]) && c[d].attr('contenteditable', b); }; }, c = function (a) { a.on('PreInit', function () { a.parser.addNodeFilter('a', b('false')), a.serializer.addNodeFilter('a', b(null)); }); }; return {setup: c}; }), g('4', [], function () { var a = function (a) { a.addButton('anchor', {icon: 'anchor', tooltip: 'Anchor', cmd: 'mceAnchor', stateSelector: 'a:not([href])'}), a.addMenuItem('anchor', {icon: 'anchor', text: 'Anchor', context: 'insert', cmd: 'mceAnchor'}); }; return {register: a}; }), g('0', ['1', '2', '3', '4'], function (a, b, c, d) { return a.add('anchor', function (a) { c.setup(a), b.register(a), d.register(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/save/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('4', tinymce.util.Tools.resolve), g('1', ['4'], function (a) { return a('tinymce.PluginManager'); }), g('7', ['4'], function (a) { return a('tinymce.dom.DOMUtils'); }), g('8', ['4'], function (a) { return a('tinymce.util.Tools'); }), g('6', [], function () { var a = function (a) { return a.getParam('save_enablewhendirty', !0); }, b = function (a) { return !!a.getParam('save_onsavecallback'); }, c = function (a) { return !!a.getParam('save_oncancelcallback'); }; return {enableWhenDirty: a, hasOnSaveCallback: b, hasOnCancelCallback: c}; }), g('5', ['7', '8', '6'], function (a, b, c) { var d = function (a, b) { a.notificationManager.open({text: a.translate(b), type: 'error'}); }, e = function (b) { var e; if (e = a.DOM.getParent(b.id, 'form'), !c.enableWhenDirty(b) || b.isDirty()) return b.save(), c.hasOnSaveCallback(b) ? (b.execCallback('save_onsavecallback', b), void b.nodeChanged()) : void (e ? (b.setDirty(!1), e.onsubmit && !e.onsubmit() || (typeof e.submit === 'function' ? e.submit() : d(b, 'Error: Form submit field collision.')), b.nodeChanged()) : d(b, 'Error: No form element found.')); }, f = function (a) { var d = b.trim(a.startContent); return c.hasOnCancelCallback(a) ? void a.execCallback('save_oncancelcallback', a) : (a.setContent(d), a.undoManager.clear(), void a.nodeChanged()); }; return {save: e, cancel: f}; }), g('2', ['5'], function (a) { var b = function (b) { b.addCommand('mceSave', function () { a.save(b); }), b.addCommand('mceCancel', function () { a.cancel(b); }); }; return {register: b}; }), g('3', ['6'], function (a) { var b = function (b) { return function (c) { var d = c.control; b.on('nodeChange dirty', function () { d.disabled(a.enableWhenDirty(b) && !b.isDirty()); }); }; }, c = function (a) { a.addButton('save', {icon: 'save', text: 'Save', cmd: 'mceSave', disabled: !0, onPostRender: b(a)}), a.addButton('cancel', {text: 'Cancel', icon: !1, cmd: 'mceCancel', disabled: !0, onPostRender: b(a)}), a.addShortcut('Meta+S', '', 'mceSave'); }; return {register: c}; }), g('0', ['1', '2', '3'], function (a, b, c) { return a.add('save', function (a) { c.register(a), b.register(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "iview-admin", 3 | "version": "1.3.1", 4 | "description": "a management bases on iview", 5 | "main": "index.js", 6 | "scripts": { 7 | "init": "webpack --progress --config script/webpack.dev.config.js", 8 | "dev": "webpack-dev-server --port 3000 --content-base ./ --open --inline --hot --compress --config script/webpack.dev.config.js", 9 | "build": "webpack --progress --hide-modules --config script/webpack.prod.config.js", 10 | "lint": "eslint --fix --ext .js,.vue src", 11 | "test": "npm run lint" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/iview/iview-admin.git" 16 | }, 17 | "author": "Lison", 18 | "license": "MIT", 19 | "dependencies": { 20 | "area-data": "^1.0.0", 21 | "axios": "^0.17.1", 22 | "clipboard": "^1.7.1", 23 | "countup": "^1.8.2", 24 | "cropperjs": "^1.2.2", 25 | "echarts": "^3.8.5", 26 | "html2canvas": "^0.5.0-beta4", 27 | "iview": "^2.8.0", 28 | "iview-area": "^1.5.14", 29 | "js-cookie": "^2.2.0", 30 | "rasterizehtml": "^1.2.4", 31 | "simplemde": "^1.11.2", 32 | "sortablejs": "^1.7.0", 33 | "tinymce": "^4.7.4", 34 | "vue": "^2.5.13", 35 | "vue-router": "^3.0.1", 36 | "vue-virtual-scroller": "^0.10.6", 37 | "vuex": "^3.0.1" 38 | }, 39 | "devDependencies": { 40 | "autoprefixer-loader": "^3.2.0", 41 | "babel": "^6.23.0", 42 | "babel-core": "^6.23.1", 43 | "babel-eslint": "^8.2.1", 44 | "babel-loader": "^7.1.2", 45 | "babel-plugin-syntax-dynamic-import": "^6.18.0", 46 | "babel-plugin-transform-runtime": "^6.12.0", 47 | "babel-preset-env": "^1.6.1", 48 | "babel-preset-es2015": "^6.9.0", 49 | "babel-preset-stage-3": "^6.24.1", 50 | "babel-runtime": "^6.11.6", 51 | "clean-webpack-plugin": "^0.1.17", 52 | "copy-webpack-plugin": "^4.3.1", 53 | "css-hot-loader": "^1.3.5", 54 | "css-loader": "^0.28.8", 55 | "ejs-loader": "^0.3.0", 56 | "eslint": "^4.15.0", 57 | "eslint-config-google": "^0.9.1", 58 | "eslint-config-standard": "^10.2.1", 59 | "eslint-plugin-html": "^4.0.1", 60 | "eslint-plugin-import": "^2.8.0", 61 | "eslint-plugin-node": "^5.2.1", 62 | "eslint-plugin-promise": "^3.6.0", 63 | "eslint-plugin-standard": "^3.0.1", 64 | "extract-text-webpack-plugin": "^3.0.2", 65 | "file-loader": "^1.1.6", 66 | "happypack": "^4.0.0", 67 | "html-loader": "^0.5.4", 68 | "html-webpack-plugin": "^2.28.0", 69 | "less": "^2.7.3", 70 | "less-loader": "^4.0.5", 71 | "semver": "^5.4.1", 72 | "style-loader": "^0.19.1", 73 | "unsupported": "^1.1.0", 74 | "url-loader": "^0.6.2", 75 | "vue-hot-reload-api": "^2.2.4", 76 | "vue-html-loader": "^1.2.3", 77 | "vue-i18n": "^5.0.3", 78 | "vue-loader": "^13.7.0", 79 | "vue-style-loader": "^3.0.3", 80 | "vue-template-compiler": "^2.5.13", 81 | "webpack": "^3.10.0", 82 | "webpack-dev-server": "^2.10.1", 83 | "webpack-merge": "^4.1.1", 84 | "webpack-uglify-parallel": "^0.1.4" 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/text-editor.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 17 | 74 | 75 | 78 | -------------------------------------------------------------------------------- /web/script/webpack.base.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const os = require('os'); 3 | const webpack = require('webpack'); 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 5 | const HappyPack = require('happypack'); 6 | var happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }); 7 | function resolve (dir) { 8 | return path.join(__dirname, dir); 9 | } 10 | module.exports = { 11 | entry: { 12 | main: '@/main', 13 | 'vender-base': '@/vendors/vendors.base.js', 14 | 'vender-exten': '@/vendors/vendors.exten.js' 15 | }, 16 | output: { 17 | path: path.resolve(__dirname, '../build/resources/main/static/dist') 18 | }, 19 | module: { 20 | rules: [ 21 | { 22 | test: /\.vue$/, 23 | loader: 'vue-loader', 24 | options: { 25 | loaders: { 26 | css: 'vue-style-loader!css-loader', 27 | less: 'vue-style-loader!css-loader!less-loader' 28 | }, 29 | postLoaders: { 30 | html: 'babel-loader' 31 | } 32 | } 33 | }, 34 | { 35 | test: /iview\/.*?js$/, 36 | loader: 'happypack/loader?id=happybabel', 37 | exclude: /node_modules/ 38 | }, 39 | { 40 | test: /\.js$/, 41 | loader: 'happypack/loader?id=happybabel', 42 | exclude: /node_modules/ 43 | }, 44 | { 45 | test: /\.js[x]?$/, 46 | include: [resolve('src')], 47 | exclude: /node_modules/, 48 | loader: 'happypack/loader?id=happybabel' 49 | }, 50 | { 51 | test: /\.css$/, 52 | use: ExtractTextPlugin.extract({ 53 | use: ['css-loader?minimize', 'autoprefixer-loader'], 54 | fallback: 'style-loader' 55 | }) 56 | }, 57 | { 58 | test: /\.less$/, 59 | use: ExtractTextPlugin.extract({ 60 | use: ['css-loader?minimize','autoprefixer-loader', 'less-loader'], 61 | fallback: 'style-loader' 62 | }), 63 | }, 64 | { 65 | test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/, 66 | loader: 'url-loader?limit=1024' 67 | }, 68 | { 69 | test: /\.(html|tpl)$/, 70 | loader: 'html-loader' 71 | } 72 | ] 73 | }, 74 | plugins: [ 75 | new HappyPack({ 76 | id: 'happybabel', 77 | loaders: ['babel-loader'], 78 | threadPool: happyThreadPool, 79 | verbose: true 80 | }) 81 | ], 82 | resolve: { 83 | extensions: ['.js', '.vue'], 84 | alias: { 85 | 'vue': 'vue/dist/vue.esm.js', 86 | '@': resolve('../src'), 87 | } 88 | } 89 | }; -------------------------------------------------------------------------------- /server/src/main/java/com/marspie/framework/common/filter/JWTLoginFilter.java: -------------------------------------------------------------------------------- 1 | package com.marspie.framework.common.filter; 2 | import com.fasterxml.jackson.databind.ObjectMapper; 3 | import com.marspie.modules.sys.entity.UserEntity; 4 | import io.jsonwebtoken.Jwts; 5 | import io.jsonwebtoken.SignatureAlgorithm; 6 | import org.springframework.security.authentication.AuthenticationManager; 7 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 8 | import org.springframework.security.core.Authentication; 9 | import org.springframework.security.core.AuthenticationException; 10 | import org.springframework.security.core.userdetails.User; 11 | import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; 12 | 13 | import javax.servlet.FilterChain; 14 | import javax.servlet.ServletException; 15 | import javax.servlet.http.HttpServletRequest; 16 | import javax.servlet.http.HttpServletResponse; 17 | import java.io.IOException; 18 | import java.util.ArrayList; 19 | import java.util.Date; 20 | 21 | /** 22 | * @author alex.yao 23 | * @version 1.0.0 24 | * @create 2018-01-10 10:35 25 | **/ 26 | 27 | public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter { 28 | private AuthenticationManager authenticationManager; 29 | 30 | public JWTLoginFilter(AuthenticationManager authenticationManager) { 31 | this.authenticationManager = authenticationManager; 32 | } 33 | 34 | /** 35 | * 接收并解析用户凭证 36 | * @param req 37 | * @param res 38 | * @return 39 | * @throws AuthenticationException 40 | */ 41 | @Override 42 | public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException { 43 | try { 44 | UserEntity user = new ObjectMapper().readValue(req.getInputStream(), UserEntity.class); 45 | return authenticationManager.authenticate( 46 | new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), new ArrayList<>()) 47 | ); 48 | } catch (IOException e) { 49 | throw new RuntimeException(e); 50 | } 51 | } 52 | 53 | /** 54 | * 用户成功登录后,这个方法会被调用,生成token 55 | * @param req 56 | * @param res 57 | * @param chain 58 | * @param auth 59 | * @throws IOException 60 | * @throws ServletException 61 | */ 62 | @Override 63 | protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, 64 | Authentication auth) throws IOException, ServletException { 65 | String token = Jwts.builder() 66 | .setSubject(auth.getName()) 67 | .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 24 * 1000)) 68 | .signWith(SignatureAlgorithm.HS512, "JwtSecret") //采用什么算法是可以自己选择的,不一定非要采用HS512 69 | .compact(); 70 | res.addHeader("Authorization", "Bearer " + token); 71 | res.getWriter().write("{'code':0, 'token': " + token + "}"); 72 | return; 73 | } 74 | } -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/noneditable/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('3', tinymce.util.Tools.resolve), g('1', ['3'], function (a) { return a('tinymce.PluginManager'); }), g('4', ['3'], function (a) { return a('tinymce.util.Tools'); }), g('5', [], function () { var a = function (a) { return a.getParam('noneditable_noneditable_class', 'mceNonEditable'); }, b = function (a) { return a.getParam('noneditable_editable_class', 'mceEditable'); }, c = function (a) { var b = a.getParam('noneditable_regexp', []); return b && b.constructor === RegExp ? [b] : b; }; return {getNonEditableClass: a, getEditableClass: b, getNonEditableRegExps: c}; }), g('2', ['4', '5'], function (a, b) { var c = function (a) { return function (b) { return (' ' + b.attr('class') + ' ').indexOf(a) !== -1; }; }, d = function (a, b, c) { return function (d) { var e = arguments, f = e[e.length - 2], g = f > 0 ? b.charAt(f - 1) : ''; if (g === '"') return d; if (g === '>') { var h = b.lastIndexOf('<', f); if (h !== -1) { var i = b.substring(h, f); if (i.indexOf('contenteditable="false"') !== -1) return d; } } return '' + a.dom.encode(typeof e[1] === 'string' ? e[1] : e[0]) + ''; }; }, e = function (a, c, e) { var f = c.length, g = e.content; if (e.format !== 'raw') { for (;f--;)g = g.replace(c[f], d(a, g, b.getNonEditableClass(a))); e.content = g; } }, f = function (d) { var f, g, h = 'contenteditable'; f = ' ' + a.trim(b.getEditableClass(d)) + ' ', g = ' ' + a.trim(b.getNonEditableClass(d)) + ' '; var i = c(f), j = c(g), k = b.getNonEditableRegExps(d); d.on('PreInit', function () { k.length > 0 && d.on('BeforeSetContent', function (a) { e(d, k, a); }), d.parser.addAttributeFilter('class', function (a) { for (var b, c = a.length; c--;)b = a[c], i(b) ? b.attr(h, 'true') : j(b) && b.attr(h, 'false'); }), d.serializer.addAttributeFilter(h, function (a) { for (var b, c = a.length; c--;)b = a[c], (i(b) || j(b)) && (k.length > 0 && b.attr('data-mce-content') ? (b.name = '#text', b.type = 3, b.raw = !0, b.value = b.attr('data-mce-content')) : b.attr(h, null)); }); }); }; return {setup: f}; }), g('0', ['1', '2'], function (a, b) { return a.add('noneditable', function (a) { b.setup(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/codesample/css/prism.css: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ 2 | /** 3 | * prism.js default theme for JavaScript, CSS and HTML 4 | * Based on dabblet (http://dabblet.com) 5 | * @author Lea Verou 6 | */ 7 | 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: black; 11 | text-shadow: 0 1px white; 12 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 13 | direction: ltr; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | word-wrap: normal; 19 | line-height: 1.5; 20 | 21 | -moz-tab-size: 4; 22 | -o-tab-size: 4; 23 | tab-size: 4; 24 | 25 | -webkit-hyphens: none; 26 | -moz-hyphens: none; 27 | -ms-hyphens: none; 28 | hyphens: none; 29 | } 30 | 31 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 32 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 33 | text-shadow: none; 34 | background: #b3d4fc; 35 | } 36 | 37 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 38 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 39 | text-shadow: none; 40 | background: #b3d4fc; 41 | } 42 | 43 | @media print { 44 | code[class*="language-"], 45 | pre[class*="language-"] { 46 | text-shadow: none; 47 | } 48 | } 49 | 50 | /* Code blocks */ 51 | pre[class*="language-"] { 52 | padding: 1em; 53 | margin: .5em 0; 54 | overflow: auto; 55 | } 56 | 57 | :not(pre) > code[class*="language-"], 58 | pre[class*="language-"] { 59 | background: #f5f2f0; 60 | } 61 | 62 | /* Inline code */ 63 | :not(pre) > code[class*="language-"] { 64 | padding: .1em; 65 | border-radius: .3em; 66 | } 67 | 68 | .token.comment, 69 | .token.prolog, 70 | .token.doctype, 71 | .token.cdata { 72 | color: slategray; 73 | } 74 | 75 | .token.punctuation { 76 | color: #999; 77 | } 78 | 79 | .namespace { 80 | opacity: .7; 81 | } 82 | 83 | .token.property, 84 | .token.tag, 85 | .token.boolean, 86 | .token.number, 87 | .token.constant, 88 | .token.symbol, 89 | .token.deleted { 90 | color: #905; 91 | } 92 | 93 | .token.selector, 94 | .token.attr-name, 95 | .token.string, 96 | .token.char, 97 | .token.builtin, 98 | .token.inserted { 99 | color: #690; 100 | } 101 | 102 | .token.operator, 103 | .token.entity, 104 | .token.url, 105 | .language-css .token.string, 106 | .style .token.string { 107 | color: #a67f59; 108 | background: hsla(0, 0%, 100%, .5); 109 | } 110 | 111 | .token.atrule, 112 | .token.attr-value, 113 | .token.keyword { 114 | color: #07a; 115 | } 116 | 117 | .token.function { 118 | color: #DD4A68; 119 | } 120 | 121 | .token.regex, 122 | .token.important, 123 | .token.variable { 124 | color: #e90; 125 | } 126 | 127 | .token.important, 128 | .token.bold { 129 | font-weight: bold; 130 | } 131 | .token.italic { 132 | font-style: italic; 133 | } 134 | 135 | .token.entity { 136 | cursor: help; 137 | } 138 | 139 | -------------------------------------------------------------------------------- /web/src/views/login.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 39 | 40 | 80 | 81 | 84 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/pagebreak/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('7', tinymce.util.Tools.resolve), g('1', ['7'], function (a) { return a('tinymce.Env'); }), g('2', ['7'], function (a) { return a('tinymce.PluginManager'); }), g('8', [], function () { var a = function (a) { return a.getParam('pagebreak_separator', ''); }, b = function (a) { return a.getParam('pagebreak_split_block', !1); }; return {getSeparatorHtml: a, shouldSplitBlock: b}; }), g('4', ['1', '8'], function (a, b) { var c = function () { return 'mce-pagebreak'; }, d = function () { return ''; }, e = function (a) { var c = b.getSeparatorHtml(a), e = new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function (a) { return '\\' + a; }), 'gi'); a.on('BeforeSetContent', function (a) { a.content = a.content.replace(e, d()); }), a.on('PreInit', function () { a.serializer.addNodeFilter('img', function (d) { for (var e, f, g = d.length; g--;) if (e = d[g], f = e.attr('class'), f && f.indexOf('mce-pagebreak') !== -1) { var h = e.parent; if (a.schema.getBlockElements()[h.name] && b.shouldSplitBlock(a)) { h.type = 3, h.value = c, h.raw = !0, e.remove(); continue; }e.type = 3, e.value = c, e.raw = !0; } }); }); }; return {setup: e, getPlaceholderHtml: d, getPageBreakClass: c}; }), g('3', ['4'], function (a) { var b = function (b) { b.addCommand('mcePageBreak', function () { b.settings.pagebreak_split_block ? b.insertContent('

' + a.getPlaceholderHtml() + '

') : b.insertContent(a.getPlaceholderHtml()); }); }; return {register: b}; }), g('5', ['4'], function (a) { var b = function (b) { b.on('ResolveName', function (c) { c.target.nodeName === 'IMG' && b.dom.hasClass(c.target, a.getPageBreakClass()) && (c.name = 'pagebreak'); }); }; return {setup: b}; }), g('6', [], function () { var a = function (a) { a.addButton('pagebreak', {title: 'Page break', cmd: 'mcePageBreak'}), a.addMenuItem('pagebreak', {text: 'Page break', icon: 'pagebreak', cmd: 'mcePageBreak', context: 'insert'}); }; return {register: a}; }), g('0', ['1', '2', '3', '4', '5', '6'], function (a, b, c, d, e, f) { return b.add('pagebreak', function (a) { c.register(a), f.register(a), d.setup(a), e.setup(a); }), function () {}; }), d('0')(); }()); 2 | -------------------------------------------------------------------------------- /web/src/views/my-components/text-editor/tinymce/plugins/tabfocus/plugin.min.js: -------------------------------------------------------------------------------- 1 | !(function () { var a = {}, b = function (b) { for (var c = a[b], e = c.deps, f = c.defn, g = e.length, h = new Array(g), i = 0; i < g; ++i)h[i] = d(e[i]); var j = f.apply(null, h); if (void 0 === j) throw 'module [' + b + '] returned undefined'; c.instance = j; }, c = function (b, c, d) { if (typeof b !== 'string') throw 'module id must be a string'; if (void 0 === c) throw 'no dependencies for ' + b; if (void 0 === d) throw 'no definition function for ' + b; a[b] = {deps: c, defn: d, instance: void 0}; }, d = function (c) { var d = a[c]; if (void 0 === d) throw 'module [' + c + '] was undefined'; return void 0 === d.instance && b(c), d.instance; }, e = function (a, b) { for (var c = a.length, e = new Array(c), f = 0; f < c; ++f)e[f] = d(a[f]); b.apply(null, e); }, f = {}; f.bolt = {module: {api: {define: c, require: e, demand: d}}}; var g = c, h = function (a, b) { g(a, [], function () { return b; }); }; h('3', tinymce.util.Tools.resolve), g('1', ['3'], function (a) { return a('tinymce.PluginManager'); }), h('4', window), g('5', ['3'], function (a) { return a('tinymce.dom.DOMUtils'); }), g('6', ['3'], function (a) { return a('tinymce.EditorManager'); }), g('7', ['3'], function (a) { return a('tinymce.Env'); }), g('8', ['3'], function (a) { return a('tinymce.util.Delay'); }), g('9', ['3'], function (a) { return a('tinymce.util.Tools'); }), g('a', ['3'], function (a) { return a('tinymce.util.VK'); }), g('b', [], function () { var a = function (a) { return a.getParam('tabfocus_elements', ':prev,:next'); }, b = function (b) { return b.getParam('tab_focus', a(b)); }; return {getTabFocus: b}; }), g('2', ['4', '5', '6', '7', '8', '9', 'a', 'b'], function (a, b, c, d, e, f, g, h) { var i = b.DOM, j = function (a) { a.keyCode !== g.TAB || a.ctrlKey || a.altKey || a.metaKey || a.preventDefault(); }, k = function (b) { function k (j) { function k (a) { function d (a) { return a.nodeName === 'BODY' || a.type !== 'hidden' && a.style.display !== 'none' && a.style.visibility !== 'hidden' && d(a.parentNode); } function e (a) { return /INPUT|TEXTAREA|BUTTON/.test(a.tagName) && c.get(j.id) && a.tabIndex !== -1 && d(a); } if (m = i.select(':input:enabled,*[tabindex]:not(iframe)'), f.each(m, function (a, c) { if (a.id === b.id) return l = c, !1; }), a > 0) { for (o = l + 1; o < m.length; o++) if (e(m[o])) return m[o]; } else for (o = l - 1; o >= 0; o--) if (e(m[o])) return m[o]; return null; } var l, m, n, o; if (!(j.keyCode !== g.TAB || j.ctrlKey || j.altKey || j.metaKey || j.isDefaultPrevented()) && (n = f.explode(h.getTabFocus(b)), n.length === 1 && (n[1] = n[0], n[0] = ':prev'), m = j.shiftKey ? n[0] === ':prev' ? k(-1) : i.get(n[0]) : n[1] === ':next' ? k(1) : i.get(n[1]))) { var p = c.get(m.id || m.name); m.id && p ? p.focus() : e.setTimeout(function () { d.webkit || a.focus(), m.focus(); }, 10), j.preventDefault(); } }b.on('init', function () { b.inline && i.setAttrib(b.getBody(), 'tabIndex', null), b.on('keyup', j), d.gecko ? b.on('keypress keydown', k) : b.on('keydown', k); }); }; return {setup: k}; }), g('0', ['1', '2'], function (a, b) { return a.add('tabfocus', function (a) { b.setup(a); }), function () {}; }), d('0')(); }()); 2 | --------------------------------------------------------------------------------