Skip to content

Commit

Permalink
代码优化
Browse files Browse the repository at this point in the history
  • Loading branch information
elunez committed Dec 18, 2019
1 parent 7d22178 commit 8c7217e
Show file tree
Hide file tree
Showing 21 changed files with 145 additions and 85 deletions.
49 changes: 29 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
</div>

#### 项目简介
eladmin基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前后端分离的后台管理系统, 权限控制的方式为RBAC,项目支持数据字典与数据权限管理,支持一键生成前后端代码,支持前端菜单动态路由
一个基于 Spring Boot 2.1.0 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue的前后端分离的后台管理系统

**开发文档** [https://docs.auauz.net/](https://docs.auauz.net)
**项目开发文档:** [https://docs.auauz.net/](https://docs.auauz.net)

**体验地址** [https://auauz.net/](https://auauz.net/)
**稳定版本体验地址:** [https://auauz.net/](https://auauz.net/)

**账号密码** ```admin/123456```(默认密码都是123456)
**开发版本体验地址:** [http://dev.auauz.net/](http://dev.auauz.net/)

**账号密码:** `admin/123456` (默认密码都是123456)

#### 项目源码

Expand All @@ -24,43 +26,50 @@ eladmin基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前
| github | https://github.com/elunez/eladmin | https://github.com/elunez/eladmin-web |
| 码云 | https://gitee.com/elunez/eladmin | https://gitee.com/elunez/eladmin-web |

#### 主要特性
- 使用最新技术栈,社区资源丰富。
- 项目按功能模块化,提升开发,测试效率。
- 高效率开发,使用代码生成器可以一键生成前后端代码
- 支持数据字典,可方便的对一些状态进行管理
- 支持接口限流,避免恶意请求导致服务层压力过大
- 支持接口级别的功能权限与数据权限,可自定义操作
- 自定义权限注解与匿名接口注解,可快速对某一接口拦截与放行
- 对一些常用的前端组件封装:表格数据请求、数据字典等
- 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断
#### 系统功能
- 用户管理:提供用户的相关配置,新增用户后,默认密码为123456
- 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
- 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
- 部门管理:可配置系统组织架构,树形表格展示
- 岗位管理:配置各个部门的职位
- 字典管理:应广大码友的要求加入字典管理,可维护常用一些固定的数据,如:状态,性别等
- 字典管理:可维护常用一些固定的数据,如:状态,性别等
- 操作日志:记录用户操作的日志
- 异常日志:记录异常日志,方便开发人员定位错误
- 系统缓存:使用jedis将缓存操作可视化,并提供对redis的基本操作,可根据需求自行扩展
- SQL监控:采用druid 监控数据库访问性能,默认用户名admin,密码123456
- 服务器监控:被监控服务器运行eladmin-monitor信息收集工具后,可以在页面上看到CPU内存以及磁盘使用情况
- 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然
- 代码生成:高灵活度一键生成前后端代码,减少百分之80左右的工作任务
- 邮件工具:配合富文本,发送html格式的邮件
- 免费图床:使用sm.ms图床,用作公共图片上传使用
- 免费图床:使用sm.ms图床,用作公共图片上传使用,该图床不怎么稳定,不太建议使用
- 七牛云存储:可同步七牛云存储的数据到系统,无需登录七牛云直接操作云数据
- 支付宝支付:整合了支付宝支付并且提供了测试账号,可自行测试

#### 项目结构
项目采用按功能分模块开发方式,将通用的配置放在公共模块,```system```模块为系统核心模块也是项目入口模块,```logging``` 模块为系统的日志模块,```tools``` 为第三方工具模块,包含了图床、邮件、七牛云、支付宝,```generator``` 为系统的代码生成模块

- eladmin-common 公共模块
- annotation 为系统自定义注解
- aspect 自定义注解的切面
- base 提供了Entity、DTO基类和mapstruct的通用mapper
- config 自定义权限实现、redis配置、swagger配置
- exception 项目统一异常的处理
- utils 系统通用工具类
- annotation 为系统自定义注解
- aspect 自定义注解的切面
- base 提供了Entity、DTO基类和mapstruct的通用mapper
- config 自定义权限实现、redis配置、swagger配置
- exception 项目统一异常的处理
- utils 系统通用工具类
- eladmin-system 系统核心模块(系统启动入口)
- config 配置跨域与静态资源,与数据权限
- thread 线程池相关
- modules 系统相关模块(登录授权、系统监控、定时任务等)
- config 配置跨域与静态资源,与数据权限
- thread 线程池相关
- modules 系统相关模块(登录授权、系统监控、定时任务等)
- eladmin-logging 系统日志模块
- eladmin-tools 系统第三方工具模块
- config 文件上传临时路径配置
- modules 工具相关模块(第三方工具、代码生成工具)
- eladmin-generator 系统代码生成模块


#### 系统预览
Expand All @@ -83,6 +92,6 @@ eladmin基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue的前
</table>

#### 项目捐赠
项目的发展离不开你的支持,请作者喝杯咖啡吧!ps:辣条也行 ☕! [Donate](https://docs.auauz.net/#/jz)
项目的发展离不开你的支持,请作者喝杯咖啡吧 [Donate](https://docs.auauz.net/#/jz)
#### 反馈交流
- QQ交流群:891137268
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Set;

/**
* @author Zhang houying
* @date 2019-11-03
Expand Down Expand Up @@ -53,12 +55,12 @@ public ResponseEntity<Object> update(@Validated @RequestBody Server resources){
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

@DeleteMapping(value = "/{id}")
@DeleteMapping
@Log("删除服务监控")
@ApiOperation("删除服务监控")
@PreAuthorize("@el.check('server:del')")
public ResponseEntity delete(@PathVariable Integer id){
serverService.delete(id);
return new ResponseEntity(HttpStatus.OK);
public ResponseEntity<Object> delete(@RequestBody Set<Integer> ids){
serverService.delete(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* @author Zhang houying
Expand Down Expand Up @@ -53,6 +54,6 @@ public interface ServerService {
* 删除
* @param id /
*/
void delete(Integer id);
void delete(Set<Integer> id);

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* @author Zhang houying
Expand Down Expand Up @@ -91,8 +92,10 @@ public void update(Server resources) {

@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Integer id) {
serverRepository.deleteById(id);
public void delete(Set<Integer> ids) {
for (Integer id : ids) {
serverRepository.deleteById(id);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class AuthController {
private Long expiration;
@Value("${rsa.private_key}")
private String privateKey;
@Value("${single.login:true}")
@Value("${single.login:false}")
private Boolean singleLogin;
private final SecurityProperties properties;
private final RedisUtils redisUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;

/**
* @author Zheng Jie
Expand Down Expand Up @@ -43,10 +44,12 @@ public void download(HttpServletResponse response, String filter) throws IOExcep
}

@ApiOperation("踢出用户")
@DeleteMapping(value = "/{key}")
@DeleteMapping
@PreAuthorize("@el.check()")
public ResponseEntity<Object> delete(@PathVariable String key) throws Exception {
onlineUserService.kickOut(key);
public ResponseEntity<Object> delete(@RequestBody Set<String> keys) throws Exception {
for (String key : keys) {
onlineUserService.kickOut(key);
}
return new ResponseEntity<>(HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
} else {
log.debug("no valid JWT token found, uri: {}", requestRri);
}

filterChain.doFilter(servletRequest, servletResponse);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
Expand Down Expand Up @@ -44,7 +45,7 @@ public class User implements Serializable {
private UserAvatar userAvatar;

@NotBlank
@Pattern(regexp = "([a-z0-9A-Z]+[-|.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}",message = "格式错误")
@Email
private String email;

@NotBlank
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package me.zhengjie.modules.system.rest;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.zhengjie.aop.log.Log;
Expand All @@ -9,6 +11,7 @@
import me.zhengjie.modules.system.service.DeptService;
import me.zhengjie.modules.system.service.dto.DeptDto;
import me.zhengjie.modules.system.service.dto.DeptQueryCriteria;
import me.zhengjie.utils.RedisUtils;
import me.zhengjie.utils.ThrowableUtil;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand All @@ -17,7 +20,9 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
* @author Zheng Jie
Expand Down Expand Up @@ -80,13 +85,21 @@ public ResponseEntity<Object> update(@Validated(Dept.Update.class) @RequestBody

@Log("删除部门")
@ApiOperation("删除部门")
@DeleteMapping(value = "/{id}")
@DeleteMapping
@PreAuthorize("@el.check('dept:del')")
public ResponseEntity<Object> delete(@PathVariable Long id){
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
Set<DeptDto> deptDtos = new HashSet<>();
for (Long id : ids) {
List<Dept> deptList = deptService.findByPid(id);
deptDtos.add(deptService.findById(id));
if(CollectionUtil.isNotEmpty(deptList)){
deptDtos = deptService.getDeleteDepts(deptList, deptDtos);
}
}
try {
deptService.delete(id);
deptService.delete(deptDtos);
}catch (Throwable e){
ThrowableUtil.throwForeignKeyException(e, "该部门存在岗位或者角色关联,请取消关联后再试");
ThrowableUtil.throwForeignKeyException(e, "所选部门中存在岗位或者角色关联,请取消关联后再试");
}
return new ResponseEntity<>(HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
* @author Zheng Jie
Expand Down Expand Up @@ -80,13 +79,13 @@ public ResponseEntity<Object> update(@Validated(Job.Update.class) @RequestBody J

@Log("删除岗位")
@ApiOperation("删除岗位")
@DeleteMapping(value = "/{id}")
@DeleteMapping
@PreAuthorize("@el.check('job:del')")
public ResponseEntity<Object> delete(@PathVariable Long id){
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
try {
jobService.delete(id);
jobService.delete(ids);
}catch (Throwable e){
ThrowableUtil.throwForeignKeyException(e, "该岗位存在用户关联,请取消关联后再试");
ThrowableUtil.throwForeignKeyException(e, "所选岗位存在用户关联,请取消关联后再试");
}
return new ResponseEntity<>(HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,15 @@ public ResponseEntity<Object> update(@Validated(Menu.Update.class) @RequestBody

@Log("删除菜单")
@ApiOperation("删除菜单")
@DeleteMapping(value = "/{id}")
@DeleteMapping
@PreAuthorize("@el.check('menu:del')")
public ResponseEntity<Object> delete(@PathVariable Long id){
List<Menu> menuList = menuService.findByPid(id);
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
Set<Menu> menuSet = new HashSet<>();
menuSet.add(menuService.findOne(id));
menuSet = menuService.getDeleteMenus(menuList, menuSet);
for (Long id : ids) {
List<Menu> menuList = menuService.findByPid(id);
menuSet.add(menuService.findOne(id));
menuSet = menuService.getDeleteMenus(menuList, menuSet);
}
menuService.delete(menuSet);
return new ResponseEntity<>(HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -116,14 +117,10 @@ public ResponseEntity<Object> updateMenu(@RequestBody Role resources){

@Log("删除角色")
@ApiOperation("删除角色")
@DeleteMapping(value = "/{id}")
@DeleteMapping
@PreAuthorize("@el.check('roles:del')")
public ResponseEntity<Object> delete(@PathVariable Long id){
try {
roleService.delete(id);
}catch (Throwable e){
ThrowableUtil.throwForeignKeyException(e, "该角色存在用户关联,请取消关联后再试");
}
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
roleService.delete(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,18 @@ public ResponseEntity<Object> center(@Validated(User.Update.class) @RequestBody

@Log("删除用户")
@ApiOperation("删除用户")
@DeleteMapping(value = "/{id}")
@DeleteMapping
@PreAuthorize("@el.check('user:del')")
public ResponseEntity<Object> delete(@PathVariable Long id){
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
UserDto user = userService.findByName(SecurityUtils.getUsername());
Integer currentLevel = Collections.min(roleService.findByUsersId(user.getId()).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));
Integer optLevel = Collections.min(roleService.findByUsersId(id).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));

if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足");
for (Long id : ids) {
Integer currentLevel = Collections.min(roleService.findByUsersId(user.getId()).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));
Integer optLevel = Collections.min(roleService.findByUsersId(id).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));
if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足,不能删除:" + userService.findByName(SecurityUtils.getUsername()).getUsername());
}
}
userService.delete(id);
userService.delete(ids);
return new ResponseEntity<>(HttpStatus.OK);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@ public interface DeptService {

/**
* 删除
* @param id /
* @param deptDtos /
*
*/
void delete(Long id);
void delete(Set<DeptDto> deptDtos);

/**
* 构建树形数据
Expand Down Expand Up @@ -76,4 +77,12 @@ public interface DeptService {
* @throws IOException /
*/
void download(List<DeptDto> queryAll, HttpServletResponse response) throws IOException;

/**
* 获取待删除的部门
* @param deptList /
* @param deptDtos /
* @return /
*/
Set<DeptDto> getDeleteDepts(List<Dept> deptList, Set<DeptDto> deptDtos);
}
Loading

0 comments on commit 8c7217e

Please sign in to comment.