├── .gitignore
├── LICENSE
├── README.md
├── apidoc-footer.md
├── apidoc-header.md
├── apidoc.json
├── java-spring-boot-admin.iml
├── mvnw
├── mvnw.cmd
├── pom.xml
├── slipper-backstage
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── slipper
│ │ │ ├── SlipperApplication.java
│ │ │ └── modules
│ │ │ ├── AbstractController.java
│ │ │ ├── administrator
│ │ │ └── AdministratorController.java
│ │ │ ├── captcha
│ │ │ └── CaptchaController.java
│ │ │ ├── enterprise
│ │ │ └── EnterpriseController.java
│ │ │ ├── enterpriseMenu
│ │ │ └── EnterpriseMenuController.java
│ │ │ ├── file
│ │ │ └── FileController.java
│ │ │ ├── home
│ │ │ └── HomeController.java
│ │ │ ├── log
│ │ │ ├── LoginLogController.java
│ │ │ └── OperationLogController.java
│ │ │ ├── login
│ │ │ └── LoginController.java
│ │ │ ├── menu
│ │ │ └── MenuController.java
│ │ │ └── role
│ │ │ └── RoleController.java
│ └── resources
│ │ ├── application-dev.yml
│ │ ├── application-prod.yml
│ │ ├── application-test.yml
│ │ ├── application.yml
│ │ ├── banner.txt
│ │ ├── logback-spring.xml
│ │ └── static
│ │ └── apidoc
│ │ ├── assets
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── apple-touch-icon.png
│ │ ├── bootstrap.min.css
│ │ ├── bootstrap.min.css.map
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ ├── glyphicons-halflings-regular.woff2
│ │ ├── main.bundle.js
│ │ ├── main.css
│ │ └── prism.css
│ │ └── index.html
│ └── test
│ └── java
│ └── com
│ └── slipper
│ └── SlipperBackstageApplicationTests.java
├── slipper-common
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── slipper
│ │ └── common
│ │ ├── config
│ │ ├── CaptchaConfig.java
│ │ └── ValidatorConfig.java
│ │ ├── exception
│ │ └── RunException.java
│ │ ├── utils
│ │ ├── BeanUtils.java
│ │ ├── Common.java
│ │ ├── Constant.java
│ │ ├── DateUtils.java
│ │ ├── HttpContextUtils.java
│ │ ├── HttpUtils.java
│ │ ├── Query.java
│ │ ├── R.java
│ │ ├── RPage.java
│ │ ├── RequestBody.java
│ │ ├── SpringContext.java
│ │ └── TokenUtils.java
│ │ └── validator
│ │ ├── ValidatorUtils.java
│ │ └── group
│ │ ├── Also.java
│ │ ├── Create.java
│ │ └── Update.java
│ └── resources
│ └── application.properties
├── slipper-core
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── slipper
│ │ └── core
│ │ ├── config
│ │ ├── FilterConfig.java
│ │ ├── MybatisPlusConfig.java
│ │ ├── RedisConfig.java
│ │ └── WebMvcConfig.java
│ │ ├── utils
│ │ └── RedisUtils.java
│ │ └── xss
│ │ ├── HTMLFilter.java
│ │ ├── XssFilter.java
│ │ └── XssHttpServletRequestWrapper.java
│ └── resources
│ └── application.properties
├── slipper-service
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── slipper
│ │ └── service
│ │ ├── annotation
│ │ └── Log.java
│ │ ├── aspect
│ │ └── LogAspect.java
│ │ ├── handler
│ │ └── RunExceptionHandler.java
│ │ ├── model
│ │ ├── DateModel.java
│ │ ├── KeyModel.java
│ │ ├── KeyValueModel.java
│ │ ├── KeysModel.java
│ │ ├── PageDateModel.java
│ │ └── PageModel.java
│ │ └── modules
│ │ ├── administrator
│ │ ├── dao
│ │ │ ├── AdministratorDao.java
│ │ │ └── AdministratorRoleDao.java
│ │ ├── entity
│ │ │ ├── AdministratorEntity.java
│ │ │ └── AdministratorRoleEntity.java
│ │ ├── model
│ │ │ ├── dto
│ │ │ │ └── AdministratorRoleDTO.java
│ │ │ ├── form
│ │ │ │ ├── AdministratorCreateOrUpdateForm.java
│ │ │ │ ├── AdministratorOnlinePageForm.java
│ │ │ │ ├── AdministratorPageDateForm.java
│ │ │ │ ├── AdministratorUpdateBasicForm.java
│ │ │ │ ├── AdministratorUpdatePasswordForm.java
│ │ │ │ └── EnterpriseAdministratorPageDateForm.java
│ │ │ └── vo
│ │ │ │ └── AdministratorOnlineVO.java
│ │ └── service
│ │ │ ├── AdministratorRoleService.java
│ │ │ ├── AdministratorService.java
│ │ │ └── impl
│ │ │ ├── AdministratorRoleServiceImpl.java
│ │ │ └── AdministratorServiceImpl.java
│ │ ├── captcha
│ │ ├── dao
│ │ │ └── CaptchaDao.java
│ │ ├── entity
│ │ │ └── CaptchaEntity.java
│ │ └── service
│ │ │ ├── CaptchaService.java
│ │ │ └── impl
│ │ │ └── CaptchaServiceImpl.java
│ │ ├── enterprise
│ │ ├── dao
│ │ │ ├── EnterpriseDao.java
│ │ │ └── EnterpriseMenuDao.java
│ │ ├── entity
│ │ │ ├── EnterpriseEntity.java
│ │ │ └── EnterpriseMenuEntity.java
│ │ ├── model
│ │ │ ├── dto
│ │ │ │ └── EnterpriseMenuTreeDTO.java
│ │ │ ├── form
│ │ │ │ ├── EnterpriseCreateOrUpdateForm.java
│ │ │ │ ├── EnterpriseMenuModifyForm.java
│ │ │ │ ├── EnterpriseMenuUpdateForm.java
│ │ │ │ ├── EnterprisePageDateForm.java
│ │ │ │ └── EnterprisePageForm.java
│ │ │ └── vo
│ │ │ │ ├── EnterpriseMenuSimplifyTreeVO.java
│ │ │ │ ├── EnterpriseMenuTreeVO.java
│ │ │ │ ├── EnterpriseMenuVO.java
│ │ │ │ ├── EnterpriseSimplifyVO.java
│ │ │ │ └── EnterpriseVO.java
│ │ └── service
│ │ │ ├── EnterpriseMenuService.java
│ │ │ ├── EnterpriseService.java
│ │ │ └── impl
│ │ │ ├── EnterpriseMenuServiceImpl.java
│ │ │ └── EnterpriseServiceImpl.java
│ │ ├── file
│ │ ├── dao
│ │ │ └── FileDao.java
│ │ ├── entity
│ │ │ └── FileEntity.java
│ │ ├── model
│ │ │ ├── form
│ │ │ │ └── FilePageDateForm.java
│ │ │ └── vo
│ │ │ │ ├── FileSimplifyVO.java
│ │ │ │ └── FileVO.java
│ │ ├── service
│ │ │ ├── FileService.java
│ │ │ └── impl
│ │ │ │ └── FileServiceImpl.java
│ │ └── utils
│ │ │ └── FileUtils.java
│ │ ├── log
│ │ ├── login
│ │ │ ├── dao
│ │ │ │ └── LoginLogDao.java
│ │ │ ├── entity
│ │ │ │ └── LoginLogEntity.java
│ │ │ ├── model
│ │ │ │ ├── form
│ │ │ │ │ └── LoginLogPageDateForm.java
│ │ │ │ └── vo
│ │ │ │ │ ├── LoginLogSimplifyVO.java
│ │ │ │ │ ├── LoginLogVO.java
│ │ │ │ │ └── VisitsVO.java
│ │ │ └── service
│ │ │ │ ├── LoginLogService.java
│ │ │ │ └── impl
│ │ │ │ └── LoginLogServiceImpl.java
│ │ └── operation
│ │ │ ├── dao
│ │ │ └── OperationLogDao.java
│ │ │ ├── entity
│ │ │ └── OperationLogEntity.java
│ │ │ ├── model
│ │ │ ├── form
│ │ │ │ └── OperationLogPageDateForm.java
│ │ │ └── vo
│ │ │ │ ├── OperationLogSimplifyVO.java
│ │ │ │ └── OperationLogVO.java
│ │ │ └── service
│ │ │ ├── OperationLogService.java
│ │ │ └── impl
│ │ │ └── OperationLogServiceImpl.java
│ │ ├── login
│ │ ├── model
│ │ │ └── form
│ │ │ │ └── BackstageLoginForm.java
│ │ └── service
│ │ │ ├── LoginService.java
│ │ │ └── impl
│ │ │ └── LoginServiceImpl.java
│ │ ├── menu
│ │ ├── dao
│ │ │ └── MenuDao.java
│ │ ├── entity
│ │ │ └── MenuEntity.java
│ │ ├── model
│ │ │ ├── form
│ │ │ │ ├── MenuCreateOrUpdateForm.java
│ │ │ │ └── MenuUpdateParentAndSortForm.java
│ │ │ └── vo
│ │ │ │ ├── MenuSimplifyTreeVO.java
│ │ │ │ ├── MenuTreeVO.java
│ │ │ │ └── MenuVO.java
│ │ └── service
│ │ │ ├── MenuService.java
│ │ │ └── impl
│ │ │ └── MenuServiceImpl.java
│ │ ├── role
│ │ ├── dao
│ │ │ ├── RoleDao.java
│ │ │ └── RoleMenuDao.java
│ │ ├── entity
│ │ │ ├── RoleEntity.java
│ │ │ └── RoleMenuEntity.java
│ │ ├── model
│ │ │ ├── dto
│ │ │ │ ├── RoleMenuDTO.java
│ │ │ │ └── RoleSimplifyDTO.java
│ │ │ ├── form
│ │ │ │ ├── EnterpriseRolePageForm.java
│ │ │ │ ├── RoleCreateOrUpdateForm.java
│ │ │ │ └── RolePageForm.java
│ │ │ └── vo
│ │ │ │ ├── RoleInfoVO.java
│ │ │ │ ├── RolePageVO.java
│ │ │ │ └── RoleVO.java
│ │ └── service
│ │ │ ├── RoleMenuService.java
│ │ │ ├── RoleService.java
│ │ │ └── impl
│ │ │ ├── RoleMenuServiceImpl.java
│ │ │ └── RoleServiceImpl.java
│ │ └── token
│ │ ├── dao
│ │ └── TokenDao.java
│ │ ├── entity
│ │ └── TokenEntity.java
│ │ └── service
│ │ ├── TokenService.java
│ │ └── impl
│ │ └── TokenServiceImpl.java
│ └── resources
│ ├── application.properties
│ └── mapper
│ ├── administrator
│ ├── AdministratorDao.xml
│ └── AdministratorRoleDao.xml
│ ├── captcha
│ └── CaptchaDao.xml
│ ├── enterprise
│ ├── EnterpriseDao.xml
│ └── EnterpriseMenuDao.xml
│ ├── file
│ └── FileDao.xml
│ ├── log
│ ├── login
│ │ └── LoginLogDao.xml
│ └── operation
│ │ └── OperationLogDao.xml
│ ├── menu
│ └── MenuDao.xml
│ ├── role
│ ├── RoleDao.xml
│ └── RoleMenuDao.xml
│ └── token
│ └── TokenDao.xml
└── slipper-shiro
├── pom.xml
└── src
└── main
├── java
└── com
│ └── slipper
│ └── shiro
│ ├── config
│ └── ShiroConfig.java
│ ├── filter
│ └── AuthFilter.java
│ ├── realm
│ └── AuthRealm.java
│ ├── service
│ ├── ShiroService.java
│ └── impl
│ │ └── ShiroServiceImpl.java
│ ├── token
│ └── AuthToken.java
│ └── utils
│ └── ShiroUtils.java
└── resources
└── application.properties
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**/target/
5 | !**/src/test/**/target/
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 | !**/src/main/**/build/
30 | !**/src/test/**/build/
31 |
32 | ### VS Code ###
33 | .vscode/
34 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 GuMingChen
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/apidoc-footer.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/apidoc-footer.md
--------------------------------------------------------------------------------
/apidoc-header.md:
--------------------------------------------------------------------------------
1 | **API分组说明**
2 | | 分组名称 | 对应表名 | 备注 |
3 | | :----:| :----: | :----: |
4 | | Role | role | 角色 |
5 | | Administrator | administrator | 管理员账户 |
6 | | Menu | menu | 菜单 |
7 | | Enterprise | enterprise | 企业 |
8 | | LoginLog | login_log | 登录日志 |
9 | | OperationLog | operation_log | 操作日志 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/apidoc.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Loafer",
3 | "version": "1.0.0",
4 | "description": "Api Document",
5 | "title": "Slipper",
6 | "url" : "http://localhost:8806/slipper",
7 | "header": {
8 | "title": "Tips",
9 | "filename": "apidoc-header.md"
10 | },
11 | "footer": {
12 | "title": "Footer",
13 | "filename": "apidoc-footer.md"
14 | },
15 | "order": [
16 | "GetUser",
17 | "PostUser"
18 | ],
19 | "template": {
20 | "withCompare": true,
21 | "withGenerator": true
22 | }
23 | }
--------------------------------------------------------------------------------
/slipper-backstage/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 |
7 | slipper
8 | com.slipper
9 | 2.0.0
10 |
11 |
12 | slipper-backstage
13 |
14 | 后台
15 |
16 |
17 |
18 |
19 | com.slipper
20 | slipper-service
21 |
22 |
23 |
24 | com.slipper
25 | slipper-shiro
26 |
27 |
28 |
29 |
30 |
31 |
32 | org.springframework.boot
33 | spring-boot-maven-plugin
34 | ${spring-boot.version}
35 |
36 | true
37 |
38 |
39 | org.projectlombok
40 | lombok
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/java/com/slipper/SlipperApplication.java:
--------------------------------------------------------------------------------
1 | package com.slipper;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | /**
7 | * @author gumingchen
8 | */
9 | @SpringBootApplication
10 | public class SlipperApplication {
11 |
12 | public static void main(String[] args) {
13 | SpringApplication.run(SlipperApplication.class, args);
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/java/com/slipper/modules/AbstractController.java:
--------------------------------------------------------------------------------
1 | package com.slipper.modules;
2 |
3 | import com.slipper.service.modules.administrator.model.dto.AdministratorRoleDTO;
4 | import com.slipper.shiro.utils.ShiroUtils;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | /**
9 | * Controller公共组件
10 | *
11 | * @author gumingchen
12 | * @email 1240235512@qq.com
13 | * @date 1995-08-30 00:00:00
14 | */
15 | public abstract class AbstractController {
16 | protected Logger logger = LoggerFactory.getLogger(getClass());
17 |
18 | protected AdministratorRoleDTO getAdministrator() {
19 | return ShiroUtils.getAdministrator();
20 | }
21 |
22 | protected Long getAdministratorId() {
23 | return ShiroUtils.getAdministratorId();
24 | }
25 |
26 | protected Long getEnterpriseId() {
27 | return ShiroUtils.getEnterpriseId();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/java/com/slipper/modules/captcha/CaptchaController.java:
--------------------------------------------------------------------------------
1 | package com.slipper.modules.captcha;
2 |
3 | import com.slipper.common.utils.Constant;
4 | import com.slipper.service.modules.captcha.service.CaptchaService;
5 | import org.apache.commons.io.IOUtils;
6 | import org.springframework.web.bind.annotation.GetMapping;
7 | import org.springframework.web.bind.annotation.RequestMapping;
8 | import org.springframework.web.bind.annotation.RequestParam;
9 | import org.springframework.web.bind.annotation.RestController;
10 |
11 | import javax.annotation.Resource;
12 | import javax.imageio.ImageIO;
13 | import javax.servlet.ServletOutputStream;
14 | import javax.servlet.http.HttpServletResponse;
15 | import java.io.IOException;
16 |
17 | /**
18 | * 验证码
19 | *
20 | * @author gumingchen
21 | * @email 1240235512@qq.com
22 | * @date 1995-08-30 00:00:00
23 | */
24 | @RestController
25 | @RequestMapping("/backstage")
26 | public class CaptchaController {
27 |
28 | @Resource
29 | private CaptchaService captchaService;
30 |
31 | /**
32 | * 验证码
33 | *
34 | * @api {GET} /backstage/captcha.jpg captcha
35 | * @apiDescription 验证码图片
36 | * @apiVersion 1.0.0
37 | * @apiGroup Captcha
38 | * @apiName get
39 | * @apiParamExample 请求参数示例
40 | * {
41 | * uuid: 1
42 | * }
43 | */
44 | @GetMapping("/captcha.jpg")
45 | public void get(HttpServletResponse response, @RequestParam String uuid) throws IOException {
46 | ServletOutputStream servletOutputStream = response.getOutputStream();
47 |
48 | response.setHeader("Cache-Control", "no-store");
49 | response.setHeader("Pragma", "no-cache");
50 | response.setDateHeader("Expires", 0);
51 | response.setContentType("image/jpeg");
52 |
53 | ImageIO.write(captchaService.createCaptcha(uuid, Constant.STORAGE_MODE), "jpg", servletOutputStream);
54 | IOUtils.close(servletOutputStream);
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/java/com/slipper/modules/file/FileController.java:
--------------------------------------------------------------------------------
1 | package com.slipper.modules.file;
2 |
3 | import com.slipper.common.utils.BeanUtils;
4 | import com.slipper.common.utils.R;
5 | import com.slipper.modules.AbstractController;
6 | import com.slipper.service.modules.file.model.vo.FileSimplifyVO;
7 | import com.slipper.service.modules.file.service.FileService;
8 | import org.springframework.web.bind.annotation.PostMapping;
9 | import org.springframework.web.bind.annotation.RequestMapping;
10 | import org.springframework.web.bind.annotation.RestController;
11 | import org.springframework.web.multipart.MultipartFile;
12 |
13 | import javax.annotation.Resource;
14 |
15 | /**
16 | * 文件
17 | *
18 | * @author gumingchen
19 | * @email 1240235512@qq.com
20 | * @date 2022-06-21 05:29:36
21 | */
22 | @RestController
23 | @RequestMapping("/backstage/file")
24 | public class FileController extends AbstractController {
25 | @Resource
26 | private FileService fileService;
27 |
28 | /**
29 | * 文件上传
30 | *
31 | * @api {GET} /backstage/file/upload upload
32 | * @apiDescription 上传图片
33 | * @apiVersion 1.0.0
34 | * @apiGroup File
35 | * @apiName upload
36 | * @apiParamExample 请求参数示例
37 | * {
38 | * file: (binary), // 文件流
39 | * }
40 | * @apiSuccessExample 响应结果示例
41 | * {
42 | * code: 0,
43 | * status: 'success',
44 | * message: '成功!'
45 | * data: {
46 | * id: '', // ID
47 | * original: '', // 原始名称
48 | * actual: '', // 实际名称
49 | * url: '', // 虚拟路径
50 | * }
51 | * }
52 | */
53 | @PostMapping("/upload")
54 | public R upload(MultipartFile file) {
55 | FileSimplifyVO fileSimplifyVO = new FileSimplifyVO();
56 | BeanUtils.copyProperties(fileService.create(file, getAdministratorId()), fileSimplifyVO);
57 | return R.success(fileSimplifyVO);
58 | }
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/java/com/slipper/modules/home/HomeController.java:
--------------------------------------------------------------------------------
1 | package com.slipper.modules.home;
2 |
3 | import com.slipper.common.utils.R;
4 | import com.slipper.modules.AbstractController;
5 | import com.slipper.service.modules.log.login.service.LoginLogService;
6 | import org.apache.shiro.authz.annotation.RequiresPermissions;
7 | import org.springframework.web.bind.annotation.*;
8 |
9 | import javax.annotation.Resource;
10 |
11 | /**
12 | * 首页
13 | *
14 | * @author gumingchen
15 | * @email 1240235512@qq.com
16 | * @date 1995-08-30 00:00:00
17 | */
18 | @RestController
19 | @RequestMapping("/backstage/home")
20 | public class HomeController extends AbstractController {
21 |
22 | @Resource
23 | private LoginLogService loginLogService;
24 |
25 | /**
26 | * 获取最近30天登录量
27 | *
28 | * @api {GET} /backstage/home/visits visits
29 | * @apiDescription 获取当前管理员信息
30 | * @apiVersion 1.0.0
31 | * @apiGroup Home
32 | * @apiName visits
33 | * @apiParamExample 请求参数示例
34 | * {}
35 | * @apiSuccessExample 响应结果示例
36 | * {
37 | * code: 0,
38 | * status: 'success',
39 | * message: '成功!',
40 | * data: [{
41 | * date: '', // 日期
42 | * count: '' // 数量
43 | * }]
44 | * }
45 | */
46 | @RequiresPermissions("home:visits")
47 | @GetMapping("/visits")
48 | public R queryVisits() {
49 | return R.success(loginLogService.queryVisits(30));
50 | }
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/java/com/slipper/modules/login/LoginController.java:
--------------------------------------------------------------------------------
1 | package com.slipper.modules.login;
2 |
3 | import com.slipper.common.utils.R;
4 | import com.slipper.modules.AbstractController;
5 | import com.slipper.service.modules.login.model.form.BackstageLoginForm;
6 | import com.slipper.service.modules.login.service.LoginService;
7 | import org.springframework.validation.annotation.Validated;
8 | import org.springframework.web.bind.annotation.PostMapping;
9 | import org.springframework.web.bind.annotation.RequestBody;
10 | import org.springframework.web.bind.annotation.RequestMapping;
11 | import org.springframework.web.bind.annotation.RestController;
12 |
13 | import javax.annotation.Resource;
14 |
15 | /**
16 | * 登录
17 | *
18 | * @author gumingchen
19 | * @email 1240235512@qq.com
20 | * @date 1995-08-30 00:00:00
21 | */
22 | @RestController
23 | @RequestMapping("/backstage")
24 | public class LoginController extends AbstractController {
25 |
26 | @Resource
27 | private LoginService loginService;
28 |
29 | /**
30 | * 登录
31 | *
32 | * @api {POST} /backstage/login
33 | * @apiDescription 登录
34 | * @apiVersion 1.0.0
35 | * @apiGroup Login
36 | * @apiName login
37 | * @apiParamExample 请求参数示例
38 | * {
39 | * username: '', // 帐号
40 | * password: '', // 密码
41 | * uuid: '', // UUID
42 | * code: '' // 验证码
43 | * }
44 | * @apiSuccessExample 响应结果示例
45 | * {
46 | * code: 0,
47 | * status: 'success',
48 | * message: '成功!',
49 | * data: {
50 | * admin_id: '', // 用户ID
51 | * token: '', // token
52 | * expired_at: '', // 过期时间
53 | * created_at: '' // 创建时间
54 | * }
55 | * }
56 | */
57 | @PostMapping("/login")
58 | public R login(@RequestBody @Validated BackstageLoginForm backstageLoginForm) {
59 | return R.success(loginService.backstageLogin(backstageLoginForm));
60 | }
61 |
62 | /**
63 | * 登出
64 | *
65 | * @api {POST} /backstage/logout
66 | * @apiDescription 登录
67 | * @apiVersion 1.0.0
68 | * @apiGroup Login
69 | * @apiName logout
70 | * @apiParamExample 请求参数示例
71 | * {}
72 | * @apiSuccessExample 响应结果示例
73 | * {
74 | * code: 0,
75 | * status: 'success',
76 | * message: '成功!'
77 | * }
78 | */
79 | @PostMapping("/logout")
80 | public R logout() {
81 | loginService.backstageLogout(getAdministratorId());
82 | return R.success();
83 | }
84 |
85 | }
86 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/application-dev.yml:
--------------------------------------------------------------------------------
1 | project:
2 | group: slipper
3 | name: slipper
4 |
5 | service:
6 | port: 8806
7 | context-path: /slipper
8 |
9 | database:
10 | ip: localhost
11 | port: 3306
12 | name: slipper-admin-base
13 | username: root
14 | password: root
15 |
16 | druid:
17 | url-pattern: /druid/*
18 | username:
19 | password:
20 |
21 | token:
22 | expire: 7200
23 |
24 | redis:
25 | host: localhost
26 | port: 6379
27 | password:
28 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/application-prod.yml:
--------------------------------------------------------------------------------
1 | project:
2 | group: slipper
3 | name: slipper
4 |
5 | service:
6 | port: 8806
7 | context-path: /slipper
8 |
9 | database:
10 | ip: localhost
11 | port: 3306
12 | name: slipper-admin-base
13 | username: root
14 | password: root
15 |
16 | druid:
17 | url-pattern: /druid/*
18 | username:
19 | password:
20 |
21 | token:
22 | expire: 7200
23 |
24 | redis:
25 | host: localhost
26 | port: 6379
27 | password:
28 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/application-test.yml:
--------------------------------------------------------------------------------
1 | project:
2 | group: slipper
3 | name: slipper
4 |
5 | service:
6 | port: 8806
7 | context-path: /slipper
8 |
9 | database:
10 | ip: localhost
11 | port: 3306
12 | name: slipper-admin-base
13 | username: root
14 | password: root
15 |
16 | druid:
17 | url-pattern: /druid/*
18 | username:
19 | password:
20 |
21 | token:
22 | expire: 7200
23 |
24 | redis:
25 | host: localhost
26 | port: 6379
27 | password:
28 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/banner.txt:
--------------------------------------------------------------------------------
1 | _ooOoo_
2 | o8888888o
3 | 88" . "88
4 | (| ^_^ |)
5 | O\ = /O
6 | ____/`---'\____
7 | .' \\| |// `.
8 | / \\||| : |||// \
9 | / _||||| -:- |||||- \
10 | | | \\\ - /// | |
11 | | \_| ''\---/'' | |
12 | \ .-\__ `-` ___/-. /
13 | ___`. .' /--.--\ `. . ___
14 | ."" '< `.___\_<|>_/___.' >'"".
15 | | | : `- \`.;`\ _ /`;.`/ - ` : | |
16 | \ \ `-. \_ __\ /__ _/ .-` / /
17 | ========`-.____`-.___\_____/___.-`____.-'========
18 | `=---='
19 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
20 | 佛 祖 镇 楼 永 不 宕 机
21 | 佛曰:
22 | 写 字 楼 里 写 字 间, 写 字 间 里 程 序 员;
23 | 程 序 人 员 写 程 序, 又 拿 程 序 换 酒 钱。
24 | 酒 醒 只 在 网 上 做, 酒 醉 还 来 网 下 眠;
25 | 酒 醉 酒 醒 日 复 日, 网 上 网 下 年 复 年。
26 | 但 愿 老 死 电 脑 间, 不 愿 鞠 躬 老 板 前;
27 | 奔 驰 宝 马 贵 者 趣, 公 交 自 行 程 序 员。
28 | 别 人 笑 我 忒 疯 癫, 我 笑 自 己 命 太 贱;
29 | 不 见 满 街 漂 亮 妹, 哪 个 归 得 程 序 员?
30 |
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/android-chrome-192x192.png
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/android-chrome-512x512.png
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/apple-touch-icon.png
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/favicon-16x16.png
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/favicon-32x32.png
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/favicon.ico
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-backstage/src/main/resources/static/apidoc/assets/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/slipper-backstage/src/main/resources/static/apidoc/assets/prism.css:
--------------------------------------------------------------------------------
1 | /**
2 | * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
3 | * Based on https://github.com/chriskempson/tomorrow-theme
4 | * @author Rose Pritchard
5 | */
6 |
7 | code[class*="language-"],
8 | pre[class*="language-"] {
9 | color: #ccc;
10 | background: none;
11 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
12 | font-size: 1em;
13 | text-align: left;
14 | white-space: pre;
15 | word-spacing: normal;
16 | word-break: normal;
17 | word-wrap: normal;
18 | line-height: 1.5;
19 |
20 | -moz-tab-size: 4;
21 | -o-tab-size: 4;
22 | tab-size: 4;
23 |
24 | -webkit-hyphens: none;
25 | -moz-hyphens: none;
26 | -ms-hyphens: none;
27 | hyphens: none;
28 |
29 | }
30 |
31 | /* Code blocks */
32 | pre[class*="language-"] {
33 | padding: 1em;
34 | margin: .5em 0;
35 | overflow: auto;
36 | }
37 |
38 | :not(pre) > code[class*="language-"],
39 | pre[class*="language-"] {
40 | background: #2d2d2d;
41 | }
42 |
43 | /* Inline code */
44 | :not(pre) > code[class*="language-"] {
45 | padding: .1em;
46 | border-radius: .3em;
47 | white-space: normal;
48 | }
49 |
50 | .token.comment,
51 | .token.block-comment,
52 | .token.prolog,
53 | .token.doctype,
54 | .token.cdata {
55 | color: #999;
56 | }
57 |
58 | .token.punctuation {
59 | color: #ccc;
60 | }
61 |
62 | .token.tag,
63 | .token.attr-name,
64 | .token.namespace,
65 | .token.deleted {
66 | color: #e2777a;
67 | }
68 |
69 | .token.function-name {
70 | color: #6196cc;
71 | }
72 |
73 | .token.boolean,
74 | .token.number,
75 | .token.function {
76 | color: #f08d49;
77 | }
78 |
79 | .token.property,
80 | .token.class-name,
81 | .token.constant,
82 | .token.symbol {
83 | color: #f8c555;
84 | }
85 |
86 | .token.selector,
87 | .token.important,
88 | .token.atrule,
89 | .token.keyword,
90 | .token.builtin {
91 | color: #cc99cd;
92 | }
93 |
94 | .token.string,
95 | .token.char,
96 | .token.attr-value,
97 | .token.regex,
98 | .token.variable {
99 | color: #7ec699;
100 | }
101 |
102 | .token.operator,
103 | .token.entity,
104 | .token.url {
105 | color: #67cdcc;
106 | }
107 |
108 | .token.important,
109 | .token.bold {
110 | font-weight: bold;
111 | }
112 | .token.italic {
113 | font-style: italic;
114 | }
115 |
116 | .token.entity {
117 | cursor: help;
118 | }
119 |
120 | .token.inserted {
121 | color: green;
122 | }
123 |
--------------------------------------------------------------------------------
/slipper-backstage/src/test/java/com/slipper/SlipperBackstageApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.slipper;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
7 | class SlipperBackstageApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/slipper-common/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**/target/
5 | !**/src/test/**/target/
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 | !**/src/main/**/build/
30 | !**/src/test/**/build/
31 |
32 | ### VS Code ###
33 | .vscode/
34 |
--------------------------------------------------------------------------------
/slipper-common/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gmingchen/java-spring-boot-admin/5a5972b476e0d5d1cd885b1eddc05f252f21e699/slipper-common/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/slipper-common/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
3 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/config/CaptchaConfig.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.config;
2 |
3 | import com.google.code.kaptcha.impl.DefaultKaptcha;
4 | import com.google.code.kaptcha.util.Config;
5 | import org.springframework.context.annotation.Bean;
6 | import org.springframework.stereotype.Component;
7 |
8 | import java.util.Properties;
9 |
10 | /**
11 | * Captcha 图片验证配置
12 | *
13 | * @author gumingchen
14 | * @email 1240235512@qq.com
15 | * @date 1995-08-30 00:00:00
16 | */
17 | @Component
18 | public class CaptchaConfig {
19 |
20 | @Bean
21 | public DefaultKaptcha getDefaultKaptcha() {
22 | DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
23 |
24 | Properties properties = new Properties();
25 | // 是否有边框
26 | properties.setProperty("kaptcha.border", "no");
27 | // 边框颜色
28 | properties.setProperty("kaptcha.border.color", "black");
29 | // 边框粗细
30 | properties.setProperty("kaptcha.border.thickness", "1");
31 | // 验证码生成器
32 | properties.setProperty("kaptcha.producer.impl", "DefaultKaptcha");
33 | // 验证码文本字符内容范围
34 | properties.setProperty("kaptcha.textproducer.char.string", "12345678abcdefghijklmnopqrstuvwxyz");
35 | // 验证码文本字符长度
36 | properties.setProperty("kaptcha.textproducer.char.length", "4");
37 | // 验证码文本字体样式
38 | properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier,宋体,楷体,微软雅黑");
39 | // 验证码文本字符大小
40 | properties.setProperty("kaptcha.textproducer.font.size", "40");
41 | // 验证码文本字符颜色
42 | properties.setProperty("kaptcha.textproducer.font.color", "black");
43 | // 验证码文本字符间距
44 | properties.setProperty("kaptcha.textproducer.char.space", "6");
45 | // 验证码噪点颜色
46 | properties.setProperty("kaptcha.noise.color", "black");
47 | // 验证码背景颜色渐进
48 | properties.setProperty("kaptcha.background.clear.from", "white");
49 | // 验证码背景颜色渐进
50 | properties.setProperty("kaptcha.background.clear.to", "white");
51 | // 验证码图片宽度
52 | properties.setProperty("kaptcha.image.width", "200");
53 | // 验证码图片高度
54 | properties.setProperty("kaptcha.image.height", "50");
55 | Config config = new Config(properties);
56 | defaultKaptcha.setConfig(config);
57 | return defaultKaptcha;
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/config/ValidatorConfig.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.config;
2 |
3 | import org.hibernate.validator.HibernateValidator;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 |
7 | import javax.validation.Validation;
8 | import javax.validation.Validator;
9 | import javax.validation.ValidatorFactory;
10 |
11 | /**
12 | * hibernate-validator 配置
13 | *
14 | * @author gumingchen
15 | * @email 1240235512@qq.com
16 | * @date 1995-08-30 00:00:00
17 | */
18 | @Configuration
19 | public class ValidatorConfig {
20 |
21 | @Bean
22 | public Validator validator() {
23 | return getValidator();
24 | }
25 |
26 | /**
27 | * failFast - true: 快速校验模式 false: 普通校验模式
28 | * @return
29 | */
30 | public static Validator getValidator() {
31 | ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
32 | .configure()
33 | .failFast(false)
34 | .buildValidatorFactory();
35 | Validator validator = validatorFactory.getValidator();
36 | return validator;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/exception/RunException.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.exception;
2 |
3 | import com.slipper.common.utils.Constant;
4 |
5 | import java.io.Serializable;
6 |
7 | /**
8 | * 自定义异常
9 | *
10 | * @author gumingchen
11 | * @email 1240235512@qq.com
12 | * @date 1995-08-30 00:00:00
13 | */
14 | public class RunException extends RuntimeException implements Serializable {
15 | private static final long serialVersionUID = 1L;
16 |
17 | private int code = Constant.ERROR_CODE;
18 | private String message = Constant.ERROR_MESSAGE;
19 |
20 | public RunException(int code) {
21 | super();
22 | this.code = code;
23 | }
24 |
25 | public RunException(int code, Throwable e) {
26 | super(e);
27 | this.code = code;
28 | }
29 |
30 | public RunException(String message) {
31 | super();
32 | this.message = message;
33 | }
34 |
35 | public RunException(String message, Throwable e) {
36 | super(e);
37 | this.message = message;
38 | }
39 |
40 | public RunException(int code, String message) {
41 | super();
42 | this.code = code;
43 | this.message = message;
44 | }
45 |
46 | public RunException(int code, String message, Throwable e) {
47 | super(e);
48 | this.code = code;
49 | this.message = message;
50 | }
51 |
52 | public int getCode() {
53 | return code;
54 | }
55 |
56 | public void setCode(int code) {
57 | this.code = code;
58 | }
59 |
60 | public String getMessage() {
61 | return message;
62 | }
63 |
64 | public void setMessage(String message) {
65 | this.message = message;
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/BeanUtils.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 | import java.util.function.Supplier;
6 |
7 | /**
8 | * 对象工具类
9 | * @author gumingchen
10 | */
11 | public class BeanUtils extends org.springframework.beans.BeanUtils {
12 |
13 | /**
14 | * 集合数据拷贝
15 | * @param sources 数据源数组
16 | * @param target 对象
17 | * @return
18 | */
19 | public static List copyProperties(List sources, Class target) {
20 | List result = new ArrayList<>();
21 | if (sources == null || sources.isEmpty()) {
22 | return result;
23 | }
24 | sources.forEach(f -> {
25 | T t = null;
26 | try {
27 | t = target.newInstance();
28 | } catch (InstantiationException | IllegalAccessException e) {
29 | e.printStackTrace();
30 | }
31 | copyProperties(f, t);
32 | result.add(t);
33 | });
34 | return result;
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/Common.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | /**
4 | * 通用业务工具类
5 | *
6 | * @author gumingchen
7 | * @email 1240235512@qq.com
8 | * @date 1995-08-30 00:00:00
9 | */
10 | public class Common {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/Constant.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | /**
4 | * 常量工具类
5 | *
6 | * @author gumingchen
7 | * @email 1240235512@qq.com
8 | * @date 1995-08-30 00:00:00
9 | */
10 | public class Constant {
11 | /**
12 | * 后台登录 后台验证码 存储位置:1-数据库 2-Redis
13 | */
14 | public static final Integer STORAGE_MODE = 1;
15 |
16 | /**
17 | * token 键值
18 | */
19 | public static final String TOKEN_KEY = "token";
20 |
21 | /**
22 | * 状态码 异常信息
23 | */
24 | public static final int SUCCESS_CODE = 0;
25 | public static final String SUCCESS_STATUS = "success";
26 | public static final String SUCCESS_MESSAGE = "成功!";
27 | public static final int ERROR_CODE = 500;
28 | public static final String ERROR_STATUS = "error";
29 | public static final String ERROR_MESSAGE = "未知异常!";
30 | public static final int VERIFICATION_ERROR_CODE = 400;
31 | public static final String VERIFICATION_ERROR_MESSAGE = "校验异常!";
32 | public static final int NOT_ALLOWED_CODE = 401;
33 | public static final String NOT_ALLOWED_MESSAGE = "没有权限!";
34 | public static final int NOT_FOUND_CODE = 404;
35 | public static final String NOT_FOUND_MESSAGE = "路径不存在!";
36 | public static final int METHOD_ERROR_CODE = 405;
37 | public static final String METHOD_ERROR_MESSAGE = "不支持该请求方法!";
38 | public static final int TOKEN_EXPIRE_CODE = 4001;
39 | public static final String TOKEN_EXPIRE_MESSAGE = "凭证已过期,请重新登录!";
40 | public static final int WARNING_CODE = 600;
41 |
42 | /**
43 | * 分页
44 | */
45 | public enum Page {
46 | /**
47 | * 当前页 key
48 | */
49 | CURRENT("current"),
50 | /**
51 | * 分页大小 key
52 | */
53 | SIZE("size");
54 |
55 | private final String value;
56 |
57 | Page(String value) {
58 | this.value = value;
59 | }
60 |
61 | public String getValue() {
62 | return value;
63 | }
64 | }
65 |
66 | /**
67 | * 定时任务状态
68 | */
69 | public enum TimedTaskStatus {
70 | /**
71 | * 正常
72 | */
73 | NORMAL(1),
74 | /**
75 | * 暂停
76 | */
77 | PAUSE(0);
78 |
79 | private final int value;
80 |
81 | TimedTaskStatus(int value) {
82 | this.value = value;
83 | }
84 |
85 | public int getValue() {
86 | return value;
87 | }
88 | }
89 |
90 | /**
91 | * 菜单类型
92 | */
93 | public enum MenuType {
94 | /**
95 | * 目录
96 | */
97 | CATALOG(0),
98 | /**
99 | * 菜单
100 | */
101 | MENU(1),
102 | /**
103 | * 按钮
104 | */
105 | BUTTON(2),
106 | /**
107 | * iframe
108 | */
109 | IFRAME(3),
110 | /**
111 | * 外链
112 | */
113 | URL(4);
114 |
115 | private final int value;
116 |
117 | MenuType(int value) {
118 | this.value = value;
119 | }
120 |
121 | public int getValue() {
122 | return value;
123 | }
124 | }
125 |
126 | }
127 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/HttpContextUtils.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import cn.hutool.http.useragent.UserAgent;
4 | import cn.hutool.http.useragent.UserAgentUtil;
5 | import org.apache.commons.lang3.StringUtils;
6 | import org.springframework.web.context.request.RequestContextHolder;
7 | import org.springframework.web.context.request.ServletRequestAttributes;
8 |
9 | import javax.servlet.http.HttpServletRequest;
10 | import java.util.HashMap;
11 | import java.util.Map;
12 |
13 | /**
14 | * Http 内容
15 | *
16 | * @author slipper
17 | * @email 1240235512@qq.com
18 | * @date 1995-08-30 00:00:00
19 | */
20 | public class HttpContextUtils {
21 |
22 | public static HttpServletRequest getHttpServletRequest() {
23 | return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
24 | }
25 |
26 | public static String getDomain(){
27 | HttpServletRequest request = getHttpServletRequest();
28 | StringBuffer url = request.getRequestURL();
29 | return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();
30 | }
31 |
32 | public static String getIp() {
33 | HttpServletRequest request = getHttpServletRequest();
34 | String ip = request.getHeader("X-Forwarded-For");
35 | if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
36 | // 多次反向代理后会有多个ip值,第一个ip才是真实ip
37 | int index = ip.indexOf(",");
38 | if(index != -1){
39 | return ip.substring(0,index);
40 | }else{
41 | return ip;
42 | }
43 | }
44 | ip = request.getHeader("X-Real-IP");
45 | if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
46 | return ip;
47 | }
48 | return request.getRemoteAddr();
49 | }
50 |
51 | public static String getOrigin(){
52 | HttpServletRequest request = getHttpServletRequest();
53 | return request.getHeader("Origin");
54 | }
55 |
56 | public static String getUserAgent(){
57 | HttpServletRequest request = getHttpServletRequest();
58 | return request.getHeader("User-Agent");
59 | }
60 |
61 | public static String getMethod(){
62 | HttpServletRequest request = getHttpServletRequest();
63 | return request.getMethod();
64 | }
65 |
66 | public static String getRequestUrl(){
67 | HttpServletRequest request = getHttpServletRequest();
68 | return request.getRequestURI();
69 | }
70 |
71 | public static String getOperatingSystem() {
72 | String userAgent = getUserAgent();
73 | UserAgent ua = UserAgentUtil.parse(userAgent);
74 | return ua.getOs().toString();
75 | }
76 |
77 | public static String getBrowser() {
78 | String userAgent = getUserAgent();
79 | UserAgent ua = UserAgentUtil.parse(userAgent);
80 | return ua.getBrowser().toString();
81 | }
82 |
83 | public static Map getParams(){
84 | HttpServletRequest request = getHttpServletRequest();
85 | Map map = new HashMap<>();
86 | request.getParameterMap().forEach((key, value) -> map.put(key, value[0]));
87 |
88 | return map;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/Query.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
4 |
5 | import java.util.Map;
6 |
7 | /**
8 | * 分页参数处理工具类
9 | *
10 | * @author gumingchen
11 | * @email 1240235512@qq.com
12 | * @date 1995-08-30 00:00:00
13 | * @param
14 | */
15 | public class Query {
16 |
17 | public Page getPage(Map params) {
18 | long current = 1;
19 | long size = 10;
20 |
21 | if (params.get(Constant.Page.CURRENT.getValue()) != null) {
22 | current = Long.parseLong((String) params.get(Constant.Page.CURRENT.getValue()));
23 | }
24 | if (params.get(Constant.Page.SIZE.getValue()) != null) {
25 | size = Long.parseLong((String) params.get(Constant.Page.SIZE.getValue()));
26 | }
27 |
28 | Page page = new Page<>(current, size);
29 | return page;
30 | }
31 |
32 | public Page getPage(Integer c, Integer s) {
33 | long current = c != null ? c : 1;
34 | long size = s != null ? s : 10;
35 |
36 | Page page = new Page<>(current, size);
37 | return page;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/R.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import java.io.Serializable;
4 | import java.util.HashMap;
5 |
6 | /**
7 | * 自定义响应结果工具
8 | *
9 | * @author gumingchen
10 | * @email 1240235512@qq.com
11 | * @date 1995-08-30 00:00:00
12 | */
13 | public class R extends HashMap implements Serializable {
14 | private static final long serialVersionUID = 1L;
15 |
16 | private static final String STATUS = "status";
17 | private static final String CODE = "code";
18 | private static final String MESSAGE = "message";
19 | private static final String DATA = "data";
20 |
21 | public R() {
22 | put(STATUS, Constant.SUCCESS_STATUS);
23 | put(CODE, Constant.SUCCESS_CODE);
24 | put(MESSAGE, Constant.SUCCESS_MESSAGE);
25 | }
26 |
27 | public static R success() {
28 | return new R();
29 | }
30 | public static R success(Object data) {
31 | R r = new R();
32 | r.put(DATA, data);
33 | return r;
34 | }
35 | public static R success(HashMap map) {
36 | R r = new R();
37 | r.putAll(map);
38 | return r;
39 | }
40 |
41 | public static R error() {
42 | R r = new R();
43 | r.put(STATUS, Constant.ERROR_STATUS);
44 | r.put(CODE, Constant.ERROR_CODE);
45 | r.put(MESSAGE, Constant.ERROR_MESSAGE);
46 | return r;
47 | }
48 |
49 | public static R error(Integer code) {
50 | R r = new R();
51 | r.put(STATUS, Constant.ERROR_STATUS);
52 | r.put(CODE, code);
53 | r.put(MESSAGE, Constant.ERROR_MESSAGE);
54 | return r;
55 | }
56 |
57 | public static R error(String message) {
58 | R r = new R();
59 | r.put(STATUS, Constant.ERROR_STATUS);
60 | r.put(CODE, Constant.ERROR_CODE);
61 | r.put(MESSAGE, message);
62 | return r;
63 | }
64 |
65 | public static R error(Integer code, String message) {
66 | R r = new R();
67 | r.put(STATUS, Constant.ERROR_STATUS);
68 | r.put(CODE, code);
69 | r.put(MESSAGE, message);
70 | return r;
71 | }
72 |
73 | @Override
74 | public R put(String key, Object value) {
75 | super.put(key, value);
76 | return this;
77 | }
78 |
79 | }
80 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/RPage.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import com.baomidou.mybatisplus.core.metadata.IPage;
4 | import lombok.Data;
5 |
6 | import java.io.Serializable;
7 | import java.util.List;
8 | import java.util.function.Supplier;
9 |
10 | /**
11 | * 分页结果封装工具类
12 | *
13 | * @author gumingchen
14 | * @email 1240235512@qq.com
15 | * @date 1995-08-30 00:00:00
16 | * @param
17 | */
18 | @Data
19 | public class RPage implements Serializable {
20 | private static final long serialVersionUID = 1L;
21 | /**
22 | * 当前页
23 | */
24 | private long current;
25 | /**
26 | * 分页大小
27 | */
28 | private long size;
29 | /**
30 | * 总记录数
31 | */
32 | private long total;
33 | /**
34 | * 总页数
35 | */
36 | private long pages;
37 | /**
38 | * 记录
39 | */
40 | private List list;
41 |
42 | public RPage(IPage iPage) {
43 | this.current = iPage.getCurrent();
44 | this.size = iPage.getSize();
45 | this.total = iPage.getTotal();
46 | this.pages = iPage.getPages();
47 | this.list = iPage.getRecords();
48 | }
49 |
50 | public RPage(IPage iPage, List list) {
51 | this.current = iPage.getCurrent();
52 | this.size = iPage.getSize();
53 | this.total = iPage.getTotal();
54 | this.pages = iPage.getPages();
55 | this.list = list;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/RequestBody.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import org.springframework.web.context.request.RequestContextHolder;
4 | import org.springframework.web.context.request.ServletRequestAttributes;
5 |
6 | import javax.servlet.http.HttpServletRequest;
7 |
8 | /**
9 | * request body utils
10 | *
11 | * @author gumingchen
12 | * @email 1240235512@qq.com
13 | * @date 1995-08-30 00:00:00
14 | */
15 | public class RequestBody {
16 |
17 | public static HttpServletRequest getHttpServletRequest() {
18 | return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
19 | }
20 |
21 | public static String getHeader(String name){
22 | HttpServletRequest request = getHttpServletRequest();
23 | return request.getHeader(name);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/SpringContext.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import org.springframework.beans.BeansException;
4 | import org.springframework.context.ApplicationContext;
5 | import org.springframework.context.ApplicationContextAware;
6 | import org.springframework.stereotype.Component;
7 |
8 | /**
9 | * Spring Context 工具类
10 | *
11 | * @author gumingchen
12 | * @email 1240235512@qq.com
13 | * @date 1995-08-30 00:00:00
14 | */
15 | @Component
16 | public class SpringContext implements ApplicationContextAware {
17 | public static ApplicationContext applicationContext;
18 |
19 | @Override
20 | public void setApplicationContext(ApplicationContext applicationContext)
21 | throws BeansException {
22 | SpringContext.applicationContext = applicationContext;
23 | }
24 |
25 | public static Object getBean(String name) {
26 | return applicationContext.getBean(name);
27 | }
28 |
29 | public static T getBean(String name, Class requiredType) {
30 | return applicationContext.getBean(name, requiredType);
31 | }
32 |
33 | public static boolean containsBean(String name) {
34 | return applicationContext.containsBean(name);
35 | }
36 |
37 | public static boolean isSingleton(String name) {
38 | return applicationContext.isSingleton(name);
39 | }
40 |
41 | public static Class extends Object> getType(String name) {
42 | return applicationContext.getType(name);
43 | }
44 |
45 | }
46 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/utils/TokenUtils.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.utils;
2 |
3 | import com.slipper.common.exception.RunException;
4 | import org.springframework.boot.context.properties.ConfigurationProperties;
5 | import org.springframework.stereotype.Component;
6 |
7 | import java.security.MessageDigest;
8 | import java.util.UUID;
9 |
10 | /**
11 | * 生成token
12 | *
13 | * @author gumingchen
14 | * @email 1240235512@qq.com
15 | * @date 1995-08-30 00:00:00
16 | */
17 | @ConfigurationProperties(prefix = "token")
18 | @Component
19 | public class TokenUtils {
20 |
21 | private static final char[] hexCode = "0123456789abcdef".toCharArray();
22 |
23 | private static long expire;
24 |
25 | public static String generate() {
26 | return generate(UUID.randomUUID().toString());
27 | }
28 |
29 | public static String generate(String uuid) {
30 | try {
31 | MessageDigest messageDigest = MessageDigest.getInstance("MD5");
32 | messageDigest.reset();
33 | messageDigest.update(uuid.getBytes());
34 | byte[] digest = messageDigest.digest();
35 | String token = toHexString(digest);
36 | return token;
37 | } catch (Exception e) {
38 | throw new RunException("数据库中已存在该记录!", e);
39 | }
40 | }
41 |
42 | public static String toHexString(byte[] digest) {
43 | if(digest == null) {
44 | return null;
45 | }
46 | StringBuilder r = new StringBuilder(digest.length*2);
47 | for ( byte b : digest) {
48 | r.append(hexCode[(b >> 4) & 0xF]);
49 | r.append(hexCode[(b & 0xF)]);
50 | }
51 | return r.toString();
52 | }
53 |
54 | public long getExpire() {
55 | return expire;
56 | }
57 |
58 | public void setExpire(long expire) {
59 | TokenUtils.expire = expire;
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/slipper-common/src/main/java/com/slipper/common/validator/ValidatorUtils.java:
--------------------------------------------------------------------------------
1 | package com.slipper.common.validator;
2 |
3 | import com.slipper.common.config.ValidatorConfig;
4 | import com.slipper.common.exception.RunException;
5 | import com.slipper.common.utils.Constant;
6 |
7 | import javax.validation.ConstraintViolation;
8 | import javax.validation.Validator;
9 | import java.util.Set;
10 |
11 | /**
12 | * hibernate-validator校验工具类
13 | *
14 | * @author gumingchen
15 | * @email 1240235512@qq.com
16 | * @date 1995-08-30 00:00:00
17 | */
18 | public class ValidatorUtils {
19 | private static Validator validator;
20 |
21 | static {
22 | validator = ValidatorConfig.getValidator();
23 | }
24 |
25 | /**
26 | * 功能描述:校验注解参数
27 | */
28 | public static void validated(T object, Class>... groups) throws RunException {
29 | Set> constraintViolations = validator.validate(object, groups);
30 | if (!constraintViolations.isEmpty()) {
31 | StringBuilder message = new StringBuilder();
32 | message.append(Constant.VERIFICATION_ERROR_MESSAGE);
33 | String comma = "";
34 | for (ConstraintViolation