commit 8613cb1140130d45fd15e217332f15dfd506a96f
Author: Zheng Jie <201507802@qq.com>
Date: Mon Jun 26 15:10:45 2023 +0800
eladmin mybatis-plus 发布
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ca38718
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "{}" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+ Copyright 2019-2020 Zheng Jie
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ad80a4d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,111 @@
+
ELADMIN 后台管理系统
+
+#### 项目简介
+一个基于 Spring Boot 2.1.0 、 Mybatis-Plus、 JWT、Spring Security、Redis、Vue的前后端分离的后台管理系统
+
+**开发文档:** [https://eladmin.vip](https://eladmin.vip)
+
+**体验地址:** [https://eladmin.vip/demo](https://eladmin.vip/demo)
+
+**账号密码:** `admin / 123456`
+
+#### 项目目录
+
+```
+- sql 项目数据库文件
+- eladmin 项目后端源码
+- eladmin-mp 项目前端源码
+```
+
+#### 项目源码
+
+| github | gitee |
+|--------------------------------------| --- |
+| https://github.com/elunez/eladmin-mp | https://gitee.com/elunez/eladmin-mp |
+
+#### 赞助商 | Sponsor
+
+
+
+
+
+#### 主要特性
+- 使用最新技术栈,社区资源丰富。
+- 高效率开发,代码生成器可一键生成前后端代码
+- 支持数据字典,可方便地对一些状态进行管理
+- 支持接口限流,避免恶意请求导致服务层压力过大
+- 支持接口级别的功能权限与数据权限,可自定义操作
+- 自定义权限注解与匿名接口注解,可快速对接口拦截与放行
+- 对一些常用地前端组件封装:表格数据请求、数据字典等
+- 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断
+- 支持在线用户管理与服务器性能监控,支持限制单用户登录
+- 支持运维管理,可方便地对远程服务器的应用进行部署与管理
+
+#### 系统功能
+- 用户管理:提供用户的相关配置,新增用户后,默认密码为123456
+- 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
+- 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
+- 部门管理:可配置系统组织架构,树形表格展示
+- 岗位管理:配置各个部门的职位
+- 字典管理:可维护常用一些固定的数据,如:状态,性别等
+- 系统日志:记录用户操作日志与异常日志,方便开发人员定位排错
+- SQL监控:采用druid 监控数据库访问性能,默认用户名admin,密码123456
+- 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然
+- 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务
+- 邮件工具:配合富文本,发送html格式的邮件
+- 七牛云存储:可同步七牛云存储的数据到系统,无需登录七牛云直接操作云数据
+- 支付宝支付:整合了支付宝支付并且提供了测试账号,可自行测试
+- 服务监控:监控服务器的负载情况
+- 运维管理:一键部署你的应用
+
+#### 后端项目结构
+项目采用按功能分模块的开发方式,结构如下
+
+- `eladmin-common` 为系统的公共模块,各种工具类,公共配置存在该模块
+
+- `eladmin-system` 为系统核心模块也是项目入口模块,也是最终需要打包部署的模块
+
+- `eladmin-logging` 为系统的日志模块,其他模块如果需要记录日志需要引入该模块
+
+- `eladmin-tools` 为第三方工具模块,包含:图床、邮件、云存储、本地存储、支付宝
+
+- `eladmin-generator` 为系统的代码生成模块,代码生成的模板在 system 模块中
+
+#### 后端详细结构
+
+```
+- eladmin-common 公共模块
+ - annotation 为系统自定义注解
+ - aspect 自定义注解的切面
+ - base 提供了Entity、DTO基类和mapstruct的通用mapper
+ - config 自定义权限实现、redis配置、swagger配置、Rsa配置等
+ - exception 项目统一异常的处理
+ - utils 系统通用工具类
+- eladmin-system 系统核心模块(系统启动入口)
+ - config 配置跨域与静态资源,与数据权限
+ - thread 线程池相关
+ - modules 系统相关模块(登录授权、系统监控、定时任务、运维管理等)
+- eladmin-logging 系统日志模块
+- eladmin-tools 系统第三方工具模块
+- eladmin-generator 系统代码生成模块
+```
+
+#### 特别鸣谢
+
+- 感谢 [七牛云](https://portal.qiniu.com/signup?utm_source=kaiyuan&utm_media=ELADMIN) 提供的免费云存储与CDN加速支持
+
+- 感谢 [JetBrains](https://www.jetbrains.com/) 提供的非商业开源软件开发授权
+
+- 感谢 [PanJiaChen](https://github.com/PanJiaChen/vue-element-admin) 大佬提供的前端模板
+
+- 感谢 [Moxun](https://github.com/moxun1639) 大佬提供的前端 Curd 通用组件
+
+- 感谢 [zhy6599](https://gitee.com/zhy6599) 大佬提供的后端运维管理相关功能
+
+- 感谢 [j.yao.SUSE](https://github.com/everhopingandwaiting) 大佬提供的匿名接口与Redis限流等功能
+
+#### 项目捐赠
+项目的发展离不开你的支持,请作者喝杯咖啡吧☕ [Donate](https://eladmin.vip/donation/)
+
+#### 反馈交流
+- QQ交流群:一群:891137268 、二群:947578238、三群:659622532
\ No newline at end of file
diff --git a/eladmin-web/.editorconfig b/eladmin-web/.editorconfig
new file mode 100644
index 0000000..3454886
--- /dev/null
+++ b/eladmin-web/.editorconfig
@@ -0,0 +1,14 @@
+# https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/eladmin-web/.env.development b/eladmin-web/.env.development
new file mode 100644
index 0000000..d9a2132
--- /dev/null
+++ b/eladmin-web/.env.development
@@ -0,0 +1,8 @@
+ENV = 'development'
+
+# 接口地址
+VUE_APP_BASE_API = 'http://localhost:8000'
+VUE_APP_WS_API = 'ws://localhost:8000'
+
+# 是否启用 babel-plugin-dynamic-import-node插件
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
diff --git a/eladmin-web/.env.production b/eladmin-web/.env.production
new file mode 100644
index 0000000..66da123
--- /dev/null
+++ b/eladmin-web/.env.production
@@ -0,0 +1,7 @@
+ENV = 'production'
+
+# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置
+# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http
+VUE_APP_BASE_API = 'https://eladmin.vip'
+# 如果接口是 http 形式, wss 需要改为 ws
+VUE_APP_WS_API = 'wss://eladmin.vip'
diff --git a/eladmin-web/.eslintignore b/eladmin-web/.eslintignore
new file mode 100644
index 0000000..e6529fc
--- /dev/null
+++ b/eladmin-web/.eslintignore
@@ -0,0 +1,4 @@
+build/*.js
+src/assets
+public
+dist
diff --git a/eladmin-web/.eslintrc.js b/eladmin-web/.eslintrc.js
new file mode 100644
index 0000000..c977505
--- /dev/null
+++ b/eladmin-web/.eslintrc.js
@@ -0,0 +1,198 @@
+module.exports = {
+ root: true,
+ parserOptions: {
+ parser: 'babel-eslint',
+ sourceType: 'module'
+ },
+ env: {
+ browser: true,
+ node: true,
+ es6: true,
+ },
+ extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+ // add your custom rules here
+ //it is base on https://github.com/vuejs/eslint-config-vue
+ rules: {
+ "vue/max-attributes-per-line": [2, {
+ "singleline": 10,
+ "multiline": {
+ "max": 1,
+ "allowFirstLine": false
+ }
+ }],
+ "vue/singleline-html-element-content-newline": "off",
+ "vue/multiline-html-element-content-newline":"off",
+ "vue/name-property-casing": ["error", "PascalCase"],
+ "vue/no-v-html": "off",
+ 'accessor-pairs': 2,
+ 'arrow-spacing': [2, {
+ 'before': true,
+ 'after': true
+ }],
+ 'block-spacing': [2, 'always'],
+ 'brace-style': [2, '1tbs', {
+ 'allowSingleLine': true
+ }],
+ 'camelcase': [0, {
+ 'properties': 'always'
+ }],
+ 'comma-dangle': [2, 'never'],
+ 'comma-spacing': [2, {
+ 'before': false,
+ 'after': true
+ }],
+ 'comma-style': [2, 'last'],
+ 'constructor-super': 2,
+ 'curly': [2, 'multi-line'],
+ 'dot-location': [2, 'property'],
+ 'eol-last': 2,
+ 'eqeqeq': ["error", "always", {"null": "ignore"}],
+ 'generator-star-spacing': [2, {
+ 'before': true,
+ 'after': true
+ }],
+ 'handle-callback-err': [2, '^(err|error)$'],
+ 'indent': [2, 2, {
+ 'SwitchCase': 1
+ }],
+ 'jsx-quotes': [2, 'prefer-single'],
+ 'key-spacing': [2, {
+ 'beforeColon': false,
+ 'afterColon': true
+ }],
+ 'keyword-spacing': [2, {
+ 'before': true,
+ 'after': true
+ }],
+ 'new-cap': [2, {
+ 'newIsCap': true,
+ 'capIsNew': false
+ }],
+ 'new-parens': 2,
+ 'no-array-constructor': 2,
+ 'no-caller': 2,
+ 'no-console': 'off',
+ 'no-class-assign': 2,
+ 'no-cond-assign': 2,
+ 'no-const-assign': 2,
+ 'no-control-regex': 0,
+ 'no-delete-var': 2,
+ 'no-dupe-args': 2,
+ 'no-dupe-class-members': 2,
+ 'no-dupe-keys': 2,
+ 'no-duplicate-case': 2,
+ 'no-empty-character-class': 2,
+ 'no-empty-pattern': 2,
+ 'no-eval': 2,
+ 'no-ex-assign': 2,
+ 'no-extend-native': 2,
+ 'no-extra-bind': 2,
+ 'no-extra-boolean-cast': 2,
+ 'no-extra-parens': [2, 'functions'],
+ 'no-fallthrough': 2,
+ 'no-floating-decimal': 2,
+ 'no-func-assign': 2,
+ 'no-implied-eval': 2,
+ 'no-inner-declarations': [2, 'functions'],
+ 'no-invalid-regexp': 2,
+ 'no-irregular-whitespace': 2,
+ 'no-iterator': 2,
+ 'no-label-var': 2,
+ 'no-labels': [2, {
+ 'allowLoop': false,
+ 'allowSwitch': false
+ }],
+ 'no-lone-blocks': 2,
+ 'no-mixed-spaces-and-tabs': 2,
+ 'no-multi-spaces': 2,
+ 'no-multi-str': 2,
+ 'no-multiple-empty-lines': [2, {
+ 'max': 1
+ }],
+ 'no-native-reassign': 2,
+ 'no-negated-in-lhs': 2,
+ 'no-new-object': 2,
+ 'no-new-require': 2,
+ 'no-new-symbol': 2,
+ 'no-new-wrappers': 2,
+ 'no-obj-calls': 2,
+ 'no-octal': 2,
+ 'no-octal-escape': 2,
+ 'no-path-concat': 2,
+ 'no-proto': 2,
+ 'no-redeclare': 2,
+ 'no-regex-spaces': 2,
+ 'no-return-assign': [2, 'except-parens'],
+ 'no-self-assign': 2,
+ 'no-self-compare': 2,
+ 'no-sequences': 2,
+ 'no-shadow-restricted-names': 2,
+ 'no-spaced-func': 2,
+ 'no-sparse-arrays': 2,
+ 'no-this-before-super': 2,
+ 'no-throw-literal': 2,
+ 'no-trailing-spaces': 2,
+ 'no-undef': 2,
+ 'no-undef-init': 2,
+ 'no-unexpected-multiline': 2,
+ 'no-unmodified-loop-condition': 2,
+ 'no-unneeded-ternary': [2, {
+ 'defaultAssignment': false
+ }],
+ 'no-unreachable': 2,
+ 'no-unsafe-finally': 2,
+ 'no-unused-vars': [2, {
+ 'vars': 'all',
+ 'args': 'none'
+ }],
+ 'no-useless-call': 2,
+ 'no-useless-computed-key': 2,
+ 'no-useless-constructor': 2,
+ 'no-useless-escape': 0,
+ 'no-whitespace-before-property': 2,
+ 'no-with': 2,
+ 'one-var': [2, {
+ 'initialized': 'never'
+ }],
+ 'operator-linebreak': [2, 'after', {
+ 'overrides': {
+ '?': 'before',
+ ':': 'before'
+ }
+ }],
+ 'padded-blocks': [2, 'never'],
+ 'quotes': [2, 'single', {
+ 'avoidEscape': true,
+ 'allowTemplateLiterals': true
+ }],
+ 'semi': [2, 'never'],
+ 'semi-spacing': [2, {
+ 'before': false,
+ 'after': true
+ }],
+ 'space-before-blocks': [2, 'always'],
+ 'space-before-function-paren': [2, 'never'],
+ 'space-in-parens': [2, 'never'],
+ 'space-infix-ops': 2,
+ 'space-unary-ops': [2, {
+ 'words': true,
+ 'nonwords': false
+ }],
+ 'spaced-comment': [2, 'always', {
+ 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+ }],
+ 'template-curly-spacing': [2, 'never'],
+ 'use-isnan': 2,
+ 'valid-typeof': 2,
+ 'wrap-iife': [2, 'any'],
+ 'yield-star-spacing': [2, 'both'],
+ 'yoda': [2, 'never'],
+ 'prefer-const': 2,
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+ 'object-curly-spacing': [2, 'always', {
+ objectsInObjects: false
+ }],
+ 'array-bracket-spacing': [2, 'never']
+ }
+}
diff --git a/eladmin-web/.gitignore b/eladmin-web/.gitignore
new file mode 100644
index 0000000..1978bc2
--- /dev/null
+++ b/eladmin-web/.gitignore
@@ -0,0 +1,24 @@
+.DS_Store
+node_modules/
+dist/
+demo/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
diff --git a/eladmin-web/.travis.yml b/eladmin-web/.travis.yml
new file mode 100644
index 0000000..f4be7a0
--- /dev/null
+++ b/eladmin-web/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js: 10
+script: npm run test
+notifications:
+ email: false
diff --git a/eladmin-web/LICENSE b/eladmin-web/LICENSE
new file mode 100644
index 0000000..78a36cb
--- /dev/null
+++ b/eladmin-web/LICENSE
@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "{}" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+ Copyright 2019 Zheng Jie
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/eladmin-web/README.md b/eladmin-web/README.md
new file mode 100644
index 0000000..aeef038
--- /dev/null
+++ b/eladmin-web/README.md
@@ -0,0 +1,52 @@
+# ELADMIN-WEB
+
+#### 前端模板
+
+初始模板基于: [https://github.com/PanJiaChen/vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+
+模板文档: [https://panjiachen.github.io/vue-element-admin-site/zh/guide/](https://panjiachen.github.io/vue-element-admin-site/zh/guide/)
+
+#### Build Setup
+``` bash
+# 配置镜像加速
+https://www.ydyno.com/archives/1219.html
+
+# 安装依赖
+npm install
+
+# 启动服务 localhost:8013
+npm run dev
+
+# 构建生产环境
+npm run build:prod
+```
+
+#### 常见问题
+
+1、linux 系统在安装依赖的时候会出现 node-sass 无法安装的问题
+
+解决方案:
+```
+1. 单独安装:npm install --unsafe-perm node-sass
+2. 直接使用:npm install --unsafe-perm
+```
+
+2、加速node-sass安装
+
+https://www.ydyno.com/archives/1219.html
+
+#### 特别鸣谢
+
+- 感谢 [JetBrains](https://www.jetbrains.com/) 提供的非商业开源软件开发授权
+
+- 感谢 [PanJiaChen](https://github.com/PanJiaChen/vue-element-admin) 大佬提供的前端模板
+
+- 感谢 [Moxun](https://github.com/moxun1639) 大佬提供的前端 Crud 通用组件
+
+- 感谢 [zhy6599](https://gitee.com/zhy6599) 大佬提供的后端运维管理相关功能
+
+- 感谢 [j.yao.SUSE](https://github.com/everhopingandwaiting) 大佬提供的匿名接口与Redis限流等功能
+
+#### 反馈交流
+
+- QQ交流群:一群:891137268、二群:947578238、三群:659622532
\ No newline at end of file
diff --git a/eladmin-web/babel.config.js b/eladmin-web/babel.config.js
new file mode 100644
index 0000000..804632a
--- /dev/null
+++ b/eladmin-web/babel.config.js
@@ -0,0 +1,11 @@
+const plugins = ['@vue/babel-plugin-transform-vue-jsx']
+// 生产环境移除console
+if (process.env.NODE_ENV === 'production') {
+ plugins.push('transform-remove-console')
+}
+module.exports = {
+ plugins: plugins,
+ presets: [
+ '@vue/app'
+ ]
+}
diff --git a/eladmin-web/jest.config.js b/eladmin-web/jest.config.js
new file mode 100644
index 0000000..143cdc8
--- /dev/null
+++ b/eladmin-web/jest.config.js
@@ -0,0 +1,24 @@
+module.exports = {
+ moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
+ transform: {
+ '^.+\\.vue$': 'vue-jest',
+ '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
+ 'jest-transform-stub',
+ '^.+\\.jsx?$': 'babel-jest'
+ },
+ moduleNameMapper: {
+ '^@/(.*)$': '/src/$1'
+ },
+ snapshotSerializers: ['jest-serializer-vue'],
+ testMatch: [
+ '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
+ ],
+ collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
+ coverageDirectory: '/tests/unit/coverage',
+ // 'collectCoverage': true,
+ 'coverageReporters': [
+ 'lcov',
+ 'text-summary'
+ ],
+ testURL: 'http://localhost/'
+}
diff --git a/eladmin-web/package.json b/eladmin-web/package.json
new file mode 100644
index 0000000..b1152dd
--- /dev/null
+++ b/eladmin-web/package.json
@@ -0,0 +1,114 @@
+{
+ "name": "eladmin-web",
+ "version": "2.6.0",
+ "description": "ELADMIN 前端源码",
+ "author": "Zheng Jie",
+ "license": "Apache-2.0",
+ "scripts": {
+ "dev": "vue-cli-service serve",
+ "build:prod": "vue-cli-service build",
+ "build:stage": "vue-cli-service build --mode staging",
+ "preview": "node build/index.js --preview",
+ "lint": "eslint --ext .js,.vue src",
+ "test:unit": "jest --clearCache && vue-cli-service test:unit",
+ "svgo": "svgo -f src/assets/icons/svg --config=src/assets/icons/svgo.yml",
+ "new": "plop"
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "lint-staged": {
+ "src/**/*.{js,vue}": [
+ "eslint --fix",
+ "git add"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/elunez/eladmin-web.git"
+ },
+ "bugs": {
+ "url": "https://github.com/elunez/eladmin/issues"
+ },
+ "dependencies": {
+ "@riophae/vue-treeselect": "^0.4.0",
+ "axios": "^0.21.1",
+ "clipboard": "2.0.4",
+ "codemirror": "^5.49.2",
+ "core-js": "^2.6.12",
+ "echarts": "^4.2.1",
+ "echarts-wordcloud": "^1.1.3",
+ "element-ui": "^2.15.8",
+ "file-saver": "1.3.8",
+ "fuse.js": "3.4.4",
+ "js-beautify": "^1.10.2",
+ "js-cookie": "2.2.0",
+ "jsencrypt": "^3.0.0-rc.1",
+ "jszip": "^3.7.1",
+ "mavon-editor": "^2.9.1",
+ "normalize.css": "7.0.0",
+ "nprogress": "0.2.0",
+ "path-to-regexp": "2.4.0",
+ "qs": "^6.10.1",
+ "screenfull": "4.2.0",
+ "sortablejs": "1.8.4",
+ "vue": "^2.6.14",
+ "vue-count-to": "^1.0.13",
+ "vue-cropper": "0.4.9",
+ "vue-echarts": "^5.0.0-beta.0",
+ "vue-image-crop-upload": "^2.5.0",
+ "vue-router": "3.0.2",
+ "vue-splitpane": "1.0.4",
+ "vuedraggable": "2.20.0",
+ "vuex": "3.1.0",
+ "wangeditor": "^4.7.11",
+ "webpack": "^4.46.0",
+ "xlsx": "^0.17.4"
+ },
+ "devDependencies": {
+ "@babel/parser": "^7.7.4",
+ "@babel/register": "7.0.0",
+ "@vue/babel-plugin-transform-vue-jsx": "^1.2.1",
+ "@vue/cli-plugin-babel": "3.5.3",
+ "@vue/cli-plugin-eslint": "^3.9.1",
+ "@vue/cli-plugin-unit-jest": "3.5.3",
+ "@vue/cli-service": "3.5.3",
+ "@vue/test-utils": "1.0.0-beta.29",
+ "autoprefixer": "^9.5.1",
+ "babel-core": "7.0.0-bridge.0",
+ "babel-eslint": "10.0.1",
+ "babel-jest": "23.6.0",
+ "babel-plugin-dynamic-import-node": "2.3.0",
+ "babel-plugin-transform-remove-console": "^6.9.4",
+ "chalk": "2.4.2",
+ "chokidar": "2.1.5",
+ "connect": "3.6.6",
+ "compression-webpack-plugin": "5.0.2",
+ "eslint": "5.15.3",
+ "eslint-plugin-vue": "5.2.2",
+ "html-webpack-plugin": "3.2.0",
+ "http-proxy-middleware": "^0.19.1",
+ "husky": "1.3.1",
+ "lint-staged": "8.1.5",
+ "plop": "2.3.0",
+ "sass": "1.32.13",
+ "sass-loader": "10.2.0",
+ "script-ext-html-webpack-plugin": "2.1.3",
+ "script-loader": "0.7.2",
+ "serve-static": "^1.13.2",
+ "svg-sprite-loader": "4.1.3",
+ "svgo": "1.2.0",
+ "tasksfile": "^5.1.1",
+ "vue-template-compiler": "2.6.14"
+ },
+ "engines": {
+ "node": ">=8.9",
+ "npm": ">= 3.0.0"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions"
+ ]
+}
diff --git a/eladmin-web/plopfile.js b/eladmin-web/plopfile.js
new file mode 100644
index 0000000..9f3147e
--- /dev/null
+++ b/eladmin-web/plopfile.js
@@ -0,0 +1,7 @@
+const viewGenerator = require('./plop-templates/view/prompt')
+const componentGenerator = require('./plop-templates/component/prompt')
+
+module.exports = function(plop) {
+ plop.setGenerator('view', viewGenerator)
+ plop.setGenerator('component', componentGenerator)
+}
diff --git a/eladmin-web/postcss.config.js b/eladmin-web/postcss.config.js
new file mode 100644
index 0000000..961986e
--- /dev/null
+++ b/eladmin-web/postcss.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ plugins: {
+ autoprefixer: {}
+ }
+}
diff --git a/eladmin-web/public/favicon.ico b/eladmin-web/public/favicon.ico
new file mode 100644
index 0000000..fcb6999
Binary files /dev/null and b/eladmin-web/public/favicon.ico differ
diff --git a/eladmin-web/public/index.html b/eladmin-web/public/index.html
new file mode 100644
index 0000000..e918500
--- /dev/null
+++ b/eladmin-web/public/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+ <%= webpackConfig.name %>
+
+
+
+
+
+
diff --git a/eladmin-web/public/robots.txt b/eladmin-web/public/robots.txt
new file mode 100644
index 0000000..77470cb
--- /dev/null
+++ b/eladmin-web/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /
\ No newline at end of file
diff --git a/eladmin-web/src/App.vue b/eladmin-web/src/App.vue
new file mode 100644
index 0000000..ec9032c
--- /dev/null
+++ b/eladmin-web/src/App.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/eladmin-web/src/api/data.js b/eladmin-web/src/api/data.js
new file mode 100644
index 0000000..d975d75
--- /dev/null
+++ b/eladmin-web/src/api/data.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+export function initData(url, params) {
+ return request({
+ url: url + '?' + qs.stringify(params, { indices: false }),
+ method: 'get'
+ })
+}
+
+export function download(url, params) {
+ return request({
+ url: url + '?' + qs.stringify(params, { indices: false }),
+ method: 'get',
+ responseType: 'blob'
+ })
+}
diff --git a/eladmin-web/src/api/generator/genConfig.js b/eladmin-web/src/api/generator/genConfig.js
new file mode 100644
index 0000000..e15b200
--- /dev/null
+++ b/eladmin-web/src/api/generator/genConfig.js
@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+
+export function get(tableName) {
+ return request({
+ url: 'api/genConfig/' + tableName,
+ method: 'get'
+ })
+}
+
+export function update(data) {
+ return request({
+ url: 'api/genConfig',
+ data,
+ method: 'put'
+ })
+}
diff --git a/eladmin-web/src/api/generator/generator.js b/eladmin-web/src/api/generator/generator.js
new file mode 100644
index 0000000..43f264e
--- /dev/null
+++ b/eladmin-web/src/api/generator/generator.js
@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+export function generator(tableName, type) {
+ return request({
+ url: 'api/generator/' + tableName + '/' + type,
+ method: 'post',
+ responseType: type === 2 ? 'blob' : ''
+ })
+}
+
+export function save(data) {
+ return request({
+ url: 'api/generator',
+ data,
+ method: 'put'
+ })
+}
+
+export function sync(tables) {
+ return request({
+ url: 'api/generator/sync',
+ method: 'post',
+ data: tables
+ })
+}
+
diff --git a/eladmin-web/src/api/login.js b/eladmin-web/src/api/login.js
new file mode 100644
index 0000000..fe257d2
--- /dev/null
+++ b/eladmin-web/src/api/login.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function login(username, password, code, uuid) {
+ return request({
+ url: 'auth/login',
+ method: 'post',
+ data: {
+ username,
+ password,
+ code,
+ uuid
+ }
+ })
+}
+
+export function getInfo() {
+ return request({
+ url: 'auth/info',
+ method: 'get'
+ })
+}
+
+export function getCodeImg() {
+ return request({
+ url: 'auth/code',
+ method: 'get'
+ })
+}
+
+export function logout() {
+ return request({
+ url: 'auth/logout',
+ method: 'delete'
+ })
+}
diff --git a/eladmin-web/src/api/mnt/app.js b/eladmin-web/src/api/mnt/app.js
new file mode 100644
index 0000000..2a27054
--- /dev/null
+++ b/eladmin-web/src/api/mnt/app.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/app',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/app',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/app',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/eladmin-web/src/api/mnt/connect.js b/eladmin-web/src/api/mnt/connect.js
new file mode 100644
index 0000000..1bbe90b
--- /dev/null
+++ b/eladmin-web/src/api/mnt/connect.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+export function testDbConnect(data) {
+ return request({
+ url: 'api/database/testConnect',
+ method: 'post',
+ data
+ })
+}
+
+export function testServerConnect(data) {
+ return request({
+ url: 'api/serverDeploy/testConnect',
+ method: 'post',
+ data
+ })
+}
diff --git a/eladmin-web/src/api/mnt/database.js b/eladmin-web/src/api/mnt/database.js
new file mode 100644
index 0000000..91797fb
--- /dev/null
+++ b/eladmin-web/src/api/mnt/database.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/database',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/database',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/database',
+ method: 'put',
+ data
+ })
+}
+
+export function testDbConnection(data) {
+ return request({
+ url: 'api/database/testConnect',
+ method: 'post',
+ data
+ })
+}
+
+export default { add, edit, del, testDbConnection }
diff --git a/eladmin-web/src/api/mnt/deploy.js b/eladmin-web/src/api/mnt/deploy.js
new file mode 100644
index 0000000..c1475ea
--- /dev/null
+++ b/eladmin-web/src/api/mnt/deploy.js
@@ -0,0 +1,77 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/deploy',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/deploy',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/deploy',
+ method: 'put',
+ data
+ })
+}
+
+export function getApps() {
+ return request({
+ url: 'api/app',
+ method: 'get'
+ })
+}
+
+export function getServers() {
+ return request({
+ url: 'api/serverDeploy',
+ method: 'get'
+ })
+}
+
+/**
+ * 启动服务
+ * @param data 选中行
+ */
+export function startServer(data) {
+ return request({
+ url: 'api/deploy/startServer',
+ method: 'post',
+ data
+ })
+}
+
+/**
+ * 停止服务
+ * @param data 选中行
+ */
+export function stopServer(data) {
+ return request({
+ url: 'api/deploy/stopServer',
+ method: 'post',
+ data
+ })
+}
+
+/**
+ * 停止服务
+ * @param data 选中行
+ */
+export function serverStatus(data) {
+ return request({
+ url: 'api/deploy/serverStatus',
+ method: 'post',
+ data
+ })
+}
+
+export default { add, edit, del, stopServer, serverStatus, startServer, getServers, getApps }
diff --git a/eladmin-web/src/api/mnt/deployHistory.js b/eladmin-web/src/api/mnt/deployHistory.js
new file mode 100644
index 0000000..30335e4
--- /dev/null
+++ b/eladmin-web/src/api/mnt/deployHistory.js
@@ -0,0 +1,21 @@
+import request from '@/utils/request'
+
+export function del(ids) {
+ return request({
+ url: 'api/deployHistory',
+ method: 'delete',
+ data: ids
+ })
+}
+
+/**
+ * 版本回退
+ * @param data 选中行
+ */
+export function reducte(data) {
+ return request({
+ url: 'api/deploy/serverReduction',
+ method: 'post',
+ data
+ })
+}
diff --git a/eladmin-web/src/api/mnt/serverDeploy.js b/eladmin-web/src/api/mnt/serverDeploy.js
new file mode 100644
index 0000000..e796114
--- /dev/null
+++ b/eladmin-web/src/api/mnt/serverDeploy.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/serverDeploy',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/serverDeploy',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/serverDeploy',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/eladmin-web/src/api/monitor/log.js b/eladmin-web/src/api/monitor/log.js
new file mode 100644
index 0000000..13f0d39
--- /dev/null
+++ b/eladmin-web/src/api/monitor/log.js
@@ -0,0 +1,22 @@
+import request from '@/utils/request'
+
+export function getErrDetail(id) {
+ return request({
+ url: 'api/logs/error/' + id,
+ method: 'get'
+ })
+}
+
+export function delAllError() {
+ return request({
+ url: 'api/logs/del/error',
+ method: 'delete'
+ })
+}
+
+export function delAllInfo() {
+ return request({
+ url: 'api/logs/del/info',
+ method: 'delete'
+ })
+}
diff --git a/eladmin-web/src/api/monitor/online.js b/eladmin-web/src/api/monitor/online.js
new file mode 100644
index 0000000..057275b
--- /dev/null
+++ b/eladmin-web/src/api/monitor/online.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function del(keys) {
+ return request({
+ url: 'auth/online',
+ method: 'delete',
+ data: keys
+ })
+}
diff --git a/eladmin-web/src/api/system/code.js b/eladmin-web/src/api/system/code.js
new file mode 100644
index 0000000..0d2e4c2
--- /dev/null
+++ b/eladmin-web/src/api/system/code.js
@@ -0,0 +1,15 @@
+import request from '@/utils/request'
+
+export function resetEmail(data) {
+ return request({
+ url: 'api/code/resetEmail?email=' + data,
+ method: 'post'
+ })
+}
+
+export function updatePass(pass) {
+ return request({
+ url: 'api/users/updatePass/' + pass,
+ method: 'get'
+ })
+}
diff --git a/eladmin-web/src/api/system/dept.js b/eladmin-web/src/api/system/dept.js
new file mode 100644
index 0000000..ed4f944
--- /dev/null
+++ b/eladmin-web/src/api/system/dept.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+export function getDepts(params) {
+ return request({
+ url: 'api/dept',
+ method: 'get',
+ params
+ })
+}
+
+export function getDeptSuperior(ids) {
+ const data = ids.length || ids.length === 0 ? ids : Array.of(ids)
+ return request({
+ url: 'api/dept/superior',
+ method: 'post',
+ data
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/dept',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/dept',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/dept',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del, getDepts, getDeptSuperior }
diff --git a/eladmin-web/src/api/system/dict.js b/eladmin-web/src/api/system/dict.js
new file mode 100644
index 0000000..99170f7
--- /dev/null
+++ b/eladmin-web/src/api/system/dict.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function getDicts() {
+ return request({
+ url: 'api/dict/all',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/dict',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/dict/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/dict',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/eladmin-web/src/api/system/dictDetail.js b/eladmin-web/src/api/system/dictDetail.js
new file mode 100644
index 0000000..e8dc512
--- /dev/null
+++ b/eladmin-web/src/api/system/dictDetail.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+export function get(dictName) {
+ const params = {
+ dictName,
+ page: 0,
+ size: 9999
+ }
+ return request({
+ url: 'api/dictDetail',
+ method: 'get',
+ params
+ })
+}
+
+export function getDictMap(dictName) {
+ const params = {
+ dictName,
+ page: 0,
+ size: 9999
+ }
+ return request({
+ url: 'api/dictDetail/map',
+ method: 'get',
+ params
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/dictDetail',
+ method: 'post',
+ data
+ })
+}
+
+export function del(id) {
+ return request({
+ url: 'api/dictDetail/' + id,
+ method: 'delete'
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/dictDetail',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/eladmin-web/src/api/system/job.js b/eladmin-web/src/api/system/job.js
new file mode 100644
index 0000000..a00630e
--- /dev/null
+++ b/eladmin-web/src/api/system/job.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+export function getAllJob() {
+ const params = {
+ page: 0,
+ size: 9999,
+ enabled: true
+ }
+ return request({
+ url: 'api/job',
+ method: 'get',
+ params
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/job',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/job',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/job',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/eladmin-web/src/api/system/menu.js b/eladmin-web/src/api/system/menu.js
new file mode 100644
index 0000000..282dd8d
--- /dev/null
+++ b/eladmin-web/src/api/system/menu.js
@@ -0,0 +1,65 @@
+import request from '@/utils/request'
+
+export function getMenusTree(pid) {
+ return request({
+ url: 'api/menus/lazy?pid=' + pid,
+ method: 'get'
+ })
+}
+
+export function getMenus(params) {
+ return request({
+ url: 'api/menus',
+ method: 'get',
+ params
+ })
+}
+
+export function getMenuSuperior(ids) {
+ const data = Array.isArray(ids) || ids.length === 0 ? ids : Array.of(ids)
+ return request({
+ url: 'api/menus/superior',
+ method: 'post',
+ data
+ })
+}
+
+export function getChild(id) {
+ return request({
+ url: 'api/menus/child?id=' + id,
+ method: 'get'
+ })
+}
+
+export function buildMenus() {
+ return request({
+ url: 'api/menus/build',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/menus',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/menus',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/menus',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del, getMenusTree, getMenuSuperior, getMenus, getChild }
diff --git a/eladmin-web/src/api/system/role.js b/eladmin-web/src/api/system/role.js
new file mode 100644
index 0000000..1f7bc1e
--- /dev/null
+++ b/eladmin-web/src/api/system/role.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+// 获取所有的Role
+export function getAll() {
+ return request({
+ url: 'api/roles/all',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/roles',
+ method: 'post',
+ data
+ })
+}
+
+export function get(id) {
+ return request({
+ url: 'api/roles/' + id,
+ method: 'get'
+ })
+}
+
+export function getLevel() {
+ return request({
+ url: 'api/roles/level',
+ method: 'get'
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/roles',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/roles',
+ method: 'put',
+ data
+ })
+}
+
+export function editMenu(data) {
+ return request({
+ url: 'api/roles/menu',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del, get, editMenu, getLevel }
diff --git a/eladmin-web/src/api/system/timing.js b/eladmin-web/src/api/system/timing.js
new file mode 100644
index 0000000..613e15f
--- /dev/null
+++ b/eladmin-web/src/api/system/timing.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/jobs',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/jobs',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/jobs',
+ method: 'put',
+ data
+ })
+}
+
+export function updateIsPause(id) {
+ return request({
+ url: 'api/jobs/' + id,
+ method: 'put'
+ })
+}
+
+export function execution(id) {
+ return request({
+ url: 'api/jobs/exec/' + id,
+ method: 'put'
+ })
+}
+
+export default { del, updateIsPause, execution, add, edit }
diff --git a/eladmin-web/src/api/system/user.js b/eladmin-web/src/api/system/user.js
new file mode 100644
index 0000000..6cd91a5
--- /dev/null
+++ b/eladmin-web/src/api/system/user.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+import { encrypt } from '@/utils/rsaEncrypt'
+
+export function add(data) {
+ return request({
+ url: 'api/users',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/users',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/users',
+ method: 'put',
+ data
+ })
+}
+
+export function editUser(data) {
+ return request({
+ url: 'api/users/center',
+ method: 'put',
+ data
+ })
+}
+
+export function updatePass(user) {
+ const data = {
+ oldPass: encrypt(user.oldPass),
+ newPass: encrypt(user.newPass)
+ }
+ return request({
+ url: 'api/users/updatePass/',
+ method: 'post',
+ data
+ })
+}
+
+export function updateEmail(form) {
+ const data = {
+ password: encrypt(form.pass),
+ email: form.email
+ }
+ return request({
+ url: 'api/users/updateEmail/' + form.code,
+ method: 'post',
+ data
+ })
+}
+
+export default { add, edit, del }
+
diff --git a/eladmin-web/src/api/tools/alipay.js b/eladmin-web/src/api/tools/alipay.js
new file mode 100644
index 0000000..54090f5
--- /dev/null
+++ b/eladmin-web/src/api/tools/alipay.js
@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+export function get() {
+ return request({
+ url: 'api/aliPay',
+ method: 'get'
+ })
+}
+
+export function update(data) {
+ return request({
+ url: 'api/aliPay',
+ data,
+ method: 'put'
+ })
+}
+
+// 支付
+export function toAliPay(url, data) {
+ return request({
+ url: 'api/' + url,
+ data,
+ method: 'post'
+ })
+}
diff --git a/eladmin-web/src/api/tools/email.js b/eladmin-web/src/api/tools/email.js
new file mode 100644
index 0000000..af030cb
--- /dev/null
+++ b/eladmin-web/src/api/tools/email.js
@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+
+export function get() {
+ return request({
+ url: 'api/email',
+ method: 'get'
+ })
+}
+
+export function update(data) {
+ return request({
+ url: 'api/email',
+ data,
+ method: 'put'
+ })
+}
+
+export function send(data) {
+ return request({
+ url: 'api/email',
+ data,
+ method: 'post'
+ })
+}
diff --git a/eladmin-web/src/api/tools/localStorage.js b/eladmin-web/src/api/tools/localStorage.js
new file mode 100644
index 0000000..63ebe2b
--- /dev/null
+++ b/eladmin-web/src/api/tools/localStorage.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/localStorage',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/localStorage/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/localStorage',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/eladmin-web/src/api/tools/qiniu.js b/eladmin-web/src/api/tools/qiniu.js
new file mode 100644
index 0000000..6d56771
--- /dev/null
+++ b/eladmin-web/src/api/tools/qiniu.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+export function get() {
+ return request({
+ url: 'api/qiNiuContent/config',
+ method: 'get'
+ })
+}
+
+export function update(data) {
+ return request({
+ url: 'api/qiNiuContent/config',
+ data,
+ method: 'put'
+ })
+}
+
+export function download(id) {
+ return request({
+ url: 'api/qiNiuContent/download/' + id,
+ method: 'get'
+ })
+}
+
+export function sync() {
+ return request({
+ url: 'api/qiNiuContent/synchronize',
+ method: 'post'
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/qiNiuContent',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export default { del, download, sync }
diff --git a/eladmin-web/src/assets/401_images/401.gif b/eladmin-web/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/eladmin-web/src/assets/401_images/401.gif differ
diff --git a/eladmin-web/src/assets/404_images/404.png b/eladmin-web/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/eladmin-web/src/assets/404_images/404.png differ
diff --git a/eladmin-web/src/assets/404_images/404_cloud.png b/eladmin-web/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/eladmin-web/src/assets/404_images/404_cloud.png differ
diff --git a/eladmin-web/src/assets/icons/index.js b/eladmin-web/src/assets/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/eladmin-web/src/assets/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
diff --git a/eladmin-web/src/assets/icons/svg/Steve-Jobs.svg b/eladmin-web/src/assets/icons/svg/Steve-Jobs.svg
new file mode 100644
index 0000000..53843e2
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/Steve-Jobs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/alipay.svg b/eladmin-web/src/assets/icons/svg/alipay.svg
new file mode 100644
index 0000000..9138981
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/alipay.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/anq.svg b/eladmin-web/src/assets/icons/svg/anq.svg
new file mode 100644
index 0000000..a466608
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/anq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/app.svg b/eladmin-web/src/assets/icons/svg/app.svg
new file mode 100644
index 0000000..0796da3
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/app.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/backup.svg b/eladmin-web/src/assets/icons/svg/backup.svg
new file mode 100644
index 0000000..a3272a4
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/backup.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/blog.svg b/eladmin-web/src/assets/icons/svg/blog.svg
new file mode 100644
index 0000000..a990eba
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/blog.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/chain.svg b/eladmin-web/src/assets/icons/svg/chain.svg
new file mode 100644
index 0000000..ed3317f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/chain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/chart.svg b/eladmin-web/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/codeConsole.svg b/eladmin-web/src/assets/icons/svg/codeConsole.svg
new file mode 100644
index 0000000..672ec6e
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/codeConsole.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/dashboard.svg b/eladmin-web/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/database.svg b/eladmin-web/src/assets/icons/svg/database.svg
new file mode 100644
index 0000000..7fbad9b
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/date.svg b/eladmin-web/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..0540e99
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/deploy.svg b/eladmin-web/src/assets/icons/svg/deploy.svg
new file mode 100644
index 0000000..f4a1c56
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/deploy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/dept.svg b/eladmin-web/src/assets/icons/svg/dept.svg
new file mode 100644
index 0000000..894e4bf
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/dept.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/dev.svg b/eladmin-web/src/assets/icons/svg/dev.svg
new file mode 100644
index 0000000..ed4d23c
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/dev.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/develop.svg b/eladmin-web/src/assets/icons/svg/develop.svg
new file mode 100644
index 0000000..e189223
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/develop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/dictionary.svg b/eladmin-web/src/assets/icons/svg/dictionary.svg
new file mode 100644
index 0000000..6e83c43
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/dictionary.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/doc.svg b/eladmin-web/src/assets/icons/svg/doc.svg
new file mode 100644
index 0000000..9160de8
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/doc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/download.svg b/eladmin-web/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..0243c6a
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/edit.svg b/eladmin-web/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/education.svg b/eladmin-web/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/email.svg b/eladmin-web/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..f1cf3ae
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/error.svg b/eladmin-web/src/assets/icons/svg/error.svg
new file mode 100644
index 0000000..fd935da
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/exit-fullscreen.svg b/eladmin-web/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/fullscreen.svg b/eladmin-web/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/fwb.svg b/eladmin-web/src/assets/icons/svg/fwb.svg
new file mode 100644
index 0000000..59933fc
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/fwb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/github.svg b/eladmin-web/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..8145e95
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/gonggao.svg b/eladmin-web/src/assets/icons/svg/gonggao.svg
new file mode 100644
index 0000000..22aed08
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/gonggao.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/icon.svg b/eladmin-web/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82fbdd9
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/image.svg b/eladmin-web/src/assets/icons/svg/image.svg
new file mode 100644
index 0000000..16d572f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/image.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/index.svg b/eladmin-web/src/assets/icons/svg/index.svg
new file mode 100644
index 0000000..fdb3826
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/index.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/international.svg b/eladmin-web/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/ipvisits.svg b/eladmin-web/src/assets/icons/svg/ipvisits.svg
new file mode 100644
index 0000000..4ca473d
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/ipvisits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/java.svg b/eladmin-web/src/assets/icons/svg/java.svg
new file mode 100644
index 0000000..e2effbb
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/java.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/link.svg b/eladmin-web/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/list.svg b/eladmin-web/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/lock.svg b/eladmin-web/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..0f842ea
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/log.svg b/eladmin-web/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..4fefe74
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/login.svg b/eladmin-web/src/assets/icons/svg/login.svg
new file mode 100644
index 0000000..cc5a854
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/login.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/markdown.svg b/eladmin-web/src/assets/icons/svg/markdown.svg
new file mode 100644
index 0000000..7cd6747
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/markdown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/menu.svg b/eladmin-web/src/assets/icons/svg/menu.svg
new file mode 100644
index 0000000..e4360a0
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/message.svg b/eladmin-web/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/mnt.svg b/eladmin-web/src/assets/icons/svg/mnt.svg
new file mode 100644
index 0000000..936ce29
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/mnt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/money.svg b/eladmin-web/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/monitor.svg b/eladmin-web/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..339370a
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/monitor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/nested.svg b/eladmin-web/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/password.svg b/eladmin-web/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..4ab451f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/people.svg b/eladmin-web/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/peoples.svg b/eladmin-web/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..2c91161
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/permission.svg b/eladmin-web/src/assets/icons/svg/permission.svg
new file mode 100644
index 0000000..c4c7409
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/permission.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/phone.svg b/eladmin-web/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..da339f9
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/qiniu.svg b/eladmin-web/src/assets/icons/svg/qiniu.svg
new file mode 100644
index 0000000..c2f9f8b
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/qiniu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/redis.svg b/eladmin-web/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..bef111b
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/role.svg b/eladmin-web/src/assets/icons/svg/role.svg
new file mode 100644
index 0000000..76cb18f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/role.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/search.svg b/eladmin-web/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/server.svg b/eladmin-web/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..db6dcdf
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/shopping.svg b/eladmin-web/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/size.svg b/eladmin-web/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/skill.svg b/eladmin-web/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/source.svg b/eladmin-web/src/assets/icons/svg/source.svg
new file mode 100644
index 0000000..1c3a038
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/source.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/sqlMonitor.svg b/eladmin-web/src/assets/icons/svg/sqlMonitor.svg
new file mode 100644
index 0000000..950a430
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/sqlMonitor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/swagger.svg b/eladmin-web/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..ded7de8
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/sys-tools.svg b/eladmin-web/src/assets/icons/svg/sys-tools.svg
new file mode 100644
index 0000000..8f9055e
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/sys-tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/system.svg b/eladmin-web/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..9333c60
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/system.svg
@@ -0,0 +1 @@
+
diff --git a/eladmin-web/src/assets/icons/svg/system1.svg b/eladmin-web/src/assets/icons/svg/system1.svg
new file mode 100644
index 0000000..37b0a0a
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/system1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/tab.svg b/eladmin-web/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/theme.svg b/eladmin-web/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/timing.svg b/eladmin-web/src/assets/icons/svg/timing.svg
new file mode 100644
index 0000000..f8fdc6d
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/timing.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/tools.svg b/eladmin-web/src/assets/icons/svg/tools.svg
new file mode 100644
index 0000000..aba1a40
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/tree-table.svg b/eladmin-web/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/tree.svg b/eladmin-web/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/unlock.svg b/eladmin-web/src/assets/icons/svg/unlock.svg
new file mode 100644
index 0000000..1219e41
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/unlock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/user.svg b/eladmin-web/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..09d7a81
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/user1.svg b/eladmin-web/src/assets/icons/svg/user1.svg
new file mode 100644
index 0000000..14ca51e
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/user1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/validCode.svg b/eladmin-web/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..a1feb74
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/visits.svg b/eladmin-web/src/assets/icons/svg/visits.svg
new file mode 100644
index 0000000..8425662
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/visits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/web.svg b/eladmin-web/src/assets/icons/svg/web.svg
new file mode 100644
index 0000000..9c57415
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/web.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/wechat.svg b/eladmin-web/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/weixin.svg b/eladmin-web/src/assets/icons/svg/weixin.svg
new file mode 100644
index 0000000..8dbcfa5
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/weixin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svg/zujian.svg b/eladmin-web/src/assets/icons/svg/zujian.svg
new file mode 100644
index 0000000..2aba32f
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svg/zujian.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eladmin-web/src/assets/icons/svgo.yml b/eladmin-web/src/assets/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/eladmin-web/src/assets/icons/svgo.yml
@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+ # - name
+ #
+ # or:
+ # - name: false
+ # - name: true
+ #
+ # or:
+ # - name:
+ # param1: 1
+ # param2: 2
+
+- removeAttrs:
+ attrs:
+ - 'fill'
+ - 'fill-rule'
diff --git a/eladmin-web/src/assets/images/avatar.png b/eladmin-web/src/assets/images/avatar.png
new file mode 100644
index 0000000..997732a
Binary files /dev/null and b/eladmin-web/src/assets/images/avatar.png differ
diff --git a/eladmin-web/src/assets/images/background.webp b/eladmin-web/src/assets/images/background.webp
new file mode 100644
index 0000000..3ad73c8
Binary files /dev/null and b/eladmin-web/src/assets/images/background.webp differ
diff --git a/eladmin-web/src/assets/images/logo.png b/eladmin-web/src/assets/images/logo.png
new file mode 100644
index 0000000..f757710
Binary files /dev/null and b/eladmin-web/src/assets/images/logo.png differ
diff --git a/eladmin-web/src/assets/styles/btn.scss b/eladmin-web/src/assets/styles/btn.scss
new file mode 100644
index 0000000..8f47f2c
--- /dev/null
+++ b/eladmin-web/src/assets/styles/btn.scss
@@ -0,0 +1,99 @@
+@import 'variables';
+
+@mixin colorBtn($color) {
+ background: $color;
+
+ &:hover {
+ color: $color;
+
+ &:before,
+ &:after {
+ background: $color;
+ }
+ }
+}
+
+.blue-btn {
+ @include colorBtn($blue)
+}
+
+.light-blue-btn {
+ @include colorBtn($light-blue)
+}
+
+.red-btn {
+ @include colorBtn($red)
+}
+
+.pink-btn {
+ @include colorBtn($pink)
+}
+
+.green-btn {
+ @include colorBtn($green)
+}
+
+.tiffany-btn {
+ @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+ @include colorBtn($yellow)
+}
+
+.pan-btn {
+ font-size: 14px;
+ color: #fff;
+ padding: 14px 36px;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ transition: 600ms ease all;
+ position: relative;
+ display: inline-block;
+
+ &:hover {
+ background: #fff;
+
+ &:before,
+ &:after {
+ width: 100%;
+ transition: 600ms ease all;
+ }
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: 400ms ease all;
+ }
+
+ &::after {
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: 0;
+ }
+}
+
+.custom-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ color: #fff;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ padding: 10px 15px;
+ font-size: 14px;
+ border-radius: 4px;
+}
diff --git a/eladmin-web/src/assets/styles/eladmin.scss b/eladmin-web/src/assets/styles/eladmin.scss
new file mode 100644
index 0000000..e1e0195
--- /dev/null
+++ b/eladmin-web/src/assets/styles/eladmin.scss
@@ -0,0 +1,117 @@
+.head-container {
+ padding-bottom: 10px;
+ .filter-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0 3px 10px 0;
+ input {
+ height: 30.5px;
+ line-height: 30.5px;
+ }
+ }
+ .el-form-item-label {
+ margin: 0 3px 9px 0;
+ display: inline-block;
+ text-align: right;
+ vertical-align: middle;
+ font-size: 14px;
+ color: #606266;
+ line-height: 30.5px;
+ padding: 0 7px 0 7px;
+ }
+ .el-button+.el-button {
+ margin-left: 0 !important;
+ }
+ .el-select__caret.el-input__icon.el-icon-arrow-up{
+ line-height: 30.5px;
+ }
+ .date-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ height: 30.5px !important;
+ width: 230px !important;
+ }
+}
+.el-avatar {
+ display: inline-block;
+ text-align: center;
+ background: #ccc;
+ color: #fff;
+ white-space: nowrap;
+ position: relative;
+ overflow: hidden;
+ vertical-align: middle;
+ width: 32px;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 16px;
+}
+
+.logo-con{
+ height: 60px;
+ padding: 13px 0 0;
+ img{
+ height: 32px;
+ width: 135px;
+ display: block;
+ //margin: 0 auto;
+ }
+}
+
+#el-login-footer {
+ height: 40px;
+ line-height: 40px;
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ text-align: center;
+ color: #fff;
+ font-family: Arial, serif;
+ font-size: 12px;
+ letter-spacing: 1px;
+}
+
+#el-main-footer {
+ background: none repeat scroll 0 0 white;
+ border-top: 1px solid #e7eaec;
+ overflow: hidden;
+ padding: 10px 6px 0 6px;
+ height: 33px;
+ font-size: 0.7rem !important;
+ color: #7a8b9a;
+ letter-spacing: 0.8px;
+ font-family: Arial, sans-serif !important;
+ position: fixed;
+ bottom: 0;
+ z-index: 99;
+ width: 100%;
+}
+.eladmin-upload {
+ border: 1px dashed #c0ccda;
+ border-radius: 5px;
+ height: 45px;
+ line-height: 45px;
+ width: 368px;
+}
+.my-blockquote{
+ margin: 0 0 10px;
+ padding: 15px;
+ line-height: 22px;
+ border-left: 5px solid #00437B;
+ border-radius: 0 2px 2px 0;
+ background-color: #f2f2f2;
+}
+.my-code{
+ position: relative;
+ padding: 15px;
+ line-height: 20px;
+ border-left: 5px solid #ddd;
+ color: #333;
+ font-family: Courier New, serif;
+ font-size: 12px
+}
+
+.el-tabs{
+ margin-bottom: 25px;
+}
diff --git a/eladmin-web/src/assets/styles/element-ui.scss b/eladmin-web/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..8f7881c
--- /dev/null
+++ b/eladmin-web/src/assets/styles/element-ui.scss
@@ -0,0 +1,79 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+.cell {
+ .el-tag {
+ margin-right: 0;
+ }
+}
+
+.small-padding {
+ .cell {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+.fixed-width {
+ .el-button--mini {
+ padding: 7px 10px;
+ width: 60px;
+ }
+}
+
+.status-col {
+ .cell {
+ padding: 0 10px;
+ text-align: center;
+
+ .el-tag {
+ margin-right: 0;
+ }
+ }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block
+ }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+ display: inline-flex !important;
+}
diff --git a/eladmin-web/src/assets/styles/element-variables.scss b/eladmin-web/src/assets/styles/element-variables.scss
new file mode 100644
index 0000000..a4f8c4a
--- /dev/null
+++ b/eladmin-web/src/assets/styles/element-variables.scss
@@ -0,0 +1,31 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+$--color-primary: #1890ff;
+$--color-success: #13ce66;
+$--color-warning: #FFBA00;
+$--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border:1px solid#dfe6ec;
+
+/* icon font path, required */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "../../../node_modules/element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ theme: $--color-primary;
+}
diff --git a/eladmin-web/src/assets/styles/index.scss b/eladmin-web/src/assets/styles/index.scss
new file mode 100644
index 0000000..21fbda1
--- /dev/null
+++ b/eladmin-web/src/assets/styles/index.scss
@@ -0,0 +1,182 @@
+@import 'variables';
+@import 'mixin';
+@import 'transition';
+@import 'element-ui';
+@import 'sidebar';
+@import 'btn';
+@import 'eladmin';
+
+body {
+ height: 100%;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+.no-padding {
+ padding: 0 !important;
+}
+
+.padding-content {
+ padding: 4px 0;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.fr {
+ float: right;
+}
+
+.fl {
+ float: left;
+}
+
+.pr-5 {
+ padding-right: 5px;
+}
+
+.pl-5 {
+ padding-left: 5px;
+}
+
+.block {
+ display: block;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.inlineBlock {
+ display: block;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+
+aside {
+ background: #eef1f6;
+ padding: 8px 24px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+ display: block;
+ line-height: 32px;
+ font-size: 16px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+ color: #2c3e50;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ a {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px 20px 45px 20px;
+}
+
+.components-container {
+ margin: 30px 50px;
+ position: relative;
+}
+
+.pagination-container {
+ margin-top: 30px;
+}
+
+.text-center {
+ text-align: center
+}
+
+.sub-navbar {
+ height: 50px;
+ line-height: 50px;
+ position: relative;
+ width: 100%;
+ text-align: right;
+ padding-right: 20px;
+ transition: 600ms ease position;
+ background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+ .subtitle {
+ font-size: 20px;
+ color: #fff;
+ }
+
+ &.draft {
+ background: #d0d0d0;
+ }
+
+ &.deleted {
+ background: #d0d0d0;
+ }
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+//refine vue-multiselect plugin
+.multiselect {
+ line-height: 16px;
+}
+
+.multiselect--active {
+ z-index: 1000 !important;
+}
diff --git a/eladmin-web/src/assets/styles/mixin.scss b/eladmin-web/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/eladmin-web/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+@mixin pct($pct) {
+ width: #{$pct};
+ position: relative;
+ margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+ $width: $width/2;
+ $color-border-style: $height solid $color;
+ $transparent-border-style: $width solid transparent;
+ height: 0;
+ width: 0;
+
+ @if $direction==up {
+ border-bottom: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==right {
+ border-left: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+
+ @else if $direction==down {
+ border-top: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==left {
+ border-right: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+}
diff --git a/eladmin-web/src/assets/styles/sidebar.scss b/eladmin-web/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..17381fc
--- /dev/null
+++ b/eladmin-web/src/assets/styles/sidebar.scss
@@ -0,0 +1,209 @@
+#app {
+
+ .main-container {
+ min-height: 100%;
+ transition: margin-left .28s;
+ margin-left: $sideBarWidth;
+ position: relative;
+ }
+
+ .sidebar-container {
+ transition: width 0.28s;
+ width: $sideBarWidth !important;
+ background-color: $menuBg;
+ height: 100%;
+ position: fixed;
+ font-size: 0;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ overflow: hidden;
+
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ overflow-x: hidden !important;
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: $menuHover !important;
+ }
+ }
+
+ .is-active>.el-submenu__title {
+ color: $subMenuActiveText !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $sideBarWidth !important;
+ background-color: $subMenuBg !important;
+
+ &:hover {
+ background-color: $subMenuHover !important;
+ }
+ }
+ }
+
+ .hideSidebar {
+ .sidebar-container {
+ width: 54px !important;
+ }
+
+ .main-container {
+ margin-left: 54px;
+ }
+
+ .submenu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ .el-submenu {
+ overflow: hidden;
+
+ &>.el-submenu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ .el-submenu__icon-arrow {
+ display: none;
+ }
+ }
+ }
+
+ .el-menu--collapse {
+ .el-submenu {
+ &>.el-submenu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-submenu {
+ min-width: $sideBarWidth !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $sideBarWidth !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$sideBarWidth, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ }
+
+ .nest-menu .el-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: $menuHover !important;
+ }
+ }
+
+ // the scroll bar appears when the subMenu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/eladmin-web/src/assets/styles/transition.scss b/eladmin-web/src/assets/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/eladmin-web/src/assets/styles/transition.scss
@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/eladmin-web/src/assets/styles/variables.scss b/eladmin-web/src/assets/styles/variables.scss
new file mode 100644
index 0000000..41de79c
--- /dev/null
+++ b/eladmin-web/src/assets/styles/variables.scss
@@ -0,0 +1,35 @@
+// base color
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+// sidebar
+$menuText:#bfcbd9;
+$menuActiveText:#409EFF;
+$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#304156;
+$menuHover:#263445;
+
+$subMenuBg:#1f2d3d;
+$subMenuHover:#001528;
+
+$sideBarWidth: 205px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuText: $menuText;
+ menuActiveText: $menuActiveText;
+ subMenuActiveText: $subMenuActiveText;
+ menuBg: $menuBg;
+ menuHover: $menuHover;
+ subMenuBg: $subMenuBg;
+ subMenuHover: $subMenuHover;
+ sideBarWidth: $sideBarWidth;
+}
diff --git a/eladmin-web/src/components/Breadcrumb/index.vue b/eladmin-web/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..204ea59
--- /dev/null
+++ b/eladmin-web/src/components/Breadcrumb/index.vue
@@ -0,0 +1,81 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/eladmin-web/src/components/Crud/CRUD.operation.vue b/eladmin-web/src/components/Crud/CRUD.operation.vue
new file mode 100644
index 0000000..33d2077
--- /dev/null
+++ b/eladmin-web/src/components/Crud/CRUD.operation.vue
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
diff --git a/eladmin-web/src/views/tools/swagger/index.vue b/eladmin-web/src/views/tools/swagger/index.vue
new file mode 100644
index 0000000..5162cd9
--- /dev/null
+++ b/eladmin-web/src/views/tools/swagger/index.vue
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/eladmin-web/vue.config.js b/eladmin-web/vue.config.js
new file mode 100644
index 0000000..d6a792f
--- /dev/null
+++ b/eladmin-web/vue.config.js
@@ -0,0 +1,147 @@
+'use strict'
+const path = require('path')
+const defaultSettings = require('./src/settings.js')
+const CompressionPlugin = require('compression-webpack-plugin')
+
+function resolve(dir) {
+ return path.join(__dirname, dir)
+}
+
+const name = defaultSettings.title // 网址标题
+const port = 8013 // 端口配置
+
+// All configuration item explanations can be find in https://cli.vuejs.org/config/
+module.exports = {
+ // hash 模式下可使用
+ // publicPath: process.env.NODE_ENV === 'development' ? '/' : './',
+ publicPath: '/',
+ outputDir: 'dist',
+ assetsDir: 'static',
+ lintOnSave: process.env.NODE_ENV === 'development',
+ productionSourceMap: false,
+ devServer: {
+ port: port,
+ open: true,
+ overlay: {
+ warnings: false,
+ errors: true
+ },
+ proxy: {
+ '/api': {
+ target: process.env.VUE_APP_BASE_API,
+ changeOrigin: true,
+ pathRewrite: {
+ '^/api': 'api'
+ }
+ },
+ '/auth': {
+ target: process.env.VUE_APP_BASE_API,
+ changeOrigin: true,
+ pathRewrite: {
+ '^/auth': 'auth'
+ }
+ }
+ }
+ },
+ configureWebpack: {
+ // provide the app's title in webpack's name field, so that
+ // it can be accessed in index.html to inject the correct title.
+ name: name,
+ resolve: {
+ alias: {
+ '@': resolve('src'),
+ '@crud': resolve('src/components/Crud')
+ }
+ },
+ plugins: [
+ // https://www.ydyno.com/archives/1260.html 使用gzip解压缩静态文件
+ new CompressionPlugin({
+ test: /\.(js|css|html)?$/i, // 压缩文件格式
+ filename: '[path].gz[query]', // 压缩后的文件名
+ algorithm: 'gzip', // 使用gzip压缩
+ minRatio: 0.8 // 压缩率小于1才会压缩
+ })
+ ]
+ },
+ chainWebpack(config) {
+ config.plugins.delete('preload') // TODO: need test
+ config.plugins.delete('prefetch') // TODO: need test
+
+ // set svg-sprite-loader
+ config.module
+ .rule('svg')
+ .exclude.add(resolve('src/assets/icons'))
+ .end()
+ config.module
+ .rule('icons')
+ .test(/\.svg$/)
+ .include.add(resolve('src/assets/icons'))
+ .end()
+ .use('svg-sprite-loader')
+ .loader('svg-sprite-loader')
+ .options({
+ symbolId: 'icon-[name]'
+ })
+ .end()
+
+ // set preserveWhitespace
+ config.module
+ .rule('vue')
+ .use('vue-loader')
+ .loader('vue-loader')
+ .tap(options => {
+ options.compilerOptions.preserveWhitespace = true
+ return options
+ })
+ .end()
+
+ config
+ // https://webpack.js.org/configuration/devtool/#development
+ .when(process.env.NODE_ENV === 'development',
+ config => config.devtool('cheap-source-map')
+ )
+
+ config
+ .when(process.env.NODE_ENV !== 'development',
+ config => {
+ config
+ .plugin('ScriptExtHtmlWebpackPlugin')
+ .after('html')
+ .use('script-ext-html-webpack-plugin', [{
+ // `runtime` must same as runtimeChunk name. default is `runtime`
+ inline: /runtime\..*\.js$/
+ }])
+ .end()
+ config
+ .optimization.splitChunks({
+ chunks: 'all',
+ cacheGroups: {
+ libs: {
+ name: 'chunk-libs',
+ test: /[\\/]node_modules[\\/]/,
+ priority: 10,
+ chunks: 'initial' // only package third parties that are initially dependent
+ },
+ elementUI: {
+ name: 'chunk-elementUI', // split elementUI into a single package
+ priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+ test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+ },
+ commons: {
+ name: 'chunk-commons',
+ test: resolve('src/components'), // can customize your rules
+ minChunks: 3, // minimum common number
+ priority: 5,
+ reuseExistingChunk: true
+ }
+ }
+ })
+ config.optimization.runtimeChunk('single')
+ }
+ )
+ },
+ transpileDependencies: [
+ 'vue-echarts',
+ 'resize-detector'
+ ]
+}
diff --git a/eladmin/.gitignore b/eladmin/.gitignore
new file mode 100644
index 0000000..d52737e
--- /dev/null
+++ b/eladmin/.gitignore
@@ -0,0 +1,8 @@
+### IDEA ###
+~/*
+.idea/*
+*.iml
+*/target/*
+*/*.iml
+/.gradle/
+/application.pid
\ No newline at end of file
diff --git a/eladmin/LICENSE b/eladmin/LICENSE
new file mode 100644
index 0000000..ca38718
--- /dev/null
+++ b/eladmin/LICENSE
@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "{}" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+ Copyright 2019-2020 Zheng Jie
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/eladmin/README.md b/eladmin/README.md
new file mode 100644
index 0000000..6294477
--- /dev/null
+++ b/eladmin/README.md
@@ -0,0 +1,104 @@
+
ELADMIN 后台管理系统
+
+#### 项目简介
+一个基于 Spring Boot 2.1.0 、 Mybatis-Plus、 JWT、Spring Security、Redis、Vue的前后端分离的后台管理系统
+
+**开发文档:** [https://eladmin.vip](https://eladmin.vip)
+
+**体验地址:** [https://eladmin.vip/demo](https://eladmin.vip/demo)
+
+**账号密码:** `admin / 123456`
+
+#### 项目源码
+
+| | 后端源码 | 前端源码 |
+|--- |--------------------------------------| --- |
+| github | https://github.com/elunez/eladmin-mp | https://github.com/elunez/eladmin-web-mp |
+| 码云 | https://gitee.com/elunez/eladmin-mp | https://gitee.com/elunez/eladmin-web-mp |
+
+#### 赞助商 | Sponsor
+
+
+
+
+
+#### 主要特性
+- 使用最新技术栈,社区资源丰富。
+- 高效率开发,代码生成器可一键生成前后端代码
+- 支持数据字典,可方便地对一些状态进行管理
+- 支持接口限流,避免恶意请求导致服务层压力过大
+- 支持接口级别的功能权限与数据权限,可自定义操作
+- 自定义权限注解与匿名接口注解,可快速对接口拦截与放行
+- 对一些常用地前端组件封装:表格数据请求、数据字典等
+- 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断
+- 支持在线用户管理与服务器性能监控,支持限制单用户登录
+- 支持运维管理,可方便地对远程服务器的应用进行部署与管理
+
+#### 系统功能
+- 用户管理:提供用户的相关配置,新增用户后,默认密码为123456
+- 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
+- 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
+- 部门管理:可配置系统组织架构,树形表格展示
+- 岗位管理:配置各个部门的职位
+- 字典管理:可维护常用一些固定的数据,如:状态,性别等
+- 系统日志:记录用户操作日志与异常日志,方便开发人员定位排错
+- SQL监控:采用druid 监控数据库访问性能,默认用户名admin,密码123456
+- 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然
+- 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务
+- 邮件工具:配合富文本,发送html格式的邮件
+- 七牛云存储:可同步七牛云存储的数据到系统,无需登录七牛云直接操作云数据
+- 支付宝支付:整合了支付宝支付并且提供了测试账号,可自行测试
+- 服务监控:监控服务器的负载情况
+- 运维管理:一键部署你的应用
+
+#### 项目结构
+项目采用按功能分模块的开发方式,结构如下
+
+- `eladmin-common` 为系统的公共模块,各种工具类,公共配置存在该模块
+
+- `eladmin-system` 为系统核心模块也是项目入口模块,也是最终需要打包部署的模块
+
+- `eladmin-logging` 为系统的日志模块,其他模块如果需要记录日志需要引入该模块
+
+- `eladmin-tools` 为第三方工具模块,包含:图床、邮件、云存储、本地存储、支付宝
+
+- `eladmin-generator` 为系统的代码生成模块,代码生成的模板在 system 模块中
+
+#### 详细结构
+
+```
+- eladmin-common 公共模块
+ - annotation 为系统自定义注解
+ - aspect 自定义注解的切面
+ - base 提供了Entity、DTO基类和mapstruct的通用mapper
+ - config 自定义权限实现、redis配置、swagger配置、Rsa配置等
+ - exception 项目统一异常的处理
+ - utils 系统通用工具类
+- eladmin-system 系统核心模块(系统启动入口)
+ - config 配置跨域与静态资源,与数据权限
+ - thread 线程池相关
+ - modules 系统相关模块(登录授权、系统监控、定时任务、运维管理等)
+- eladmin-logging 系统日志模块
+- eladmin-tools 系统第三方工具模块
+- eladmin-generator 系统代码生成模块
+```
+
+#### 特别鸣谢
+
+- 感谢 [七牛云](https://portal.qiniu.com/signup?utm_source=kaiyuan&utm_media=ELADMIN) 提供的免费云存储与CDN加速支持
+
+- 感谢 [JetBrains](https://www.jetbrains.com/) 提供的非商业开源软件开发授权
+
+- 感谢 [PanJiaChen](https://github.com/PanJiaChen/vue-element-admin) 大佬提供的前端模板
+
+- 感谢 [Moxun](https://github.com/moxun1639) 大佬提供的前端 Curd 通用组件
+
+- 感谢 [zhy6599](https://gitee.com/zhy6599) 大佬提供的后端运维管理相关功能
+
+- 感谢 [j.yao.SUSE](https://github.com/everhopingandwaiting) 大佬提供的匿名接口与Redis限流等功能
+
+#### 项目捐赠
+项目的发展离不开你的支持,请作者喝杯咖啡吧☕ [Donate](https://eladmin.vip/donation/)
+
+#### 反馈交流
+- QQ交流群:一群:891137268 、二群:947578238、三群:659622532
\ No newline at end of file
diff --git a/eladmin/eladmin-common/pom.xml b/eladmin/eladmin-common/pom.xml
new file mode 100644
index 0000000..c5dc3ae
--- /dev/null
+++ b/eladmin/eladmin-common/pom.xml
@@ -0,0 +1,26 @@
+
+
+
+ eladmin
+ me.zhengjie
+ 2.6
+
+ 4.0.0
+
+ 5.8.19
+
+
+ eladmin-common
+ 公共模块
+
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+
\ No newline at end of file
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/AnonymousAccess.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/AnonymousAccess.java
new file mode 100644
index 0000000..b2c168f
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/AnonymousAccess.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2019-2020 Zheng Jie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package me.zhengjie.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jacky
+ * 用于标记匿名访问方法
+ */
+@Inherited
+@Documented
+@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AnonymousAccess {
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/Limit.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/Limit.java
new file mode 100644
index 0000000..58b41cf
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/Limit.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019-2020 Zheng Jie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package me.zhengjie.annotation;
+
+import me.zhengjie.aspect.LimitType;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author jacky
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Limit {
+
+ // 资源名称,用于描述接口功能
+ String name() default "";
+
+ // 资源 key
+ String key() default "";
+
+ // key prefix
+ String prefix() default "";
+
+ // 时间的,单位秒
+ int period();
+
+ // 限制访问次数
+ int count();
+
+ // 限制类型
+ LimitType limitType() default LimitType.CUSTOMER;
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousDeleteMapping.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousDeleteMapping.java
new file mode 100644
index 0000000..6a81c2e
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousDeleteMapping.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2002-2016 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package me.zhengjie.annotation.rest;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import me.zhengjie.annotation.AnonymousAccess;
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * Annotation for mapping HTTP {@code DELETE} requests onto specific handler
+ * methods.
+ * 支持匿名访问 DeleteMapping
+ *
+ * @author liaojinlong
+ * @see AnonymousGetMapping
+ * @see AnonymousPostMapping
+ * @see AnonymousPutMapping
+ * @see AnonymousPatchMapping
+ * @see RequestMapping
+ */
+@AnonymousAccess
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@RequestMapping(method = RequestMethod.DELETE)
+public @interface AnonymousDeleteMapping {
+
+ /**
+ * Alias for {@link RequestMapping#name}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String name() default "";
+
+ /**
+ * Alias for {@link RequestMapping#value}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] value() default {};
+
+ /**
+ * Alias for {@link RequestMapping#path}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] path() default {};
+
+ /**
+ * Alias for {@link RequestMapping#params}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] params() default {};
+
+ /**
+ * Alias for {@link RequestMapping#headers}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] headers() default {};
+
+ /**
+ * Alias for {@link RequestMapping#consumes}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] consumes() default {};
+
+ /**
+ * Alias for {@link RequestMapping#produces}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] produces() default {};
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousGetMapping.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousGetMapping.java
new file mode 100644
index 0000000..c260a71
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousGetMapping.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2002-2016 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package me.zhengjie.annotation.rest;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import me.zhengjie.annotation.AnonymousAccess;
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * Annotation for mapping HTTP {@code GET} requests onto specific handler
+ * methods.
+ *
+ * 支持匿名访问 GetMapping
+ *
+ * @author liaojinlong
+ * @see RequestMapping
+ */
+@AnonymousAccess
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@RequestMapping(method = RequestMethod.GET)
+public @interface AnonymousGetMapping {
+
+ /**
+ * Alias for {@link RequestMapping#name}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String name() default "";
+
+ /**
+ * Alias for {@link RequestMapping#value}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] value() default {};
+
+ /**
+ * Alias for {@link RequestMapping#path}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] path() default {};
+
+ /**
+ * Alias for {@link RequestMapping#params}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] params() default {};
+
+ /**
+ * Alias for {@link RequestMapping#headers}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] headers() default {};
+
+ /**
+ * Alias for {@link RequestMapping#consumes}.
+ *
+ * @since 4.3.5
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] consumes() default {};
+
+ /**
+ * Alias for {@link RequestMapping#produces}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] produces() default {};
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPatchMapping.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPatchMapping.java
new file mode 100644
index 0000000..6686617
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPatchMapping.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2002-2016 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package me.zhengjie.annotation.rest;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import me.zhengjie.annotation.AnonymousAccess;
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * Annotation for mapping HTTP {@code PATCH} requests onto specific handler
+ * methods.
+ * * 支持匿名访问 PatchMapping
+ *
+ * @author liaojinlong
+ * @see AnonymousGetMapping
+ * @see AnonymousPostMapping
+ * @see AnonymousPutMapping
+ * @see AnonymousDeleteMapping
+ * @see RequestMapping
+ */
+@AnonymousAccess
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@RequestMapping(method = RequestMethod.PATCH)
+public @interface AnonymousPatchMapping {
+
+ /**
+ * Alias for {@link RequestMapping#name}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String name() default "";
+
+ /**
+ * Alias for {@link RequestMapping#value}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] value() default {};
+
+ /**
+ * Alias for {@link RequestMapping#path}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] path() default {};
+
+ /**
+ * Alias for {@link RequestMapping#params}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] params() default {};
+
+ /**
+ * Alias for {@link RequestMapping#headers}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] headers() default {};
+
+ /**
+ * Alias for {@link RequestMapping#consumes}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] consumes() default {};
+
+ /**
+ * Alias for {@link RequestMapping#produces}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] produces() default {};
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPostMapping.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPostMapping.java
new file mode 100644
index 0000000..8f1cdcd
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPostMapping.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2002-2016 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package me.zhengjie.annotation.rest;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import me.zhengjie.annotation.AnonymousAccess;
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * Annotation for mapping HTTP {@code POST} requests onto specific handler
+ * methods.
+ * 支持匿名访问 PostMapping
+ *
+ * @author liaojinlong
+ * @see AnonymousGetMapping
+ * @see AnonymousPostMapping
+ * @see AnonymousPutMapping
+ * @see AnonymousDeleteMapping
+ * @see RequestMapping
+ */
+@AnonymousAccess
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@RequestMapping(method = RequestMethod.POST)
+public @interface AnonymousPostMapping {
+
+ /**
+ * Alias for {@link RequestMapping#name}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String name() default "";
+
+ /**
+ * Alias for {@link RequestMapping#value}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] value() default {};
+
+ /**
+ * Alias for {@link RequestMapping#path}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] path() default {};
+
+ /**
+ * Alias for {@link RequestMapping#params}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] params() default {};
+
+ /**
+ * Alias for {@link RequestMapping#headers}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] headers() default {};
+
+ /**
+ * Alias for {@link RequestMapping#consumes}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] consumes() default {};
+
+ /**
+ * Alias for {@link RequestMapping#produces}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] produces() default {};
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPutMapping.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPutMapping.java
new file mode 100644
index 0000000..7c417da
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/annotation/rest/AnonymousPutMapping.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2002-2016 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package me.zhengjie.annotation.rest;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import me.zhengjie.annotation.AnonymousAccess;
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * Annotation for mapping HTTP {@code PUT} requests onto specific handler
+ * methods.
+ * * 支持匿名访问 PutMapping
+ *
+ * @author liaojinlong
+ * @see AnonymousGetMapping
+ * @see AnonymousPostMapping
+ * @see AnonymousPutMapping
+ * @see AnonymousDeleteMapping
+ * @see RequestMapping
+ */
+@AnonymousAccess
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@RequestMapping(method = RequestMethod.PUT)
+public @interface AnonymousPutMapping {
+
+ /**
+ * Alias for {@link RequestMapping#name}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String name() default "";
+
+ /**
+ * Alias for {@link RequestMapping#value}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] value() default {};
+
+ /**
+ * Alias for {@link RequestMapping#path}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] path() default {};
+
+ /**
+ * Alias for {@link RequestMapping#params}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] params() default {};
+
+ /**
+ * Alias for {@link RequestMapping#headers}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] headers() default {};
+
+ /**
+ * Alias for {@link RequestMapping#consumes}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] consumes() default {};
+
+ /**
+ * Alias for {@link RequestMapping#produces}.
+ */
+ @AliasFor(annotation = RequestMapping.class)
+ String[] produces() default {};
+
+}
diff --git a/eladmin/eladmin-common/src/main/java/me/zhengjie/aspect/LimitAspect.java b/eladmin/eladmin-common/src/main/java/me/zhengjie/aspect/LimitAspect.java
new file mode 100644
index 0000000..31f4040
--- /dev/null
+++ b/eladmin/eladmin-common/src/main/java/me/zhengjie/aspect/LimitAspect.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2019-2020 Zheng Jie
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package me.zhengjie.aspect;
+
+import com.google.common.collect.ImmutableList;
+import me.zhengjie.annotation.Limit;
+import me.zhengjie.exception.BadRequestException;
+import me.zhengjie.utils.RequestHolder;
+import me.zhengjie.utils.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
+import org.springframework.data.redis.core.script.RedisScript;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+
+/**
+ * @author /
+ */
+@Aspect
+@Component
+public class LimitAspect {
+
+ private final RedisTemplate