Skip to content

Commit 85775c8

Browse files
committed
[UPDATE]3.2
1 parent 3cf6c3a commit 85775c8

File tree

25 files changed

+785
-520
lines changed

25 files changed

+785
-520
lines changed

xboot-fast/pom.xml

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<parent>
1212
<groupId>org.springframework.boot</groupId>
1313
<artifactId>spring-boot-starter-parent</artifactId>
14-
<version>2.3.6.RELEASE</version>
14+
<version>2.3.7.RELEASE</version>
1515
</parent>
1616

1717
<properties>
@@ -129,7 +129,7 @@
129129
<dependency>
130130
<groupId>cn.hutool</groupId>
131131
<artifactId>hutool-all</artifactId>
132-
<version>5.5.1</version>
132+
<version>5.5.2</version>
133133
</dependency>
134134
<!-- Lombok -->
135135
<dependency>
@@ -141,7 +141,7 @@
141141
<dependency>
142142
<groupId>com.qiniu</groupId>
143143
<artifactId>qiniu-java-sdk</artifactId>
144-
<version>7.3.0</version>
144+
<version>7.4.0</version>
145145
</dependency>
146146
<!-- Jasypt加密 -->
147147
<dependency>
@@ -200,7 +200,7 @@
200200
<plugin>
201201
<groupId>org.springframework.boot</groupId>
202202
<artifactId>spring-boot-maven-plugin</artifactId>
203-
<version>2.3.6.RELEASE</version>
203+
<version>2.3.7.RELEASE</version>
204204
</plugin>
205205
</plugins>
206206
</build>

xboot-fast/src/main/java/cn/exrick/xboot/common/limit/RedisRaterLimiter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public Boolean acquireByRedis(String name, Long rate, Long rateInterval) {
4242
getToken = rateLimiter.tryAcquire();
4343
rateLimiter.expireAsync(rateInterval * 2, TimeUnit.MILLISECONDS);
4444
} catch (Exception e) {
45-
getToken = false;
45+
getToken = true;
4646
}
4747
return getToken;
4848
}

xboot-fast/src/main/java/cn/exrick/xboot/modules/base/controller/manage/DepartmentController.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ public Result<Object> edit(Department department,
107107
@RequestParam(required = false) String[] mainHeader,
108108
@RequestParam(required = false) String[] viceHeader) {
109109

110+
if (department.getId().equals(department.getParentId())) {
111+
return ResultUtil.error("上级节点不能为自己");
112+
}
110113
Department old = departmentService.get(department.getId());
114+
String oldParentId = old.getParentId();
111115
Department d = departmentService.update(department);
112116
// 先删除原数据
113117
departmentHeaderService.deleteByDepartmentId(department.getId());
@@ -128,14 +132,23 @@ public Result<Object> edit(Department department,
128132
}
129133
// 批量保存
130134
departmentHeaderService.saveOrUpdateAll(headers);
135+
// 如果该节点不是一级节点 且修改了级别 判断上级还有无子节点
136+
if (!"0".equals(oldParentId) && !oldParentId.equals(department.getParentId())) {
137+
Department parent = departmentService.get(oldParentId);
138+
List<Department> children = departmentService.findByParentIdOrderBySortOrder(parent.getId(), false);
139+
if (parent != null && (children == null || children.isEmpty())) {
140+
parent.setIsParent(false);
141+
departmentService.update(parent);
142+
}
143+
}
131144
// 若修改了部门名称
132145
if (!old.getTitle().equals(department.getTitle())) {
133146
userService.updateDepartmentTitle(department.getId(), department.getTitle());
134147
// 删除所有用户缓存
135-
redisTemplate.deleteByPattern("user:" + "*");
148+
redisTemplate.deleteByPattern("user:*");
136149
}
137150
// 手动删除所有部门缓存
138-
redisTemplate.deleteByPattern("department:" + "*");
151+
redisTemplate.deleteByPattern("department:*");
139152
return ResultUtil.success("编辑成功");
140153
}
141154

@@ -147,9 +160,9 @@ public Result<Object> delByIds(@RequestParam String[] ids) {
147160
deleteRecursion(id, ids);
148161
}
149162
// 手动删除所有部门缓存
150-
redisTemplate.deleteByPattern("department:" + "*");
163+
redisTemplate.deleteByPattern("department:*");
151164
// 删除数据权限缓存
152-
redisTemplate.deleteByPattern("userRole::depIds:" + "*");
165+
redisTemplate.deleteByPattern("userRole::depIds:*");
153166
return ResultUtil.success("批量通过id删除数据成功");
154167
}
155168

xboot-fast/src/main/java/cn/exrick/xboot/modules/base/controller/manage/PermissionController.java

+88-20
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package cn.exrick.xboot.modules.base.controller.manage;
22

33
import cn.exrick.xboot.common.constant.CommonConstant;
4+
import cn.exrick.xboot.common.exception.XbootException;
45
import cn.exrick.xboot.common.redis.RedisTemplateHelper;
6+
import cn.exrick.xboot.common.utils.CommonUtil;
57
import cn.exrick.xboot.common.utils.ResultUtil;
68
import cn.exrick.xboot.common.utils.SecurityUtil;
79
import cn.exrick.xboot.common.vo.Result;
@@ -25,10 +27,7 @@
2527
import org.springframework.cache.annotation.CacheEvict;
2628
import org.springframework.cache.annotation.Cacheable;
2729
import org.springframework.transaction.annotation.Transactional;
28-
import org.springframework.web.bind.annotation.RequestMapping;
29-
import org.springframework.web.bind.annotation.RequestMethod;
30-
import org.springframework.web.bind.annotation.RequestParam;
31-
import org.springframework.web.bind.annotation.RestController;
30+
import org.springframework.web.bind.annotation.*;
3231

3332
import java.util.Comparator;
3433
import java.util.List;
@@ -134,55 +133,90 @@ private void getAllByRecursion(List<Permission> curr, List<Permission> list) {
134133
List<Permission> children = list.stream().filter(p -> (e.getId()).equals(p.getParentId()))
135134
.sorted(Comparator.comparing(Permission::getSortOrder)).collect(Collectors.toList());
136135
e.setChildren(children);
136+
setInfo(e);
137137
if (e.getLevel() < 3) {
138138
getAllByRecursion(children, list);
139139
}
140140
});
141141
}
142142

143+
@RequestMapping(value = "/getByParentId/{parentId}", method = RequestMethod.GET)
144+
@ApiOperation(value = "通过id获取")
145+
@Cacheable(key = "#parentId")
146+
public Result<List<Permission>> getByParentId(@PathVariable String parentId) {
147+
148+
List<Permission> list = permissionService.findByParentIdOrderBySortOrder(parentId);
149+
list.forEach(e -> setInfo(e));
150+
return ResultUtil.data(list);
151+
}
152+
143153
@RequestMapping(value = "/add", method = RequestMethod.POST)
144154
@ApiOperation(value = "添加")
145155
@CacheEvict(key = "'menuList'")
146156
public Result<Permission> add(Permission permission) {
147157

158+
if (permission.getId().equals(permission.getParentId())) {
159+
return ResultUtil.error("上级节点不能为自己");
160+
}
148161
// 判断拦截请求的操作权限按钮名是否已存在
149162
if (CommonConstant.PERMISSION_OPERATION.equals(permission.getType())) {
150163
List<Permission> list = permissionService.findByTitle(permission.getTitle());
151164
if (list != null && list.size() > 0) {
152165
return new ResultUtil<Permission>().setErrorMsg("名称已存在");
153166
}
154167
}
168+
// 如果不是添加的一级 判断设置上级为父节点标识
169+
if (!CommonConstant.PARENT_ID.equals(permission.getParentId())) {
170+
Permission parent = permissionService.get(permission.getParentId());
171+
if (parent.getIsParent() == null || !parent.getIsParent()) {
172+
parent.setIsParent(true);
173+
permissionService.update(parent);
174+
}
175+
}
155176
Permission u = permissionService.save(permission);
156-
//重新加载权限
177+
// 重新加载权限
157178
mySecurityMetadataSource.loadResourceDefine();
158-
//手动删除缓存
159-
redisTemplate.delete("permission::allList");
179+
// 手动删除缓存
180+
redisTemplate.deleteByPattern("permission:*");
160181
return new ResultUtil<Permission>().setData(u);
161182
}
162183

163184
@RequestMapping(value = "/edit", method = RequestMethod.POST)
164185
@ApiOperation(value = "编辑")
165186
public Result<Permission> edit(Permission permission) {
166187

188+
if (permission.getId().equals(permission.getParentId())) {
189+
return ResultUtil.error("上级节点不能为自己");
190+
}
167191
// 判断拦截请求的操作权限按钮名是否已存在
168192
if (CommonConstant.PERMISSION_OPERATION.equals(permission.getType())) {
169193
// 若名称修改
170194
Permission p = permissionService.get(permission.getId());
171195
if (!p.getTitle().equals(permission.getTitle())) {
172196
List<Permission> list = permissionService.findByTitle(permission.getTitle());
173197
if (list != null && list.size() > 0) {
174-
return new ResultUtil<Permission>().setErrorMsg("名称已存在");
198+
return ResultUtil.error("名称已存在");
175199
}
176200
}
177201
}
202+
Permission old = permissionService.get(permission.getId());
203+
String oldParentId = old.getParentId();
178204
Permission u = permissionService.update(permission);
205+
// 如果该节点不是一级节点 且修改了级别 判断上级还有无子节点
206+
if (!CommonConstant.PARENT_ID.equals(oldParentId) && !oldParentId.equals(permission.getParentId())) {
207+
Permission parent = permissionService.get(oldParentId);
208+
List<Permission> children = permissionService.findByParentIdOrderBySortOrder(parent.getId());
209+
if (parent != null && (children == null || children.isEmpty())) {
210+
parent.setIsParent(false);
211+
permissionService.update(parent);
212+
}
213+
}
179214
// 重新加载权限
180215
mySecurityMetadataSource.loadResourceDefine();
181216
// 手动批量删除缓存
182-
redisTemplate.deleteByPattern("user:" + "*");
183-
redisTemplate.deleteByPattern("permission::userMenuList:*");
184-
redisTemplate.delete("permission::allList");
185-
return new ResultUtil<Permission>().setData(u);
217+
redisTemplate.deleteByPattern("user:*");
218+
redisTemplate.deleteByPattern("permission:*");
219+
return ResultUtil.data(u);
186220
}
187221

188222
@RequestMapping(value = "/delByIds", method = RequestMethod.POST)
@@ -191,26 +225,60 @@ public Result<Permission> edit(Permission permission) {
191225
public Result<Object> delByIds(@RequestParam String[] ids) {
192226

193227
for (String id : ids) {
194-
List<RolePermission> list = rolePermissionService.findByPermissionId(id);
195-
if (list != null && list.size() > 0) {
196-
return ResultUtil.error("删除失败,包含正被角色使用关联的菜单或权限");
197-
}
198-
}
199-
for (String id : ids) {
200-
permissionService.delete(id);
228+
deleteRecursion(id, ids);
201229
}
202230
// 重新加载权限
203231
mySecurityMetadataSource.loadResourceDefine();
204232
// 手动删除缓存
205-
redisTemplate.delete("permission::allList");
233+
redisTemplate.deleteByPattern("permission:*");
206234
return ResultUtil.success("批量通过id删除数据成功");
207235
}
208236

237+
public void deleteRecursion(String id, String[] ids) {
238+
239+
List<RolePermission> list = rolePermissionService.findByPermissionId(id);
240+
if (list != null && list.size() > 0) {
241+
throw new XbootException("删除失败,包含正被用户使用关联的部门");
242+
}
243+
// 获得其父节点
244+
Permission p = permissionService.get(id);
245+
Permission parent = null;
246+
if (p != null && StrUtil.isNotBlank(p.getParentId())) {
247+
parent = permissionService.get(p.getParentId());
248+
}
249+
permissionService.delete(id);
250+
// 判断父节点是否还有子节点
251+
if (parent != null) {
252+
List<Permission> children = permissionService.findByParentIdOrderBySortOrder(parent.getId());
253+
if (children == null || children.isEmpty()) {
254+
parent.setIsParent(false);
255+
permissionService.update(parent);
256+
}
257+
}
258+
// 递归删除
259+
List<Permission> permissions = permissionService.findByParentIdOrderBySortOrder(id);
260+
for (Permission pe : permissions) {
261+
if (!CommonUtil.judgeIds(pe.getId(), ids)) {
262+
deleteRecursion(pe.getId(), ids);
263+
}
264+
}
265+
}
266+
209267
@RequestMapping(value = "/search", method = RequestMethod.GET)
210268
@ApiOperation(value = "搜索菜单")
211269
public Result<List<Permission>> searchPermissionList(@RequestParam String title) {
212270

213271
List<Permission> list = permissionService.findByTitleLikeOrderBySortOrder("%" + title + "%");
214272
return new ResultUtil<List<Permission>>().setData(list);
215273
}
274+
275+
public void setInfo(Permission permission) {
276+
277+
if (!CommonConstant.PARENT_ID.equals(permission.getParentId())) {
278+
Permission parent = permissionService.get(permission.getParentId());
279+
permission.setParentTitle(parent.getTitle());
280+
} else {
281+
permission.setParentTitle("一级菜单");
282+
}
283+
}
216284
}

xboot-fast/src/main/java/cn/exrick/xboot/modules/base/controller/manage/RoleController.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ public Result<Object> editRolePerm(@RequestParam String roleId,
107107
}).collect(Collectors.toList());
108108
rolePermissionService.saveOrUpdateAll(list);
109109
}
110-
//手动批量删除缓存
111-
redisTemplate.deleteByPattern("user:" + "*");
112-
redisTemplate.deleteByPattern("userRole:" + "*");
110+
// 手动批量删除缓存
111+
redisTemplate.deleteByPattern("user:*");
112+
redisTemplate.deleteByPattern("userRole:*");
113113
redisTemplate.deleteByPattern("permission::userMenuList:*");
114114
return ResultUtil.data(null);
115115
}
@@ -135,8 +135,8 @@ public Result<Object> editRoleDep(@RequestParam String roleId,
135135
}
136136
}
137137
// 手动删除相关缓存
138-
redisTemplate.deleteByPattern("department:" + "*");
139-
redisTemplate.deleteByPattern("userRole:" + "*");
138+
redisTemplate.deleteByPattern("department:*");
139+
redisTemplate.deleteByPattern("userRole:*");
140140

141141
return ResultUtil.data(null);
142142
}
@@ -155,8 +155,8 @@ public Result<Role> edit(Role entity) {
155155

156156
Role r = roleService.update(entity);
157157
// 手动批量删除缓存
158-
redisTemplate.deleteByPattern("user:" + "*");
159-
redisTemplate.deleteByPattern("userRole:" + "*");
158+
redisTemplate.deleteByPattern("user:*");
159+
redisTemplate.deleteByPattern("userRole:*");
160160
return new ResultUtil<Role>().setData(r);
161161
}
162162

@@ -179,5 +179,4 @@ public Result<Object> delByIds(@RequestParam String[] ids) {
179179
}
180180
return ResultUtil.success("批量通过id删除数据成功");
181181
}
182-
183182
}

xboot-fast/src/main/java/cn/exrick/xboot/modules/base/entity/Department.java

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class Department extends XbootBaseEntity {
3535
private String title;
3636

3737
@ApiModelProperty(value = "父id")
38+
@Column(nullable = false)
3839
private String parentId;
3940

4041
@ApiModelProperty(value = "是否为父节点(含子节点) 默认false")

xboot-fast/src/main/java/cn/exrick/xboot/modules/base/entity/Permission.java

+9
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,12 @@ public class Permission extends XbootBaseEntity {
6868
private String description;
6969

7070
@ApiModelProperty(value = "父id")
71+
@Column(nullable = false)
7172
private String parentId;
7273

74+
@ApiModelProperty(value = "是否为父节点(含子节点) 默认false")
75+
private Boolean isParent = false;
76+
7377
@ApiModelProperty(value = "排序值")
7478
@Column(precision = 10, scale = 2)
7579
private BigDecimal sortOrder;
@@ -87,6 +91,11 @@ public class Permission extends XbootBaseEntity {
8791
@ApiModelProperty(value = "页面拥有的权限类型")
8892
private List<String> permTypes;
8993

94+
@Transient
95+
@TableField(exist = false)
96+
@ApiModelProperty(value = "父节点名称")
97+
private String parentTitle;
98+
9099
@Transient
91100
@TableField(exist = false)
92101
@ApiModelProperty(value = "节点展开 前端所需")

xboot-fast/src/main/resources/application.yml

+8-4
Original file line numberDiff line numberDiff line change
@@ -97,24 +97,28 @@ spring:
9797
# 修改上下文路径
9898
context-path: /xboot/admin
9999
client:
100+
# 服务端url
100101
url: http://127.0.0.1:${server.port}/xboot/admin
102+
instance:
103+
# 实例url
104+
service-base-url: http://127.0.0.1:${server.port}/
101105

102106
xboot:
103107
# 全局限流
104108
ratelimit:
105109
# 开启
106110
enable: true
107-
# 每1秒内
111+
# 每1秒内(单位毫秒)
108112
timeout: 1000
109-
# 总限制200个请求
113+
# 总限制200个请求(单位个)
110114
limit: 200
111115
# IP限流
112116
iplimit:
113117
# 开启
114118
enable: true
115-
# 每1秒内
119+
# 每1秒内(单位毫秒)
116120
timeout: 1000
117-
# 每个ip限制20个请求
121+
# 每个ip限制20个请求(单位个)
118122
limit: 20
119123
# token交互方式
120124
token:

0 commit comments

Comments
 (0)