refactor: 解决springboot3版本功能异常问题

This commit is contained in:
2025-12-26 14:43:40 +08:00
parent 69800ef5c7
commit 137a35ee28
104 changed files with 4670 additions and 4160 deletions
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
@@ -35,8 +34,8 @@ import cn.odboy.system.framework.permission.core.handler.TokenProvider;
import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler;
import cn.odboy.util.KitRsaEncryptUtil; import cn.odboy.util.KitRsaEncryptUtil;
import com.wf.captcha.base.Captcha; import com.wf.captcha.base.Captcha;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -60,94 +59,101 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/auth") @RequestMapping("/auth")
@Tag(name = "系统:系统授权接口") @Api(tags = "系统:系统授权接口")
public class SystemAuthController { public class SystemAuthController {
@Autowired private KitRedisHelper redisHelper;
@Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO;
@Autowired private TokenProvider tokenProvider;
@Autowired private AppProperties properties;
@Autowired private PasswordEncoder passwordEncoder;
@Autowired private UserDetailsHandler userDetailsService;
@Operation(summary = "登录授权") @Autowired
@AnonymousPostMapping(value = "/login") private KitRedisHelper redisHelper;
public ResponseEntity<Map<String, Object>> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, @Autowired
HttpServletRequest request) throws Exception { private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO;
// 密码解密 @Autowired
String password = private TokenProvider tokenProvider;
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); @Autowired
// 查询验证码 private AppProperties properties;
String code = redisHelper.get(loginRequest.getUuid(), String.class); @Autowired
// 清除验证码 private PasswordEncoder passwordEncoder;
redisHelper.del(loginRequest.getUuid()); @Autowired
if (StrUtil.isBlank(code)) { private UserDetailsHandler userDetailsService;
throw new BadRequestException("验证码不存在或已过期");
}
if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) {
throw new BadRequestException("验证码错误");
}
// 获取用户信息
SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername());
// 验证用户密码
if (!passwordEncoder.matches(password, jwtUser.getPassword())) {
throw new BadRequestException("登录密码错误");
}
Authentication authentication =
new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
// 生成令牌
String token = tokenProvider.createToken(jwtUser);
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<>(2) {{
put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token));
put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class));
}};
if (properties.getLogin().isSingle()) {
// 踢掉之前已经登录的token
systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername());
}
// 保存在线信息
systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request);
// 返回登录信息
return ResponseEntity.ok(authInfo);
}
@Operation(summary = "获取用户信息") @ApiOperation("登录授权")
@PostMapping(value = "/info") @AnonymousPostMapping(value = "/login")
public ResponseEntity<SystemUserInfoVo> getUserInfo() { public ResponseEntity<Map<String, Object>> login(@Validated @RequestBody SystemUserLoginArgs loginRequest,
SystemUserJwtVo jwtUser = (SystemUserJwtVo)KitSecurityHelper.getCurrentUser(); HttpServletRequest request) throws Exception {
SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); // 密码解密
return ResponseEntity.ok(userInfoVo); String password =
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword());
// 查询验证码
String code = redisHelper.get(loginRequest.getUuid(), String.class);
// 清除验证码
redisHelper.del(loginRequest.getUuid());
if (StrUtil.isBlank(code)) {
throw new BadRequestException("验证码不存在或已过期");
} }
if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) {
throw new BadRequestException("验证码错误");
}
// 获取用户信息
SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername());
// 验证用户密码
if (!passwordEncoder.matches(password, jwtUser.getPassword())) {
throw new BadRequestException("登录密码错误");
}
Authentication authentication =
new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
// 生成令牌
String token = tokenProvider.createToken(jwtUser);
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<>(2) {{
put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token));
put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class));
}};
if (properties.getLogin().isSingle()) {
// 踢掉之前已经登录的token
systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername());
}
// 保存在线信息
systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request);
// 返回登录信息
return ResponseEntity.ok(authInfo);
}
@Operation(summary = "获取验证码") @ApiOperation("获取用户信息")
@AnonymousPostMapping(value = "/captcha/getImage") @PostMapping(value = "/info")
public ResponseEntity<Map<String, Object>> getCode() { public ResponseEntity<SystemUserInfoVo> getUserInfo() {
// 获取运算的结果 SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser();
Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class);
String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); return ResponseEntity.ok(userInfoVo);
//当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 }
String captchaValue = captcha.text();
if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() &&
captchaValue.contains(SystemConst.SYMBOL_DOT)) {
captchaValue = captchaValue.split("\\.")[0];
}
// 保存
redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(),
TimeUnit.MINUTES);
// 验证码信息
Map<String, Object> imgResult = new HashMap<>(2) {{
put("img", captcha.toBase64());
put("uuid", uuid);
}};
return ResponseEntity.ok(imgResult);
}
@Operation(summary = "退出登录") @ApiOperation("获取验证码")
@AnonymousPostMapping(value = "/logout") @AnonymousPostMapping(value = "/captcha/getImage")
public ResponseEntity<Void> logout(HttpServletRequest request) { public ResponseEntity<Map<String, Object>> getCode() {
String token = tokenProvider.getToken(request); // 获取运算的结果
systemUserOnlineInfoDAO.logoutByToken(token); Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha();
return ResponseEntity.ok(null); String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID();
//当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型
String captchaValue = captcha.text();
if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() &&
captchaValue.contains(SystemConst.SYMBOL_DOT)) {
captchaValue = captchaValue.split("\\.")[0];
} }
// 保存
redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(),
TimeUnit.MINUTES);
// 验证码信息
Map<String, Object> imgResult = new HashMap<String, Object>(2) {{
put("img", captcha.toBase64());
put("uuid", uuid);
}};
return ResponseEntity.ok(imgResult);
}
@ApiOperation("退出登录")
@AnonymousPostMapping(value = "/logout")
public ResponseEntity<Void> logout(HttpServletRequest request) {
String token = tokenProvider.getToken(request);
systemUserOnlineInfoDAO.logoutByToken(token);
return ResponseEntity.ok(null);
}
} }
@@ -13,15 +13,14 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.constant.SystemCaptchaBizEnum;
import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs; import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs;
import cn.odboy.system.service.SystemEmailService; import cn.odboy.system.service.SystemEmailService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -33,32 +32,34 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/api/captcha") @RequestMapping("/api/captcha")
@Tag(name = "系统:验证码管理") @Api(tags = "系统:验证码管理")
public class SystemCaptchaController { public class SystemCaptchaController {
@Autowired private SystemEmailService systemEmailService;
@Operation(summary = "重置邮箱, 发送验证码") @Autowired
@PostMapping(value = "/sendResetEmailCaptcha") private SystemEmailService systemEmailService;
public ResponseEntity<Void> sendResetEmailCaptcha(@RequestParam String email) {
systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email);
return ResponseEntity.ok(null);
}
@Operation(summary = "重置密码,发送验证码") @ApiOperation("重置邮箱, 发送验证码")
@PostMapping(value = "/sendResetPasswordCaptcha") @PostMapping(value = "/sendResetEmailCaptcha")
public ResponseEntity<Void> sendResetPasswordCaptcha(@RequestParam String email) { public ResponseEntity<Void> sendResetEmailCaptcha(@RequestParam String email) {
systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "验证码验证") @ApiOperation("重置密码,发送验证码")
@PostMapping(value = "/checkEmailCaptcha") @PostMapping(value = "/sendResetPasswordCaptcha")
public ResponseEntity<Void> checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { public ResponseEntity<Void> sendResetPasswordCaptcha(@RequestParam String email) {
SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email);
if (biEnum == null) { return ResponseEntity.ok(null);
throw new BadRequestException("不支持的业务"); }
}
systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); @ApiOperation("验证码验证")
return ResponseEntity.ok(null); @PostMapping(value = "/checkEmailCaptcha")
public ResponseEntity<Void> checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) {
SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode());
if (biEnum == null) {
throw new BadRequestException("不支持的业务");
} }
systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode());
return ResponseEntity.ok(null);
}
} }
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.system.service.SystemDeptService; import cn.odboy.system.service.SystemDeptService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -27,22 +26,24 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统:组件数据源") @Api(tags = "系统:组件数据源")
@RequestMapping("/api/component") @RequestMapping("/api/component")
public class SystemComponentController { public class SystemComponentController {
@Autowired private SystemDeptService systemDeptService;
@Operation(summary = "查询部门下拉选择数据源") @Autowired
@PostMapping(value = "/queryDeptSelectDataSource") private SystemDeptService systemDeptService;
@PreAuthorize("@el.check()")
public ResponseEntity<?> queryDeptSelectDataSource() {
return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource());
}
@Operation(summary = "查询部门下拉选择Pro数据源") @ApiOperation("查询部门下拉选择数据源")
@PostMapping(value = "/queryDeptSelectProDataSource") @PostMapping(value = "/queryDeptSelectDataSource")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<?> queryDeptSelectProDataSource() { public ResponseEntity<?> queryDeptSelectDataSource() {
return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource());
} }
@ApiOperation("查询部门下拉选择Pro数据源")
@PostMapping(value = "/queryDeptSelectProDataSource")
@PreAuthorize("@el.check()")
public ResponseEntity<?> queryDeptSelectProDataSource() {
return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource());
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -23,13 +22,14 @@ import cn.odboy.system.dal.model.SystemCreateDeptArgs;
import cn.odboy.system.dal.model.SystemQueryDeptArgs; import cn.odboy.system.dal.model.SystemQueryDeptArgs;
import cn.odboy.system.service.SystemDeptService; import cn.odboy.system.service.SystemDeptService;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -42,78 +42,80 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统:部门管理") @Api(tags = "系统:部门管理")
@RequestMapping("/api/dept") @RequestMapping("/api/dept")
public class SystemDeptController { public class SystemDeptController {
@Autowired private SystemDeptService systemDeptService;
@Operation(summary = "导出部门数据") @Autowired
@GetMapping(value = "/download") private SystemDeptService systemDeptService;
@PreAuthorize("@el.check('dept:list')")
public void exportDept(HttpServletResponse response, SystemQueryDeptArgs criteria) throws Exception {
systemDeptService.exportDeptExcel(systemDeptService.queryAllDept(criteria, false), response);
}
@Operation(summary = "查询部门") @ApiOperation("导出部门数据")
@PostMapping @GetMapping(value = "/download")
@PreAuthorize("@el.check('user:list','dept:list')") @PreAuthorize("@el.check('dept:list')")
public ResponseEntity<KitPageResult<SystemDeptTb>> queryDept( public void exportDept(HttpServletResponse response, SystemQueryDeptArgs criteria) throws Exception {
@Validated @RequestBody KitPageArgs<SystemQueryDeptArgs> args) throws Exception { systemDeptService.exportDeptExcel(systemDeptService.queryAllDept(criteria, false), response);
SystemQueryDeptArgs criteria = args.getArgs(); }
List<SystemDeptTb> depts = systemDeptService.queryAllDept(criteria, true);
return ResponseEntity.ok(KitPageUtil.toPage(depts));
}
@Operation(summary = "查询部门:根据ID获取同级与上级数据") @ApiOperation("查询部门")
@PostMapping("/queryDeptSuperiorTree") @PostMapping
@PreAuthorize("@el.check('user:list','dept:list')") @PreAuthorize("@el.check('user:list','dept:list')")
public ResponseEntity<KitPageResult<SystemDeptTb>> queryDeptSuperiorTree(@RequestBody List<Long> ids, public ResponseEntity<KitPageResult<SystemDeptTb>> queryDept(
@RequestParam(defaultValue = "false") Boolean exclude) { @Validated @RequestBody KitPageArgs<SystemQueryDeptArgs> args) throws Exception {
Set<SystemDeptTb> deptSet = new LinkedHashSet<>(); SystemQueryDeptArgs criteria = args.getArgs();
for (Long id : ids) { List<SystemDeptTb> depts = systemDeptService.queryAllDept(criteria, true);
// 同级数据 return ResponseEntity.ok(KitPageUtil.toPage(depts));
SystemDeptTb dept = systemDeptService.getDeptById(id); }
// 上级数据
List<SystemDeptTb> depts = systemDeptService.querySuperiorDeptListByPid(dept, new ArrayList<>()); @ApiOperation("查询部门:根据ID获取同级与上级数据")
if (exclude) { @PostMapping("/queryDeptSuperiorTree")
for (SystemDeptTb data : depts) { @PreAuthorize("@el.check('user:list','dept:list')")
if (data.getId().equals(dept.getPid())) { public ResponseEntity<KitPageResult<SystemDeptTb>> queryDeptSuperiorTree(@RequestBody List<Long> ids,
data.setSubCount(data.getSubCount() - 1); @RequestParam(defaultValue = "false") Boolean exclude) {
} Set<SystemDeptTb> deptSet = new LinkedHashSet<>();
} for (Long id : ids) {
// 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 // 同级数据
depts = depts.stream().filter(i -> !ids.contains(i.getId())).toList(); SystemDeptTb dept = systemDeptService.getDeptById(id);
} // 上级数据
deptSet.addAll(depts); List<SystemDeptTb> depts = systemDeptService.querySuperiorDeptListByPid(dept, new ArrayList<>());
if (exclude) {
for (SystemDeptTb data : depts) {
if (data.getId().equals(dept.getPid())) {
data.setSubCount(data.getSubCount() - 1);
}
} }
return ResponseEntity.ok(systemDeptService.buildDeptTree(new ArrayList<>(deptSet))); // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题
depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList());
}
deptSet.addAll(depts);
} }
return ResponseEntity.ok(systemDeptService.buildDeptTree(new ArrayList<>(deptSet)));
}
@Operation(summary = "新增部门") @ApiOperation("新增部门")
@PostMapping(value = "/saveDept") @PostMapping(value = "/saveDept")
@PreAuthorize("@el.check('dept:add')") @PreAuthorize("@el.check('dept:add')")
public ResponseEntity<Void> saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { public ResponseEntity<Void> saveDept(@Validated @RequestBody SystemCreateDeptArgs args) {
systemDeptService.saveDept(args); systemDeptService.saveDept(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "修改部门") @ApiOperation("修改部门")
@PostMapping(value = "/modifyDept") @PostMapping(value = "/modifyDept")
@PreAuthorize("@el.check('dept:edit')") @PreAuthorize("@el.check('dept:edit')")
public ResponseEntity<Void> modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { public ResponseEntity<Void> modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) {
systemDeptService.updateDept(args); systemDeptService.updateDept(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "删除部门") @ApiOperation("删除部门")
@PostMapping(value = "/removeDeptByIds") @PostMapping(value = "/removeDeptByIds")
@PreAuthorize("@el.check('dept:del')") @PreAuthorize("@el.check('dept:del')")
public ResponseEntity<Void> removeDeptByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Void> removeDeptByIds(@RequestBody Set<Long> ids) {
// 获取部门, 和其所有子部门 // 获取部门, 和其所有子部门
Set<SystemDeptTb> depts = systemDeptService.traverseDeptByIdWithPids(ids); Set<SystemDeptTb> depts = systemDeptService.traverseDeptByIdWithPids(ids);
// 验证是否被角色或用户关联 // 验证是否被角色或用户关联
systemDeptService.verifyBindRelationByIds(depts); systemDeptService.verifyBindRelationByIds(depts);
systemDeptService.removeDeptByIds(depts); systemDeptService.removeDeptByIds(depts);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -23,12 +22,12 @@ import cn.odboy.system.dal.model.SystemCreateDictArgs;
import cn.odboy.system.dal.model.SystemQueryDictArgs; import cn.odboy.system.dal.model.SystemQueryDictArgs;
import cn.odboy.system.service.SystemDictService; import cn.odboy.system.service.SystemDictService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -40,61 +39,63 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统:字典管理") @Api(tags = "系统:字典管理")
@RequestMapping("/api/dict") @RequestMapping("/api/dict")
public class SystemDictController { public class SystemDictController {
@Autowired private SystemDictService systemDictService;
@Operation(summary = "导出字典数据") @Autowired
@GetMapping(value = "/download") private SystemDictService systemDictService;
@PreAuthorize("@el.check('dict:list')")
public void exportDict(HttpServletResponse response, SystemQueryDictArgs criteria) throws IOException {
systemDictService.exportDictExcel(systemDictService.queryDictByArgs(criteria), response);
}
@Operation(summary = "查询字典") @ApiOperation("导出字典数据")
@PostMapping(value = "/queryAllDict") @GetMapping(value = "/download")
@PreAuthorize("@el.check('dict:list')") @PreAuthorize("@el.check('dict:list')")
public ResponseEntity<List<SystemDictTb>> queryAllDict() { public void exportDict(HttpServletResponse response, SystemQueryDictArgs criteria) throws IOException {
return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); systemDictService.exportDictExcel(systemDictService.queryDictByArgs(criteria), response);
} }
@Operation(summary = "查询字典") @ApiOperation("查询字典")
@PostMapping @PostMapping(value = "/queryAllDict")
@PreAuthorize("@el.check('dict:list')") @PreAuthorize("@el.check('dict:list')")
public ResponseEntity<KitPageResult<SystemDictTb>> queryDictByArgs( public ResponseEntity<List<SystemDictTb>> queryAllDict() {
@Validated @RequestBody KitPageArgs<SystemQueryDictArgs> args) { return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs()));
Page<SystemDictTb> page; }
SystemQueryDictArgs criteria = args.getArgs();
if (args.getSize() != null) {
page = new Page<>(args.getPage(), args.getSize());
} else {
page = new Page<>(criteria.getPage(), criteria.getSize());
}
return ResponseEntity.ok(systemDictService.queryDictByArgs(criteria, page));
}
@Operation(summary = "新增字典") @ApiOperation("查询字典")
@PostMapping(value = "/saveDict") @PostMapping
@PreAuthorize("@el.check('dict:add')") @PreAuthorize("@el.check('dict:list')")
public ResponseEntity<Void> saveDict(@Validated @RequestBody SystemCreateDictArgs args) { public ResponseEntity<KitPageResult<SystemDictTb>> queryDictByArgs(
systemDictService.saveDict(args); @Validated @RequestBody KitPageArgs<SystemQueryDictArgs> args) {
return ResponseEntity.ok(null); Page<SystemDictTb> page;
SystemQueryDictArgs criteria = args.getArgs();
if (args.getSize() != null) {
page = new Page<>(args.getPage(), args.getSize());
} else {
page = new Page<>(criteria.getPage(), criteria.getSize());
} }
return ResponseEntity.ok(systemDictService.queryDictByArgs(criteria, page));
}
@Operation(summary = "修改字典") @ApiOperation("新增字典")
@PostMapping(value = "/modifyDictById") @PostMapping(value = "/saveDict")
@PreAuthorize("@el.check('dict:edit')") @PreAuthorize("@el.check('dict:add')")
public ResponseEntity<Void> modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { public ResponseEntity<Void> saveDict(@Validated @RequestBody SystemCreateDictArgs args) {
systemDictService.modifyDictById(args); systemDictService.saveDict(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "删除字典") @ApiOperation("修改字典")
@PostMapping(value = "/removeDictByIds") @PostMapping(value = "/modifyDictById")
@PreAuthorize("@el.check('dict:del')") @PreAuthorize("@el.check('dict:edit')")
public ResponseEntity<Void> removeDictByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Void> modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) {
systemDictService.removeDictByIds(ids); systemDictService.modifyDictById(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@ApiOperation("删除字典")
@PostMapping(value = "/removeDictByIds")
@PreAuthorize("@el.check('dict:del')")
public ResponseEntity<Void> removeDictByIds(@RequestBody Set<Long> ids) {
systemDictService.removeDictByIds(ids);
return ResponseEntity.ok(null);
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -24,8 +23,8 @@ import cn.odboy.system.dal.model.SystemDictDetailVo;
import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import cn.odboy.system.dal.model.SystemQueryDictDetailArgs;
import cn.odboy.system.service.SystemDictDetailService; import cn.odboy.system.service.SystemDictDetailService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -41,60 +40,62 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统:字典详情管理") @Api(tags = "系统:字典详情管理")
@RequestMapping("/api/dictDetail") @RequestMapping("/api/dictDetail")
public class SystemDictDetailController { public class SystemDictDetailController {
@Autowired private SystemDictDetailService systemDictDetailService;
@Operation(summary = "查询字典详情") @Autowired
@PostMapping private SystemDictDetailService systemDictDetailService;
public ResponseEntity<KitPageResult<SystemDictDetailVo>> queryDictDetailByCrud(
@Validated @RequestBody KitPageArgs<SystemQueryDictDetailArgs> args) {
return queryDictDetailByArgs(args);
}
@Operation(summary = "查询字典详情") @ApiOperation("查询字典详情")
@PostMapping(value = "/queryDictDetailByArgs") @PostMapping
public ResponseEntity<KitPageResult<SystemDictDetailVo>> queryDictDetailByArgs( public ResponseEntity<KitPageResult<SystemDictDetailVo>> queryDictDetailByCrud(
@Validated @RequestBody KitPageArgs<SystemQueryDictDetailArgs> args) { @Validated @RequestBody KitPageArgs<SystemQueryDictDetailArgs> args) {
SystemQueryDictDetailArgs criteria = args.getArgs(); return queryDictDetailByArgs(args);
Page<SystemDictDetailTb> page = new Page<>(args.getPage(), args.getSize()); }
return ResponseEntity.ok(systemDictDetailService.queryDictDetailByArgs(criteria, page));
}
@Operation(summary = "查询多个字典详情") @ApiOperation("查询字典详情")
@GetMapping(value = "/getDictDetailMaps") @PostMapping(value = "/queryDictDetailByArgs")
public ResponseEntity<Map<String, List<SystemDictDetailVo>>> getDictDetailMaps(@RequestParam String dictName) { public ResponseEntity<KitPageResult<SystemDictDetailVo>> queryDictDetailByArgs(
String[] names = dictName.split("[,, ]"); @Validated @RequestBody KitPageArgs<SystemQueryDictDetailArgs> args) {
Map<String, List<SystemDictDetailVo>> dictMap = new HashMap<>(16); SystemQueryDictDetailArgs criteria = args.getArgs();
for (String name : names) { Page<SystemDictDetailTb> page = new Page<>(args.getPage(), args.getSize());
dictMap.put(name, systemDictDetailService.queryDictDetailByName(name)); return ResponseEntity.ok(systemDictDetailService.queryDictDetailByArgs(criteria, page));
} }
return ResponseEntity.ok(dictMap);
}
@Operation(summary = "新增字典详情") @ApiOperation("查询多个字典详情")
@PostMapping(value = "/saveDictDetail") @GetMapping(value = "/getDictDetailMaps")
@PreAuthorize("@el.check('dict:add')") public ResponseEntity<Map<String, List<SystemDictDetailVo>>> getDictDetailMaps(@RequestParam String dictName) {
public ResponseEntity<Void> saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { String[] names = dictName.split("[,, ]");
systemDictDetailService.saveDictDetail(args); Map<String, List<SystemDictDetailVo>> dictMap = new HashMap<>(16);
return ResponseEntity.ok(null); for (String name : names) {
dictMap.put(name, systemDictDetailService.queryDictDetailByName(name));
} }
return ResponseEntity.ok(dictMap);
}
@Operation(summary = "修改字典详情") @ApiOperation("新增字典详情")
@PostMapping(value = "/modifyDictDetailById") @PostMapping(value = "/saveDictDetail")
@PreAuthorize("@el.check('dict:edit')") @PreAuthorize("@el.check('dict:add')")
public ResponseEntity<Void> modifyDictDetailById( public ResponseEntity<Void> saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) {
@Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { systemDictDetailService.saveDictDetail(args);
systemDictDetailService.modifyDictDetailById(args); return ResponseEntity.ok(null);
return ResponseEntity.ok(null); }
}
@Operation(summary = "删除字典详情") @ApiOperation("修改字典详情")
@PostMapping(value = "/removeDictDetailById") @PostMapping(value = "/modifyDictDetailById")
@PreAuthorize("@el.check('dict:del')") @PreAuthorize("@el.check('dict:edit')")
public ResponseEntity<Void> removeDictDetailById(@RequestBody SystemDictDetailTb args) { public ResponseEntity<Void> modifyDictDetailById(
systemDictDetailService.removeDictDetailById(args.getId()); @Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) {
return ResponseEntity.ok(null); systemDictDetailService.modifyDictDetailById(args);
} return ResponseEntity.ok(null);
}
@ApiOperation("删除字典详情")
@PostMapping(value = "/removeDictDetailById")
@PreAuthorize("@el.check('dict:del')")
public ResponseEntity<Void> removeDictDetailById(@RequestBody SystemDictDetailTb args) {
systemDictDetailService.removeDictDetailById(args.getId());
return ResponseEntity.ok(null);
}
} }
@@ -13,14 +13,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.system.dal.dataobject.SystemEmailConfigTb; import cn.odboy.system.dal.dataobject.SystemEmailConfigTb;
import cn.odboy.system.dal.model.SystemSendEmailArgs; import cn.odboy.system.dal.model.SystemSendEmailArgs;
import cn.odboy.system.service.SystemEmailService; import cn.odboy.system.service.SystemEmailService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -34,28 +33,30 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@RestController @RestController
@RequestMapping("api/email") @RequestMapping("api/email")
@Tag(name = "工具:邮件管理") @Api(tags = "工具:邮件管理")
public class SystemEmailController { public class SystemEmailController {
@Autowired private SystemEmailService systemEmailService;
@Operation(summary = "查询配置") @Autowired
@PostMapping(value = "/getLastEmailConfig") private SystemEmailService systemEmailService;
public ResponseEntity<SystemEmailConfigTb> getLastEmailConfig() {
return ResponseEntity.ok(systemEmailService.getLastEmailConfig());
}
@Operation(summary = "配置邮件") @ApiOperation("查询配置")
@PostMapping(value = "/modifyEmailConfig") @PostMapping(value = "/getLastEmailConfig")
public ResponseEntity<Void> modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) public ResponseEntity<SystemEmailConfigTb> getLastEmailConfig() {
throws Exception { return ResponseEntity.ok(systemEmailService.getLastEmailConfig());
systemEmailService.modifyEmailConfig(emailConfig); }
return ResponseEntity.ok(null);
}
@Operation(summary = "发送邮件") @ApiOperation("配置邮件")
@PostMapping(value = "/sendEmail") @PostMapping(value = "/modifyEmailConfig")
public ResponseEntity<Void> sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { public ResponseEntity<Void> modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig)
systemEmailService.sendEmail(sendEmailRequest); throws Exception {
return ResponseEntity.ok(null); systemEmailService.modifyEmailConfig(emailConfig);
} return ResponseEntity.ok(null);
}
@ApiOperation("发送邮件")
@PostMapping(value = "/sendEmail")
public ResponseEntity<Void> sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) {
systemEmailService.sendEmail(sendEmailRequest);
return ResponseEntity.ok(null);
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -23,11 +22,11 @@ import cn.odboy.system.dal.model.SystemCreateJobArgs;
import cn.odboy.system.dal.model.SystemQueryJobArgs; import cn.odboy.system.dal.model.SystemQueryJobArgs;
import cn.odboy.system.service.SystemJobService; import cn.odboy.system.service.SystemJobService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -39,59 +38,61 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统:岗位管理") @Api(tags = "系统:岗位管理")
@RequestMapping("/api/job") @RequestMapping("/api/job")
public class SystemJobController { public class SystemJobController {
@Autowired private SystemJobService systemJobService;
@Operation(summary = "导出岗位数据") @Autowired
@GetMapping(value = "/download") private SystemJobService systemJobService;
@PreAuthorize("@el.check('job:list')")
public void exportJob(HttpServletResponse response, SystemQueryJobArgs criteria) throws IOException {
systemJobService.exportJobExcel(systemJobService.queryJobByArgs(criteria), response);
}
@Operation(summary = "查询岗位") @ApiOperation("导出岗位数据")
@PostMapping(value = "/queryAllEnableJob") @GetMapping(value = "/download")
@PreAuthorize("@el.check('job:list','user:list')") @PreAuthorize("@el.check('job:list')")
public ResponseEntity<KitPageResult<SystemJobTb>> queryJobByArgs( public void exportJob(HttpServletResponse response, SystemQueryJobArgs criteria) throws IOException {
@Validated @RequestBody KitPageArgs<SystemQueryJobArgs> args) { systemJobService.exportJobExcel(systemJobService.queryJobByArgs(criteria), response);
SystemQueryJobArgs criteria = args.getArgs(); }
Page<SystemJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemJobService.queryJobByArgs(criteria, page));
}
@Operation(summary = "查询岗位") @ApiOperation("查询岗位")
@PostMapping @PostMapping(value = "/queryAllEnableJob")
@PreAuthorize("@el.check('job:list','user:list')") @PreAuthorize("@el.check('job:list','user:list')")
public ResponseEntity<KitPageResult<SystemJobTb>> queryJobByCrud( public ResponseEntity<KitPageResult<SystemJobTb>> queryJobByArgs(
@Validated @RequestBody KitPageArgs<SystemQueryJobArgs> args) { @Validated @RequestBody KitPageArgs<SystemQueryJobArgs> args) {
return queryJobByArgs(args); SystemQueryJobArgs criteria = args.getArgs();
} Page<SystemJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemJobService.queryJobByArgs(criteria, page));
}
@Operation(summary = "新增岗位") @ApiOperation("查询岗位")
@PostMapping(value = "/saveJob") @PostMapping
@PreAuthorize("@el.check('job:add')") @PreAuthorize("@el.check('job:list','user:list')")
public ResponseEntity<Void> saveJob(@Validated @RequestBody SystemCreateJobArgs args) { public ResponseEntity<KitPageResult<SystemJobTb>> queryJobByCrud(
systemJobService.saveJob(args); @Validated @RequestBody KitPageArgs<SystemQueryJobArgs> args) {
return ResponseEntity.ok(null); return queryJobByArgs(args);
} }
@Operation(summary = "修改岗位") @ApiOperation("新增岗位")
@PostMapping(value = "/modifyJobById") @PostMapping(value = "/saveJob")
@PreAuthorize("@el.check('job:edit')") @PreAuthorize("@el.check('job:add')")
public ResponseEntity<Void> modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { public ResponseEntity<Void> saveJob(@Validated @RequestBody SystemCreateJobArgs args) {
systemJobService.modifyJobById(args); systemJobService.saveJob(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "删除岗位") @ApiOperation("修改岗位")
@PostMapping(value = "/removeJobByIds") @PostMapping(value = "/modifyJobById")
@PreAuthorize("@el.check('job:del')") @PreAuthorize("@el.check('job:edit')")
public ResponseEntity<Void> removeJobByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Void> modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) {
// 验证是否被用户关联 systemJobService.modifyJobById(args);
systemJobService.verifyBindRelationByIds(ids); return ResponseEntity.ok(null);
systemJobService.removeJobByIds(ids); }
return ResponseEntity.ok(null);
} @ApiOperation("删除岗位")
@PostMapping(value = "/removeJobByIds")
@PreAuthorize("@el.check('job:del')")
public ResponseEntity<Void> removeJobByIds(@RequestBody Set<Long> ids) {
// 验证是否被用户关联
systemJobService.verifyBindRelationByIds(ids);
systemJobService.removeJobByIds(ids);
return ResponseEntity.ok(null);
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -25,10 +24,10 @@ import cn.odboy.system.dal.model.SystemQueryStorageArgs;
import cn.odboy.system.service.SystemLocalStorageService; import cn.odboy.system.service.SystemLocalStorageService;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -42,60 +41,62 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@RestController @RestController
@Tag(name = "工具:本地存储管理") @Api(tags = "工具:本地存储管理")
@RequestMapping("/api/localStorage") @RequestMapping("/api/localStorage")
public class SystemLocalStorageController { public class SystemLocalStorageController {
@Autowired private SystemLocalStorageService localStorageService;
@Operation(summary = "查询文件") @Autowired
@PostMapping private SystemLocalStorageService localStorageService;
@PreAuthorize("@el.check('storage:list')")
public ResponseEntity<KitPageResult<SystemLocalStorageTb>> queryLocalStorage(
@Validated @RequestBody KitPageArgs<SystemQueryStorageArgs> args) {
SystemQueryStorageArgs criteria = args.getArgs();
Page<SystemLocalStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(localStorageService.queryLocalStorage(criteria, page));
}
@Operation(summary = "导出数据") @ApiOperation("查询文件")
@GetMapping(value = "/download") @PostMapping
@PreAuthorize("@el.check('storage:list')") @PreAuthorize("@el.check('storage:list')")
public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { public ResponseEntity<KitPageResult<SystemLocalStorageTb>> queryLocalStorage(
localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorage(criteria), response); @Validated @RequestBody KitPageArgs<SystemQueryStorageArgs> args) {
} SystemQueryStorageArgs criteria = args.getArgs();
Page<SystemLocalStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(localStorageService.queryLocalStorage(criteria, page));
}
@Operation(summary = "上传文件") @ApiOperation("导出数据")
@PostMapping(value = "/uploadFile") @GetMapping(value = "/download")
@PreAuthorize("@el.check('storage:add')") @PreAuthorize("@el.check('storage:list')")
public ResponseEntity<Void> uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException {
localStorageService.uploadFile(name, file); localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorage(criteria), response);
return ResponseEntity.ok(null); }
}
@Operation(summary = "上传图片") @ApiOperation("上传文件")
@PostMapping("/uploadPicture") @PostMapping(value = "/uploadFile")
public ResponseEntity<SystemLocalStorageTb> uploadPicture(@RequestParam MultipartFile file) { @PreAuthorize("@el.check('storage:add')")
// 判断文件是否为图片 public ResponseEntity<Void> uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) {
String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); localStorageService.uploadFile(name, file);
if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { return ResponseEntity.ok(null);
throw new BadRequestException("只能上传图片"); }
}
SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file);
return ResponseEntity.ok(localStorage);
}
@Operation(summary = "修改文件") @ApiOperation("上传图片")
@PostMapping(value = "/modifyLocalStorageById") @PostMapping("/uploadPicture")
@PreAuthorize("@el.check('storage:edit')") public ResponseEntity<SystemLocalStorageTb> uploadPicture(@RequestParam MultipartFile file) {
public ResponseEntity<Void> modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { // 判断文件是否为图片
localStorageService.modifyLocalStorageById(args); String suffix = KitFileUtil.getSuffix(file.getOriginalFilename());
return ResponseEntity.ok(null); if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) {
throw new BadRequestException("只能上传图片");
} }
SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file);
return ResponseEntity.ok(localStorage);
}
@Operation(summary = "多选删除") @ApiOperation("修改文件")
@PostMapping(value = "/removeFileByIds") @PostMapping(value = "/modifyLocalStorageById")
public ResponseEntity<Void> deleteFileByIds(@RequestBody Long[] ids) { @PreAuthorize("@el.check('storage:edit')")
localStorageService.removeFileByIds(ids); public ResponseEntity<Void> modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) {
return ResponseEntity.ok(null); localStorageService.modifyLocalStorageById(args);
} return ResponseEntity.ok(null);
}
@ApiOperation("多选删除")
@PostMapping(value = "/removeFileByIds")
public ResponseEntity<Void> deleteFileByIds(@RequestBody Long[] ids) {
localStorageService.removeFileByIds(ids);
return ResponseEntity.ok(null);
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
@@ -27,15 +26,15 @@ import cn.odboy.system.dal.mysql.SystemMenuMapper;
import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.framework.permission.core.KitSecurityHelper;
import cn.odboy.system.service.SystemMenuService; import cn.odboy.system.service.SystemMenuService;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -48,111 +47,114 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统:菜单管理") @Api(tags = "系统:菜单管理")
@RequestMapping("/api/menu") @RequestMapping("/api/menu")
public class SystemMenuController { public class SystemMenuController {
@Autowired private SystemMenuService systemMenuService;
@Autowired private SystemMenuMapper systemMenuMapper;
@Operation(summary = "导出菜单数据") @Autowired
@GetMapping(value = "/download") private SystemMenuService systemMenuService;
@PreAuthorize("@el.check('menu:list')") @Autowired
public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs criteria) throws Exception { private SystemMenuMapper systemMenuMapper;
systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(criteria, false), response);
}
@PostMapping(value = "/buildMenus") @ApiOperation("导出菜单数据")
@Operation(summary = "获取前端所需菜单") @GetMapping(value = "/download")
public ResponseEntity<List<SystemMenuVo>> buildMenus() { @PreAuthorize("@el.check('menu:list')")
List<SystemMenuTb> menuList = systemMenuService.queryMenuListByUserId(KitSecurityHelper.getCurrentUserId()); public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs criteria) throws Exception {
List<SystemMenuTb> menus = systemMenuService.buildMenuTree(menuList); systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(criteria, false), response);
return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); }
}
@Operation(summary = "返回全部的菜单") @PostMapping(value = "/buildMenus")
@PostMapping(value = "/queryMenuListByPid") @ApiOperation("获取前端所需菜单")
@PreAuthorize("@el.check('menu:list','roles:list')") public ResponseEntity<List<SystemMenuVo>> buildMenus() {
public ResponseEntity<List<SystemMenuTb>> queryMenuListByPid(@RequestParam Long pid) { List<SystemMenuTb> menuList = systemMenuService.queryMenuListByUserId(KitSecurityHelper.getCurrentUserId());
return ResponseEntity.ok(systemMenuService.queryMenuByPid(pid)); List<SystemMenuTb> menus = systemMenuService.buildMenuTree(menuList);
} return ResponseEntity.ok(systemMenuService.buildMenuVo(menus));
}
@Operation(summary = "根据菜单ID返回所有子节点ID, 包含自身ID") @ApiOperation("返回全部的菜单")
@PostMapping(value = "/queryChildMenuSet") @PostMapping(value = "/queryMenuListByPid")
@PreAuthorize("@el.check('menu:list','roles:list')") @PreAuthorize("@el.check('menu:list','roles:list')")
public ResponseEntity<Set<Long>> queryChildMenuSet(@RequestParam Long id) { public ResponseEntity<List<SystemMenuTb>> queryMenuListByPid(@RequestParam Long pid) {
Set<SystemMenuTb> menuSet = new HashSet<>(); return ResponseEntity.ok(systemMenuService.queryMenuByPid(pid));
List<SystemMenuTb> menuList = systemMenuService.queryMenuByPid(id); }
menuSet.add(systemMenuMapper.selectById(id));
menuSet = systemMenuService.queryChildMenu(menuList, menuSet);
Set<Long> ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet());
return ResponseEntity.ok(ids);
}
@PostMapping @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID")
@Operation(summary = "查询菜单") @PostMapping(value = "/queryChildMenuSet")
@PreAuthorize("@el.check('menu:list')") @PreAuthorize("@el.check('menu:list','roles:list')")
public ResponseEntity<KitPageResult<SystemMenuTb>> queryAllMenuByCrud( public ResponseEntity<Set<Long>> queryChildMenuSet(@RequestParam Long id) {
@Validated @RequestBody KitPageArgs<SystemQueryMenuArgs> args) throws Exception { Set<SystemMenuTb> menuSet = new HashSet<>();
return queryAllMenu(args); List<SystemMenuTb> menuList = systemMenuService.queryMenuByPid(id);
} menuSet.add(systemMenuMapper.selectById(id));
menuSet = systemMenuService.queryChildMenu(menuList, menuSet);
Set<Long> ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet());
return ResponseEntity.ok(ids);
}
@PostMapping(value = "/queryMenuByArgs") @PostMapping
@Operation(summary = "查询菜单") @ApiOperation("查询菜单")
@PreAuthorize("@el.check('menu:list')") @PreAuthorize("@el.check('menu:list')")
public ResponseEntity<KitPageResult<SystemMenuTb>> queryAllMenu( public ResponseEntity<KitPageResult<SystemMenuTb>> queryAllMenuByCrud(
@Validated @RequestBody KitPageArgs<SystemQueryMenuArgs> args) throws Exception { @Validated @RequestBody KitPageArgs<SystemQueryMenuArgs> args) throws Exception {
SystemQueryMenuArgs criteria = args.getArgs(); return queryAllMenu(args);
List<SystemMenuTb> menuList = systemMenuService.queryAllMenu(criteria, true); }
return ResponseEntity.ok(KitPageUtil.toPage(menuList));
}
@Operation(summary = "查询菜单:根据ID获取同级与上级数据") @PostMapping(value = "/queryMenuByArgs")
@PostMapping("/queryMenuSuperior") @ApiOperation("查询菜单")
@PreAuthorize("@el.check('menu:list')") @PreAuthorize("@el.check('menu:list')")
public ResponseEntity<List<SystemMenuTb>> queryMenuSuperior(@RequestBody List<Long> ids) { public ResponseEntity<KitPageResult<SystemMenuTb>> queryAllMenu(
Set<SystemMenuTb> menus; @Validated @RequestBody KitPageArgs<SystemQueryMenuArgs> args) throws Exception {
if (CollectionUtil.isNotEmpty(ids)) { SystemQueryMenuArgs criteria = args.getArgs();
menus = new LinkedHashSet<>(systemMenuService.queryMenuByIds(ids)); List<SystemMenuTb> menuList = systemMenuService.queryAllMenu(criteria, true);
for (SystemMenuTb menu : menus) { return ResponseEntity.ok(KitPageUtil.toPage(menuList));
List<SystemMenuTb> menuList = systemMenuService.querySuperiorMenuList(menu, new ArrayList<>()); }
for (SystemMenuTb data : menuList) {
if (data.getId().equals(menu.getPid())) { @ApiOperation("查询菜单:根据ID获取同级与上级数据")
data.setSubCount(data.getSubCount() - 1); @PostMapping("/queryMenuSuperior")
} @PreAuthorize("@el.check('menu:list')")
} public ResponseEntity<List<SystemMenuTb>> queryMenuSuperior(@RequestBody List<Long> ids) {
menus.addAll(menuList); Set<SystemMenuTb> menus;
} if (CollectionUtil.isNotEmpty(ids)) {
// 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 menus = new LinkedHashSet<>(systemMenuService.queryMenuByIds(ids));
menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); for (SystemMenuTb menu : menus) {
return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); List<SystemMenuTb> menuList = systemMenuService.querySuperiorMenuList(menu, new ArrayList<>());
for (SystemMenuTb data : menuList) {
if (data.getId().equals(menu.getPid())) {
data.setSubCount(data.getSubCount() - 1);
}
} }
return ResponseEntity.ok(systemMenuService.queryMenuByPid(null)); menus.addAll(menuList);
}
// 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题
menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet());
return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus)));
} }
return ResponseEntity.ok(systemMenuService.queryMenuByPid(null));
}
@Operation(summary = "新增菜单") @ApiOperation("新增菜单")
@PostMapping(value = "/saveMenu") @PostMapping(value = "/saveMenu")
@PreAuthorize("@el.check('menu:add')") @PreAuthorize("@el.check('menu:add')")
public ResponseEntity<Void> saveMenu(@Validated @RequestBody SystemMenuTb args) { public ResponseEntity<Void> saveMenu(@Validated @RequestBody SystemMenuTb args) {
if (args.getId() != null) { if (args.getId() != null) {
throw new BadRequestException("无效参数id"); throw new BadRequestException("无效参数id");
}
systemMenuService.saveMenu(args);
return ResponseEntity.ok(null);
} }
systemMenuService.saveMenu(args);
return ResponseEntity.ok(null);
}
@Operation(summary = "修改菜单") @ApiOperation("修改菜单")
@PostMapping(value = "/modifyMenuById") @PostMapping(value = "/modifyMenuById")
@PreAuthorize("@el.check('menu:edit')") @PreAuthorize("@el.check('menu:edit')")
public ResponseEntity<Void> modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { public ResponseEntity<Void> modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) {
systemMenuService.modifyMenuById(args); systemMenuService.modifyMenuById(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "删除菜单") @ApiOperation("删除菜单")
@PostMapping(value = "/removeMenuByIds") @PostMapping(value = "/removeMenuByIds")
@PreAuthorize("@el.check('menu:del')") @PreAuthorize("@el.check('menu:del')")
public ResponseEntity<Void> removeMenuByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Void> removeMenuByIds(@RequestBody Set<Long> ids) {
systemMenuService.removeMenuByIds(ids); systemMenuService.removeMenuByIds(ids);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
} }
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.system.service.SystemMonitorService; import cn.odboy.system.service.SystemMonitorService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import java.util.Map; import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -28,15 +27,17 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "系统-服务监控管理") @Api(tags = "系统-服务监控管理")
@RequestMapping("/api/monitor") @RequestMapping("/api/monitor")
public class SystemMonitorController { public class SystemMonitorController {
@Autowired private SystemMonitorService systemMonitorService;
@PostMapping(value = "/queryServerMonitorInfo") @Autowired
@Operation(summary = "查询服务监控") private SystemMonitorService systemMonitorService;
@PreAuthorize("@el.check('monitor:list')")
public ResponseEntity<Map<String, Object>> queryServerMonitorInfo() { @PostMapping(value = "/queryServerMonitorInfo")
return ResponseEntity.ok(systemMonitorService.queryServerMonitorInfo()); @ApiOperation("查询服务监控")
} @PreAuthorize("@el.check('monitor:list')")
public ResponseEntity<Map<String, Object>> queryServerMonitorInfo() {
return ResponseEntity.ok(systemMonitorService.queryServerMonitorInfo());
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -23,11 +22,11 @@ import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO;
import cn.odboy.util.KitDesEncryptUtil; import cn.odboy.util.KitDesEncryptUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -40,36 +39,38 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/api/user/online") @RequestMapping("/api/user/online")
@Tag(name = "系统:在线用户管理") @Api(tags = "系统:在线用户管理")
public class SystemOnlineController { public class SystemOnlineController {
@Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO;
@Operation(summary = "查询在线用户") @Autowired
@PostMapping private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO;
@PreAuthorize("@el.check()")
public ResponseEntity<KitPageResult<SystemUserOnlineVo>> queryOnlineUser(
@Validated @RequestBody KitPageArgs<SystemUserOnlineVo> args) {
IPage<SystemUserOnlineVo> page = new Page<>(args.getPage(), args.getSize());
return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page));
}
@Operation(summary = "导出数据") @ApiOperation("查询在线用户")
@GetMapping(value = "/download") @PostMapping
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { public ResponseEntity<KitPageResult<SystemUserOnlineVo>> queryOnlineUser(
systemUserOnlineInfoDAO.downloadUserOnlineModelExcel( @Validated @RequestBody KitPageArgs<SystemUserOnlineVo> args) {
systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); IPage<SystemUserOnlineVo> page = new Page<>(args.getPage(), args.getSize());
} return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page));
}
@Operation(summary = "踢出用户") @ApiOperation("导出数据")
@PostMapping(value = "/kickOutUser") @GetMapping(value = "/download")
@PreAuthorize("@el.check()") @PreAuthorize("@el.check()")
public ResponseEntity<Void> kickOutUser(@RequestBody Set<String> keys) throws Exception { public void exportOnlineUser(HttpServletResponse response, String username) throws IOException {
for (String token : keys) { systemUserOnlineInfoDAO.downloadUserOnlineModelExcel(
// 解密Key systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response);
token = KitDesEncryptUtil.desDecrypt(token); }
systemUserOnlineInfoDAO.logoutByToken(token);
} @ApiOperation("踢出用户")
return ResponseEntity.ok(null); @PostMapping(value = "/kickOutUser")
@PreAuthorize("@el.check()")
public ResponseEntity<Void> kickOutUser(@RequestBody Set<String> keys) throws Exception {
for (String token : keys) {
// 解密Key
token = KitDesEncryptUtil.desDecrypt(token);
systemUserOnlineInfoDAO.logoutByToken(token);
} }
return ResponseEntity.ok(null);
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -23,10 +22,10 @@ import cn.odboy.system.dal.model.SystemOssStorageVo;
import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.dal.model.SystemQueryStorageArgs;
import cn.odboy.system.service.SystemOssStorageService; import cn.odboy.system.service.SystemOssStorageService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -42,40 +41,42 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@RestController @RestController
@Tag(name = "工具:OSS存储管理") @Api(tags = "工具:OSS存储管理")
@RequestMapping("/api/ossStorage") @RequestMapping("/api/ossStorage")
public class SystemOssStorageController { public class SystemOssStorageController {
@Autowired private SystemOssStorageService systemOssStorageService;
@Operation(summary = "查询文件") @Autowired
@PostMapping private SystemOssStorageService systemOssStorageService;
@PreAuthorize("@el.check('storage:list')")
public ResponseEntity<KitPageResult<SystemOssStorageVo>> queryOssStorage(
@Validated @RequestBody KitPageArgs<SystemQueryStorageArgs> args) {
SystemQueryStorageArgs criteria = args.getArgs();
Page<SystemOssStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemOssStorageService.queryOssStorage(criteria, page));
}
@Operation(summary = "导出数据") @ApiOperation("查询文件")
@GetMapping(value = "/download") @PostMapping
@PreAuthorize("@el.check('storage:list')") @PreAuthorize("@el.check('storage:list')")
public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { public ResponseEntity<KitPageResult<SystemOssStorageVo>> queryOssStorage(
systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(criteria), response); @Validated @RequestBody KitPageArgs<SystemQueryStorageArgs> args) {
} SystemQueryStorageArgs criteria = args.getArgs();
Page<SystemOssStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemOssStorageService.queryOssStorage(criteria, page));
}
@Operation(summary = "上传文件") @ApiOperation("导出数据")
@PostMapping(value = "/uploadFile") @GetMapping(value = "/download")
@PreAuthorize("@el.check('storage:add')") @PreAuthorize("@el.check('storage:list')")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException {
String fileUrl = systemOssStorageService.uploadFile(file); systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(criteria), response);
return ResponseEntity.ok(fileUrl); }
}
@Operation(summary = "多选删除") @ApiOperation("上传文件")
@PostMapping(value = "/removeFileByIds") @PostMapping(value = "/uploadFile")
public ResponseEntity<Void> removeFileByIds(@RequestBody Long[] ids) { @PreAuthorize("@el.check('storage:add')")
systemOssStorageService.removeFileByIds(ids); public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
return ResponseEntity.ok(null); String fileUrl = systemOssStorageService.uploadFile(file);
} return ResponseEntity.ok(fileUrl);
}
@ApiOperation("多选删除")
@PostMapping(value = "/removeFileByIds")
public ResponseEntity<Void> removeFileByIds(@RequestBody Long[] ids) {
systemOssStorageService.removeFileByIds(ids);
return ResponseEntity.ok(null);
}
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.controller; package cn.odboy.system.controller;
import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageArgs;
@@ -26,11 +25,11 @@ import cn.odboy.system.dal.model.SystemQueryQuartzJobArgs;
import cn.odboy.system.dal.model.SystemUpdateQuartzJobArgs; import cn.odboy.system.dal.model.SystemUpdateQuartzJobArgs;
import cn.odboy.system.service.SystemQuartzJobService; import cn.odboy.system.service.SystemQuartzJobService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -47,100 +46,102 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/api/quartzJob") @RequestMapping("/api/quartzJob")
@Tag(name = "系统:定时任务管理") @Api(tags = "系统:定时任务管理")
public class SystemQuartzJobController { public class SystemQuartzJobController {
@Autowired private SystemQuartzJobService systemQuartzJobService;
@Operation(summary = "查询定时任务") @Autowired
@PostMapping private SystemQuartzJobService systemQuartzJobService;
@PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<KitPageResult<SystemQuartzJobTb>> queryQuartzJobByCrud(
@Validated @RequestBody KitPageArgs<SystemQueryQuartzJobArgs> args) {
SystemQueryQuartzJobArgs criteria = args.getArgs();
Page<SystemQuartzJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemQuartzJobService.queryQuartzJobByArgs(criteria, page));
}
@Operation(summary = "导出任务数据") @ApiOperation("查询定时任务")
@GetMapping(value = "/download") @PostMapping
@PreAuthorize("@el.check('quartzJob:list')") @PreAuthorize("@el.check('quartzJob:list')")
public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { public ResponseEntity<KitPageResult<SystemQuartzJobTb>> queryQuartzJobByCrud(
systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(criteria), response); @Validated @RequestBody KitPageArgs<SystemQueryQuartzJobArgs> args) {
} SystemQueryQuartzJobArgs criteria = args.getArgs();
Page<SystemQuartzJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemQuartzJobService.queryQuartzJobByArgs(criteria, page));
}
@Operation(summary = "导出日志数据") @ApiOperation("导出任务数据")
@GetMapping(value = "/logs/download") @GetMapping(value = "/download")
@PreAuthorize("@el.check('quartzJob:list')") @PreAuthorize("@el.check('quartzJob:list')")
public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException {
systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(criteria), response); systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(criteria), response);
} }
@Operation(summary = "查询任务执行日志") @ApiOperation("导出日志数据")
@PostMapping(value = "/logs") @GetMapping(value = "/logs/download")
@PreAuthorize("@el.check('quartzJob:list')") @PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException {
Page<SystemQuartzLogTb> page = new Page<>(args.getPage(), args.getSize()); systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(criteria), response);
return ResponseEntity.ok(systemQuartzJobService.queryQuartzLogByArgs(args, page)); }
}
@Operation(summary = "新增定时任务") @ApiOperation("查询任务执行日志")
@PostMapping(value = "/createQuartzJob") @PostMapping(value = "/logs")
@PreAuthorize("@el.check('quartzJob:add')") @PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<Void> createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(SystemQueryQuartzJobArgs args) {
if (args.getId() != null) { Page<SystemQuartzLogTb> page = new Page<>(args.getPage(), args.getSize());
throw new BadRequestException("无效参数id"); return ResponseEntity.ok(systemQuartzJobService.queryQuartzLogByArgs(args, page));
} }
// 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义
checkBean(args.getBeanName());
systemQuartzJobService.createJob(args);
return ResponseEntity.ok(null);
}
@Operation(summary = "修改定时任务") @ApiOperation("新增定时任务")
@PutMapping @PostMapping(value = "/createQuartzJob")
@PreAuthorize("@el.check('quartzJob:edit')") @PreAuthorize("@el.check('quartzJob:add')")
public ResponseEntity<Void> updateQuartzJob( public ResponseEntity<Void> createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) {
@Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { if (args.getId() != null) {
// 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 throw new BadRequestException("无效参数id");
checkBean(args.getBeanName());
systemQuartzJobService.modifyQuartzJobResumeCron(args);
return ResponseEntity.ok(null);
} }
// 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义
checkBean(args.getBeanName());
systemQuartzJobService.createJob(args);
return ResponseEntity.ok(null);
}
@Operation(summary = "更改定时任务状态") @ApiOperation("修改定时任务")
@PostMapping(value = "/switchQuartzJobStatus/{id}") @PutMapping
@PreAuthorize("@el.check('quartzJob:edit')") @PreAuthorize("@el.check('quartzJob:edit')")
public ResponseEntity<Void> switchQuartzJobStatus(@PathVariable Long id) { public ResponseEntity<Void> updateQuartzJob(
systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) {
return ResponseEntity.ok(null); // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义
} checkBean(args.getBeanName());
systemQuartzJobService.modifyQuartzJobResumeCron(args);
return ResponseEntity.ok(null);
}
@Operation(summary = "执行定时任务") @ApiOperation("更改定时任务状态")
@PostMapping(value = "/startQuartzJob/{id}") @PostMapping(value = "/switchQuartzJobStatus/{id}")
@PreAuthorize("@el.check('quartzJob:edit')") @PreAuthorize("@el.check('quartzJob:edit')")
public ResponseEntity<Void> startQuartzJob(@PathVariable Long id) { public ResponseEntity<Void> switchQuartzJobStatus(@PathVariable Long id) {
systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id));
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@Operation(summary = "删除定时任务") @ApiOperation("执行定时任务")
@PostMapping(value = "/removeJobByIds") @PostMapping(value = "/startQuartzJob/{id}")
@PreAuthorize("@el.check('quartzJob:del')") @PreAuthorize("@el.check('quartzJob:edit')")
public ResponseEntity<Void> removeJobByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Void> startQuartzJob(@PathVariable Long id) {
systemQuartzJobService.removeJobByIds(ids); systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id));
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
/** @ApiOperation("删除定时任务")
* 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 @PostMapping(value = "/removeJobByIds")
* @PreAuthorize("@el.check('quartzJob:del')")
* @param beanName Bean名称 public ResponseEntity<Void> removeJobByIds(@RequestBody Set<Long> ids) {
*/ systemQuartzJobService.removeJobByIds(ids);
private void checkBean(String beanName) { return ResponseEntity.ok(null);
// 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 }
// 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。
if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { /**
throw new BadRequestException("非法的 Bean,请重新输入!"); * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义
} *
* @param beanName Bean名称
*/
private void checkBean(String beanName) {
// 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类
// 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。
if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) {
throw new BadRequestException("非法的 Bean,请重新输入!");
} }
}
} }
@@ -28,11 +28,12 @@ import cn.odboy.system.service.SystemRoleService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -47,101 +48,103 @@ import org.springframework.web.bind.annotation.RestController;
@Api(tags = "系统:角色管理") @Api(tags = "系统:角色管理")
@RequestMapping("/api/role") @RequestMapping("/api/role")
public class SystemRoleController { public class SystemRoleController {
@Autowired private SystemRoleService systemRoleService;
@ApiOperation("获取单个role") @Autowired
@PostMapping(value = "/queryRoleById") private SystemRoleService systemRoleService;
@PreAuthorize("@el.check('roles:list')")
public ResponseEntity<SystemRoleTb> queryRoleById(@RequestBody SystemRoleTb args) {
return ResponseEntity.ok(systemRoleService.getRoleById(args.getId()));
}
@ApiOperation("导出角色数据") @ApiOperation("获取单个role")
@GetMapping(value = "/download") @PostMapping(value = "/queryRoleById")
@PreAuthorize("@el.check('role:list')") @PreAuthorize("@el.check('roles:list')")
public void exportRole(HttpServletResponse response, SystemQueryRoleArgs criteria) throws IOException { public ResponseEntity<SystemRoleTb> queryRoleById(@RequestBody SystemRoleTb args) {
systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(criteria), response); return ResponseEntity.ok(systemRoleService.getRoleById(args.getId()));
} }
@ApiOperation("返回全部的角色") @ApiOperation("导出角色数据")
@PostMapping(value = "/queryRoleList") @GetMapping(value = "/download")
@PreAuthorize("@el.check('roles:list','user:add','user:edit')") @PreAuthorize("@el.check('role:list')")
public ResponseEntity<List<SystemRoleTb>> queryRoleList() { public void exportRole(HttpServletResponse response, SystemQueryRoleArgs criteria) throws IOException {
return ResponseEntity.ok(systemRoleService.queryAllRole()); systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(criteria), response);
} }
@ApiOperation("查询角色") @ApiOperation("返回全部的角色")
@PostMapping @PostMapping(value = "/queryRoleList")
@PreAuthorize("@el.check('roles:list')") @PreAuthorize("@el.check('roles:list','user:add','user:edit')")
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs( public ResponseEntity<List<SystemRoleTb>> queryRoleList() {
@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> args) { return ResponseEntity.ok(systemRoleService.queryAllRole());
SystemQueryRoleArgs criteria = args.getArgs(); }
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemRoleService.queryRoleByArgs(criteria, page));
}
@ApiOperation("获取用户级别") @ApiOperation("查询角色")
@PostMapping(value = "/queryRoleLevel") @PostMapping
public ResponseEntity<Dict> queryRoleLevel() { @PreAuthorize("@el.check('roles:list')")
return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(
} @Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> args) {
SystemQueryRoleArgs criteria = args.getArgs();
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
return ResponseEntity.ok(systemRoleService.queryRoleByArgs(criteria, page));
}
@ApiOperation("新增角色") @ApiOperation("获取用户级别")
@PostMapping(value = "/saveRole") @PostMapping(value = "/queryRoleLevel")
@PreAuthorize("@el.check('roles:add')") public ResponseEntity<Dict> queryRoleLevel() {
public ResponseEntity<Void> saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null)));
checkRoleLevels(args.getLevel()); }
systemRoleService.saveRole(args);
return ResponseEntity.ok(null);
}
@ApiOperation("修改角色") @ApiOperation("新增角色")
@PostMapping(value = "/modifyRoleById") @PostMapping(value = "/saveRole")
@PreAuthorize("@el.check('roles:edit')") @PreAuthorize("@el.check('roles:add')")
public ResponseEntity<Void> modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) { public ResponseEntity<Void> saveRole(@Validated @RequestBody SystemCreateRoleArgs args) {
checkRoleLevels(args.getLevel()); checkRoleLevels(args.getLevel());
systemRoleService.modifyRoleById(args); systemRoleService.saveRole(args);
return ResponseEntity.ok(null); return ResponseEntity.ok(null);
} }
@ApiOperation("修改角色菜单") @ApiOperation("修改角色")
@PostMapping(value = "/modifyBindMenuById") @PostMapping(value = "/modifyRoleById")
@PreAuthorize("@el.check('roles:edit')") @PreAuthorize("@el.check('roles:edit')")
public ResponseEntity<Void> modifyBindMenuById(@RequestBody SystemRoleVo args) { public ResponseEntity<Void> modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) {
SystemRoleTb role = systemRoleService.getRoleById(args.getId()); checkRoleLevels(args.getLevel());
checkRoleLevels(role.getLevel()); systemRoleService.modifyRoleById(args);
systemRoleService.modifyBindMenuById(args); return ResponseEntity.ok(null);
return ResponseEntity.ok(null); }
}
@ApiOperation("删除角色") @ApiOperation("修改角色菜单")
@PostMapping(value = "/removeRoleByIds") @PostMapping(value = "/modifyBindMenuById")
@PreAuthorize("@el.check('roles:del')") @PreAuthorize("@el.check('roles:edit')")
public ResponseEntity<Void> removeRoleByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Void> modifyBindMenuById(@RequestBody SystemRoleVo args) {
for (Long id : ids) { SystemRoleTb role = systemRoleService.getRoleById(args.getId());
SystemRoleTb role = systemRoleService.getRoleById(id); checkRoleLevels(role.getLevel());
checkRoleLevels(role.getLevel()); systemRoleService.modifyBindMenuById(args);
} return ResponseEntity.ok(null);
// 验证是否被用户关联 }
systemRoleService.verifyBindRelationByIds(ids);
systemRoleService.removeRoleByIds(ids);
return ResponseEntity.ok(null);
}
/** @ApiOperation("删除角色")
* 检查用户的角色级别 @PostMapping(value = "/removeRoleByIds")
* @PreAuthorize("@el.check('roles:del')")
* @return / public ResponseEntity<Void> removeRoleByIds(@RequestBody Set<Long> ids) {
*/ for (Long id : ids) {
private int checkRoleLevels(Integer level) { SystemRoleTb role = systemRoleService.getRoleById(id);
List<Integer> levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() checkRoleLevels(role.getLevel());
.map(SystemRoleTb::getLevel).toList();
int min = Collections.min(levels);
if (level != null) {
if (level < min) {
throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level);
}
}
return min;
} }
// 验证是否被用户关联
systemRoleService.verifyBindRelationByIds(ids);
systemRoleService.removeRoleByIds(ids);
return ResponseEntity.ok(null);
}
/**
* 检查用户的角色级别
*
* @return /
*/
private int checkRoleLevels(Integer level) {
List<Integer> levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream()
.map(SystemRoleTb::getLevel).collect(Collectors.toList());
int min = Collections.min(levels);
if (level != null) {
if (level < min) {
throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level);
}
}
return min;
}
} }
@@ -39,11 +39,12 @@ import cn.odboy.util.KitRsaEncryptUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -64,172 +65,180 @@ import org.springframework.web.multipart.MultipartFile;
@RestController @RestController
@RequestMapping("/api/user") @RequestMapping("/api/user")
public class SystemUserController { public class SystemUserController {
@Autowired private PasswordEncoder passwordEncoder;
@Autowired private SystemUserService systemUserService;
@Autowired private SystemDataService systemDataService;
@Autowired private SystemDeptService systemDeptService;
@Autowired private SystemRoleService systemRoleService;
@Autowired private SystemEmailService systemEmailService;
@Autowired private AppProperties properties;
@ApiOperation("导出用户数据") @Autowired
@GetMapping(value = "/download") private PasswordEncoder passwordEncoder;
@PreAuthorize("@el.check('user:list')") @Autowired
public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs criteria) throws IOException { private SystemUserService systemUserService;
systemUserService.exportUserExcel(systemUserService.queryUserByArgs(criteria), response); @Autowired
} private SystemDataService systemDataService;
@Autowired
private SystemDeptService systemDeptService;
@Autowired
private SystemRoleService systemRoleService;
@Autowired
private SystemEmailService systemEmailService;
@Autowired
private AppProperties properties;
@ApiOperation("查询用户") @ApiOperation("导出用户数据")
@PostMapping @GetMapping(value = "/download")
@PreAuthorize("@el.check('user:list')") @PreAuthorize("@el.check('user:list')")
public ResponseEntity<KitPageResult<SystemUserVo>> queryUserByArgs( public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs criteria) throws IOException {
@Validated @RequestBody KitPageArgs<SystemQueryUserArgs> args) { systemUserService.exportUserExcel(systemUserService.queryUserByArgs(criteria), response);
Page<SystemUserTb> page = new Page<>(args.getPage(), args.getSize()); }
SystemQueryUserArgs criteria = args.getArgs();
if (!ObjectUtils.isEmpty(criteria.getDeptId())) {
criteria.getDeptIds().add(criteria.getDeptId());
// 先查找是否存在子节点
List<SystemDeptTb> data = systemDeptService.queryDeptByPid(criteria.getDeptId());
// 然后把子节点的ID都加入到集合中
criteria.getDeptIds().addAll(systemDeptService.queryChildDeptIdListByDeptIds(data));
}
// 数据权限
List<Long> dataScopes = systemDataService.findDeptIdListByArgs(
systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()));
// criteria.getDeptIds() 不为空并且数据权限不为空则取交集
if (!CollectionUtils.isEmpty(criteria.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) {
// 取交集
criteria.getDeptIds().retainAll(dataScopes);
if (!CollectionUtil.isEmpty(criteria.getDeptIds())) {
return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page));
}
} else {
// 否则取并集
criteria.getDeptIds().addAll(dataScopes);
return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page));
}
return ResponseEntity.ok(KitPageUtil.emptyData());
}
@ApiOperation("新增用户") @ApiOperation("查询用户")
@PostMapping(value = "/saveUser") @PostMapping
@PreAuthorize("@el.check('user:add')") @PreAuthorize("@el.check('user:list')")
public ResponseEntity<Object> saveUser(@Validated @RequestBody SystemUserVo args) { public ResponseEntity<KitPageResult<SystemUserVo>> queryUserByArgs(
checkLevel(args); @Validated @RequestBody KitPageArgs<SystemQueryUserArgs> args) {
// 默认密码 123456 Page<SystemUserTb> page = new Page<>(args.getPage(), args.getSize());
args.setPassword(passwordEncoder.encode("123456")); SystemQueryUserArgs criteria = args.getArgs();
systemUserService.saveUser(args); if (!ObjectUtils.isEmpty(criteria.getDeptId())) {
return ResponseEntity.ok(null); criteria.getDeptIds().add(criteria.getDeptId());
// 先查找是否存在子节点
List<SystemDeptTb> data = systemDeptService.queryDeptByPid(criteria.getDeptId());
// 然后把子节点的ID都加入到集合中
criteria.getDeptIds().addAll(systemDeptService.queryChildDeptIdListByDeptIds(data));
} }
// 数据权限
List<Long> dataScopes = systemDataService.findDeptIdListByArgs(
systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()));
// criteria.getDeptIds() 不为空并且数据权限不为空则取交集
if (!CollectionUtils.isEmpty(criteria.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) {
// 取交集
criteria.getDeptIds().retainAll(dataScopes);
if (!CollectionUtil.isEmpty(criteria.getDeptIds())) {
return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page));
}
} else {
// 否则取并集
criteria.getDeptIds().addAll(dataScopes);
return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page));
}
return ResponseEntity.ok(KitPageUtil.emptyData());
}
@ApiOperation("修改用户") @ApiOperation("新增用户")
@PostMapping(value = "/modifyUserById") @PostMapping(value = "/saveUser")
@PreAuthorize("@el.check('user:edit')") @PreAuthorize("@el.check('user:add')")
public ResponseEntity<Object> modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) { public ResponseEntity<Object> saveUser(@Validated @RequestBody SystemUserVo args) {
checkLevel(args); checkLevel(args);
systemUserService.modifyUserById(args); // 默认密码 123456
return ResponseEntity.ok(null); args.setPassword(passwordEncoder.encode("123456"));
} systemUserService.saveUser(args);
return ResponseEntity.ok(null);
}
@ApiOperation("修改用户:个人中心") @ApiOperation("修改用户")
@PostMapping(value = "modifyUserCenterInfoById") @PostMapping(value = "/modifyUserById")
public ResponseEntity<Object> modifyUserCenterInfoById( @PreAuthorize("@el.check('user:edit')")
@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { public ResponseEntity<Object> modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) {
if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { checkLevel(args);
throw new BadRequestException("不能修改他人资料"); systemUserService.modifyUserById(args);
} return ResponseEntity.ok(null);
systemUserService.modifyUserCenterInfoById(args); }
return ResponseEntity.ok(null);
}
@ApiOperation("删除用户") @ApiOperation("修改用户:个人中心")
@PostMapping(value = "/removeUserByIds") @PostMapping(value = "modifyUserCenterInfoById")
@PreAuthorize("@el.check('user:del')") public ResponseEntity<Object> modifyUserCenterInfoById(
public ResponseEntity<Object> removeUserByIds(@RequestBody Set<Long> ids) { @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) {
for (Long id : ids) { if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) {
Integer currentLevel = Collections.min( throw new BadRequestException("不能修改他人资料");
systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream()
.map(SystemRoleTb::getLevel).toList());
Integer optLevel =
Collections.min(systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel).toList());
if (currentLevel > optLevel) {
throw new BadRequestException(
"角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername());
}
}
systemUserService.removeUserByIds(ids);
return ResponseEntity.ok(null);
} }
systemUserService.modifyUserCenterInfoById(args);
return ResponseEntity.ok(null);
}
@ApiOperation("修改密码") @ApiOperation("删除用户")
@PostMapping(value = "/modifyUserPasswordByUsername") @PostMapping(value = "/removeUserByIds")
public ResponseEntity<Object> modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) @PreAuthorize("@el.check('user:del')")
throws Exception { public ResponseEntity<Object> removeUserByIds(@RequestBody Set<Long> ids) {
String oldPass = for (Long id : ids) {
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); Integer currentLevel = Collections.min(
String newPass = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream()
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); .map(SystemRoleTb::getLevel).collect(Collectors.toList()));
SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); Integer optLevel = Collections.min(
if (!passwordEncoder.matches(oldPass, user.getPassword())) { systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel)
throw new BadRequestException("修改失败,旧密码错误"); .collect(Collectors.toList()));
} if (currentLevel > optLevel) {
if (passwordEncoder.matches(newPass, user.getPassword())) { throw new BadRequestException(
throw new BadRequestException("新密码不能与旧密码相同"); "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername());
} }
systemUserService.modifyUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass));
return ResponseEntity.ok(null);
} }
systemUserService.removeUserByIds(ids);
return ResponseEntity.ok(null);
}
@ApiOperation("重置密码") @ApiOperation("修改密码")
@PostMapping(value = "/resetUserPasswordByIds") @PostMapping(value = "/modifyUserPasswordByUsername")
public ResponseEntity<Object> resetUserPasswordByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Object> modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo)
String defaultPwd = passwordEncoder.encode("123456"); throws Exception {
systemUserService.resetUserPasswordByIds(ids, defaultPwd); String oldPass =
return ResponseEntity.ok(null); KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass());
String newPass =
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass());
SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername());
if (!passwordEncoder.matches(oldPass, user.getPassword())) {
throw new BadRequestException("修改失败,旧密码错误");
} }
if (passwordEncoder.matches(newPass, user.getPassword())) {
throw new BadRequestException("新密码不能与旧密码相同");
}
systemUserService.modifyUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass));
return ResponseEntity.ok(null);
}
@ApiOperation("修改头像") @ApiOperation("重置密码")
@PostMapping(value = "/modifyUserAvatar") @PostMapping(value = "/resetUserPasswordByIds")
public ResponseEntity<Object> modifyUserAvatar(@RequestParam MultipartFile avatar) { public ResponseEntity<Object> resetUserPasswordByIds(@RequestBody Set<Long> ids) {
return ResponseEntity.ok(systemUserService.modifyUserAvatar(avatar)); String defaultPwd = passwordEncoder.encode("123456");
} systemUserService.resetUserPasswordByIds(ids, defaultPwd);
return ResponseEntity.ok(null);
}
@ApiOperation("修改邮箱") @ApiOperation("修改头像")
@PostMapping(value = "/modifyUserEmailByUsername/{code}") @PostMapping(value = "/modifyUserAvatar")
public ResponseEntity<Object> modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) public ResponseEntity<Object> modifyUserAvatar(@RequestParam MultipartFile avatar) {
throws Exception { return ResponseEntity.ok(systemUserService.modifyUserAvatar(avatar));
String password = }
KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword());
SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername());
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new BadRequestException("密码错误");
}
systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code);
systemUserService.modifyUserEmailByUsername(user.getUsername(), args.getEmail());
return ResponseEntity.ok(null);
}
/** @ApiOperation("修改邮箱")
* 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 @PostMapping(value = "/modifyUserEmailByUsername/{code}")
* public ResponseEntity<Object> modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args)
* @param args / throws Exception {
*/ String password =
private void checkLevel(SystemUserVo args) { KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword());
Integer currentLevel = Collections.min( SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername());
systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() if (!passwordEncoder.matches(password, user.getPassword())) {
.map(SystemRoleTb::getLevel).toList()); throw new BadRequestException("密码错误");
Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles());
if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足");
}
} }
systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code);
systemUserService.modifyUserEmailByUsername(user.getUsername(), args.getEmail());
return ResponseEntity.ok(null);
}
@ApiOperation("查询用户基础数据") /**
@PostMapping(value = "/queryUserMetadataOptions") * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误
@PreAuthorize("@el.check('user:list')") *
public ResponseEntity<List<KitSelectOptionVo>> queryUserMetadataOptions( * @param args /
@Validated @RequestBody KitPageArgs<SystemQueryUserArgs> args) { */
List<KitSelectOptionVo> collect = systemUserService.queryUserMetadataOptions(args); private void checkLevel(SystemUserVo args) {
return ResponseEntity.ok(collect); Integer currentLevel = Collections.min(
systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream()
.map(SystemRoleTb::getLevel).collect(Collectors.toList()));
Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles());
if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足");
} }
}
@ApiOperation("查询用户基础数据")
@PostMapping(value = "/queryUserMetadataOptions")
@PreAuthorize("@el.check('user:list')")
public ResponseEntity<List<KitSelectOptionVo>> queryUserMetadataOptions(@Validated @RequestBody KitPageArgs<SystemQueryUserArgs> args) {
List<KitSelectOptionVo> collect = systemUserService.queryUserMetadataOptions(args);
return ResponseEntity.ok(collect);
}
} }
@@ -22,11 +22,11 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -35,46 +35,59 @@ import lombok.Setter;
@TableName("system_dept") @TableName("system_dept")
public class SystemDeptTb extends KitBaseUserTimeTb { public class SystemDeptTb extends KitBaseUserTimeTb {
@NotNull(groups = Update.class) @TableId(value = "dept_id", type = IdType.AUTO) @NotNull(groups = Update.class)
@ApiModelProperty(value = "ID", hidden = true) private Long id; @TableId(value = "dept_id", type = IdType.AUTO)
@TableField(exist = false) @JSONField(serialize = false) @ApiModelProperty(value = "角色") private Set<SystemRoleTb> @ApiModelProperty(value = "ID", hidden = true)
roles; private Long id;
@TableField(exist = false) @ApiModelProperty(value = "子部门") private List<SystemDeptTb> children; @TableField(exist = false)
@ApiModelProperty(value = "排序") private Integer deptSort; @JSONField(serialize = false)
@NotBlank @ApiModelProperty(value = "部门名称") private String name; @ApiModelProperty(value = "角色")
@NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; private Set<SystemRoleTb> roles;
@ApiModelProperty(value = "上级部门") private Long pid; @TableField(exist = false)
@ApiModelProperty(value = "子节点数目", hidden = true) private Integer subCount = 0; @ApiModelProperty(value = "子部门")
private List<SystemDeptTb> children;
@ApiModelProperty(value = "排序")
private Integer deptSort;
@NotBlank
@ApiModelProperty(value = "部门名称")
private String name;
@NotNull
@ApiModelProperty(value = "是否启用")
private Boolean enabled;
@ApiModelProperty(value = "上级部门")
private Long pid;
@ApiModelProperty(value = "子节点数目", hidden = true)
private Integer subCount = 0;
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) { if (this == o) {
return true; return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
SystemDeptTb dept = (SystemDeptTb)o;
return Objects.equals(id, dept.id) && Objects.equals(name, dept.name);
} }
if (o == null || getClass() != o.getClass()) {
return false;
}
SystemDeptTb dept = (SystemDeptTb) o;
return Objects.equals(id, dept.id) && Objects.equals(name, dept.name);
}
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(id, name); return Objects.hash(id, name);
} }
@ApiModelProperty(value = "是否有子节点") @ApiModelProperty(value = "是否有子节点")
public Boolean getHasChildren() { public Boolean getHasChildren() {
return subCount > 0; return subCount > 0;
} }
@ApiModelProperty(value = "是否为叶子") @ApiModelProperty(value = "是否为叶子")
public Boolean getLeaf() { public Boolean getLeaf() {
return subCount <= 0; return subCount <= 0;
} }
@ApiModelProperty(value = "标签名称") @ApiModelProperty(value = "标签名称")
public String getLabel() { public String getLabel() {
return name; return name;
} }
} }
@@ -29,10 +29,18 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_dict_detail") @TableName("system_dict_detail")
public class SystemDictDetailTb extends KitBaseUserTimeTb { public class SystemDictDetailTb extends KitBaseUserTimeTb {
@NotNull(groups = Update.class) @ApiModelProperty(value = "ID", hidden = true)
@TableId(value = "id", type = IdType.AUTO) private Long id; @NotNull(groups = Update.class)
@TableField(value = "dict_id") @ApiModelProperty(hidden = true) private Long dictId; @ApiModelProperty(value = "ID", hidden = true)
@ApiModelProperty(value = "字典标签") private String label; @TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "字典值") private String value; private Long id;
@ApiModelProperty(value = "排序") private Integer dictSort = 999; @TableField(value = "dict_id")
@ApiModelProperty(hidden = true)
private Long dictId;
@ApiModelProperty(value = "字典标签")
private String label;
@ApiModelProperty(value = "字典值")
private String value;
@ApiModelProperty(value = "排序")
private Integer dictSort = 999;
} }
@@ -31,8 +31,15 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_dict") @TableName("system_dict")
public class SystemDictTb extends KitBaseUserTimeTb { public class SystemDictTb extends KitBaseUserTimeTb {
@NotNull(groups = Update.class) @ApiModelProperty(value = "ID", hidden = true)
@TableId(value = "id", type = IdType.AUTO) private Long id; @NotNull(groups = Update.class)
@NotBlank @ApiModelProperty(value = "名称") private String name; @ApiModelProperty(value = "ID", hidden = true)
@ApiModelProperty(value = "描述") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description; @TableId(value = "id", type = IdType.AUTO)
private Long id;
@NotBlank
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "描述")
@TableField(updateStrategy = FieldStrategy.ALWAYS)
private String description;
} }
@@ -30,10 +30,22 @@ import lombok.EqualsAndHashCode;
@TableName("system_email_config") @TableName("system_email_config")
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemEmailConfigTb extends KitObject { public class SystemEmailConfigTb extends KitObject {
@TableId("config_id") private Long id;
@NotBlank @ApiModelProperty(value = "邮件服务器SMTP地址") private String host; @TableId("config_id")
@NotBlank @ApiModelProperty(value = "邮件服务器 SMTP 端口") private String port; private Long id;
@NotBlank @ApiModelProperty(value = "发件者用户名") private String user; @NotBlank
@NotBlank @ApiModelProperty(value = "密码") private String password; @ApiModelProperty(value = "邮件服务器SMTP地址")
@NotBlank @ApiModelProperty(value = "收件人") private String fromUser; private String host;
@NotBlank
@ApiModelProperty(value = "邮件服务器 SMTP 端口")
private String port;
@NotBlank
@ApiModelProperty(value = "发件者用户名")
private String user;
@NotBlank
@ApiModelProperty(value = "密码")
private String password;
@NotBlank
@ApiModelProperty(value = "收件人")
private String fromUser;
} }
@@ -20,9 +20,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.util.Objects;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.util.Objects;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -30,26 +30,35 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_job") @TableName("system_job")
public class SystemJobTb extends KitBaseUserTimeTb { public class SystemJobTb extends KitBaseUserTimeTb {
@NotNull(groups = Update.class) @TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "ID", hidden = true) private Long id;
@NotBlank @ApiModelProperty(value = "岗位名称") private String name;
@NotNull @ApiModelProperty(value = "岗位排序") private Long jobSort;
@NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled;
@Override @NotNull(groups = Update.class)
public boolean equals(Object o) { @TableId(value = "id", type = IdType.AUTO)
if (this == o) { @ApiModelProperty(value = "ID", hidden = true)
return true; private Long id;
} @NotBlank
if (o == null || getClass() != o.getClass()) { @ApiModelProperty(value = "岗位名称")
return false; private String name;
} @NotNull
SystemJobTb job = (SystemJobTb)o; @ApiModelProperty(value = "岗位排序")
return Objects.equals(id, job.id); private Long jobSort;
} @NotNull
@ApiModelProperty(value = "是否启用")
private Boolean enabled;
@Override @Override
public int hashCode() { public boolean equals(Object o) {
return Objects.hash(id); if (this == o) {
return true;
} }
if (o == null || getClass() != o.getClass()) {
return false;
}
SystemJobTb job = (SystemJobTb) o;
return Objects.equals(id, job.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
} }
@@ -29,16 +29,26 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_local_storage") @TableName("system_local_storage")
public class SystemLocalStorageTb extends KitBaseUserTimeTb { public class SystemLocalStorageTb extends KitBaseUserTimeTb {
@TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id;
@ApiModelProperty(value = "真实文件名") private String realName;
@ApiModelProperty(value = "文件名") private String name;
@ApiModelProperty(value = "后缀") private String suffix;
@ApiModelProperty(value = "路径") private String path;
@ApiModelProperty(value = "类型") private String type;
@ApiModelProperty(value = "大小") private String size;
@ApiModelProperty(value = "日期分组") private String dateGroup;
public void copy(SystemLocalStorageTb source) { @TableId(value = "id", type = IdType.AUTO)
BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); @ApiModelProperty(value = "ID", hidden = true)
} private Long id;
@ApiModelProperty(value = "真实文件名")
private String realName;
@ApiModelProperty(value = "文件名")
private String name;
@ApiModelProperty(value = "后缀")
private String suffix;
@ApiModelProperty(value = "路径")
private String path;
@ApiModelProperty(value = "类型")
private String type;
@ApiModelProperty(value = "大小")
private String size;
@ApiModelProperty(value = "日期分组")
private String dateGroup;
public void copy(SystemLocalStorageTb source) {
BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true));
}
} }
@@ -22,10 +22,10 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import jakarta.validation.constraints.NotNull;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import jakarta.validation.constraints.NotNull;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -33,54 +33,74 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_menu") @TableName("system_menu")
public class SystemMenuTb extends KitBaseUserTimeTb { public class SystemMenuTb extends KitBaseUserTimeTb {
@NotNull(groups = {Update.class}) @TableId(value = "menu_id", type = IdType.AUTO)
@ApiModelProperty(value = "ID", hidden = true) private Long id;
@TableField(exist = false) @JSONField(serialize = false) @ApiModelProperty(value = "菜单角色")
private Set<SystemRoleTb> roles;
@TableField(exist = false) private List<SystemMenuTb> children;
@ApiModelProperty(value = "菜单标题") private String title;
@TableField(value = "name") @ApiModelProperty(value = "菜单组件名称") private String componentName;
@ApiModelProperty(value = "排序") private Integer menuSort = 999;
@ApiModelProperty(value = "组件路径") private String component;
@ApiModelProperty(value = "路由地址") private String path;
@ApiModelProperty(value = "菜单类型,目录、菜单、按钮") private Integer type;
@ApiModelProperty(value = "权限标识") private String permission;
@ApiModelProperty(value = "菜单图标") private String icon;
@ApiModelProperty(value = "缓存") private Boolean cache;
@ApiModelProperty(value = "是否隐藏") private Boolean hidden;
@ApiModelProperty(value = "上级菜单") private Long pid;
@ApiModelProperty(value = "子节点数目", hidden = true) private Integer subCount = 0;
@ApiModelProperty(value = "外链菜单") private Boolean iFrame;
@Override @NotNull(groups = {Update.class})
public boolean equals(Object o) { @TableId(value = "menu_id", type = IdType.AUTO)
if (this == o) { @ApiModelProperty(value = "ID", hidden = true)
return true; private Long id;
} @TableField(exist = false)
if (o == null || getClass() != o.getClass()) { @JSONField(serialize = false)
return false; @ApiModelProperty(value = "菜单角色")
} private Set<SystemRoleTb> roles;
SystemMenuTb menu = (SystemMenuTb)o; @TableField(exist = false)
return Objects.equals(id, menu.id); private List<SystemMenuTb> children;
} @ApiModelProperty(value = "菜单标题")
private String title;
@TableField(value = "name")
@ApiModelProperty(value = "菜单组件名称")
private String componentName;
@ApiModelProperty(value = "排序")
private Integer menuSort = 999;
@ApiModelProperty(value = "组件路径")
private String component;
@ApiModelProperty(value = "路由地址")
private String path;
@ApiModelProperty(value = "菜单类型,目录、菜单、按钮")
private Integer type;
@ApiModelProperty(value = "权限标识")
private String permission;
@ApiModelProperty(value = "菜单图标")
private String icon;
@ApiModelProperty(value = "缓存")
private Boolean cache;
@ApiModelProperty(value = "是否隐藏")
private Boolean hidden;
@ApiModelProperty(value = "上级菜单")
private Long pid;
@ApiModelProperty(value = "子节点数目", hidden = true)
private Integer subCount = 0;
@ApiModelProperty(value = "外链菜单")
private Boolean iFrame;
@Override @Override
public int hashCode() { public boolean equals(Object o) {
return Objects.hash(id); if (this == o) {
return true;
} }
if (o == null || getClass() != o.getClass()) {
return false;
}
SystemMenuTb menu = (SystemMenuTb) o;
return Objects.equals(id, menu.id);
}
@ApiModelProperty(value = "是否有子节点") @Override
public Boolean getHasChildren() { public int hashCode() {
return subCount > 0; return Objects.hash(id);
} }
@ApiModelProperty(value = "是否为叶子") @ApiModelProperty(value = "是否有子节点")
public Boolean getLeaf() { public Boolean getHasChildren() {
return subCount <= 0; return subCount > 0;
} }
@ApiModelProperty(value = "标签名称") @ApiModelProperty(value = "是否为叶子")
public String getLabel() { public Boolean getLeaf() {
return title; return subCount <= 0;
} }
@ApiModelProperty(value = "标签名称")
public String getLabel() {
return title;
}
} }
@@ -42,48 +42,61 @@ import lombok.ToString;
@TableName("system_operation_log") @TableName("system_operation_log")
@ApiModel(value = "SystemOperationLog对象", description = "审计日志") @ApiModel(value = "SystemOperationLog对象", description = "审计日志")
public class SystemOperationLogTb extends KitObject { public class SystemOperationLogTb extends KitObject {
/**
* id /**
*/ * id
@ApiModelProperty("id") @TableId(value = "id", type = IdType.AUTO) private Long id; */
/** @ApiModelProperty("id")
* 业务名称 @TableId(value = "id", type = IdType.AUTO)
*/ private Long id;
@TableField("biz_name") private String bizName; /**
/** * 业务名称
* 业务方法 */
*/ @TableField("biz_name")
@TableField("method") private String method; private String bizName;
/** /**
* 业务参数 * 业务方法
*/ */
@TableField("params") private String params; @TableField("method")
/** private String method;
* 访问来源IP /**
*/ * 业务参数
@TableField("request_ip") private String requestIp; */
/** @TableField("params")
* 执行时间 private String params;
*/ /**
@TableField("execute_time") private Long executeTime; * 访问来源IP
/** */
* 用户名 @TableField("request_ip")
*/ private String requestIp;
@TableField("username") private String username; /**
/** * 执行时间
* 访问来源地址 */
*/ @TableField("execute_time")
@TableField("address") private String address; private Long executeTime;
/** /**
* 浏览器信息 * 用户名
*/ */
@TableField("browser_info") private String browserInfo; @TableField("username")
/** private String username;
* 异常详情 /**
*/ * 访问来源地址
@TableField("exception_detail") private String exceptionDetail; */
/** @TableField("address")
* 创建时间 private String address;
*/ /**
@TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; * 浏览器信息
*/
@TableField("browser_info")
private String browserInfo;
/**
* 异常详情
*/
@TableField("exception_detail")
private String exceptionDetail;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
} }
@@ -38,17 +38,44 @@ import lombok.Setter;
@TableName("system_oss_storage") @TableName("system_oss_storage")
@ApiModel(value = "SystemOssStorage对象", description = "OSS存储") @ApiModel(value = "SystemOssStorage对象", description = "OSS存储")
public class SystemOssStorageTb extends KitBaseUserTimeTb { public class SystemOssStorageTb extends KitBaseUserTimeTb {
@ApiModelProperty("ID") @TableId(value = "id", type = IdType.AUTO) private Long id;
@TableField("service_type") @ApiModelProperty("类型,比如minio") private String serviceType; @ApiModelProperty("ID")
@TableField("endpoint") @ApiModelProperty("服务地址") private String endpoint; @TableId(value = "id", type = IdType.AUTO)
@TableField("bucket_name") @ApiModelProperty("存储桶名称") private String bucketName; private Long id;
@TableField("file_name") @ApiModelProperty("完整文件名称") private String fileName; @TableField("service_type")
@TableField("file_size") @ApiModelProperty("文件大小, 单位:字节") private Long fileSize; @ApiModelProperty("类型,比如minio")
@TableField("file_mime") @ApiModelProperty("文件类型") private String fileMime; private String serviceType;
@ApiModelProperty("短文件名") @TableField("file_prefix") private String filePrefix; @TableField("endpoint")
@ApiModelProperty("文件后缀") @TableField("file_suffix") private String fileSuffix; @ApiModelProperty("服务地址")
@TableField("file_md5") @ApiModelProperty("文件md5") private String fileMd5; private String endpoint;
@TableField("file_url") @ApiModelProperty("文件链接") private String fileUrl; @TableField("bucket_name")
@TableField("file_code") @ApiModelProperty("文件编码") private String fileCode; @ApiModelProperty("存储桶名称")
@TableField("object_name") @ApiModelProperty("对象路径") private String objectName; private String bucketName;
@TableField("file_name")
@ApiModelProperty("完整文件名称")
private String fileName;
@TableField("file_size")
@ApiModelProperty("文件大小, 单位:字节")
private Long fileSize;
@TableField("file_mime")
@ApiModelProperty("文件类型")
private String fileMime;
@ApiModelProperty("短文件名")
@TableField("file_prefix")
private String filePrefix;
@ApiModelProperty("文件后缀")
@TableField("file_suffix")
private String fileSuffix;
@TableField("file_md5")
@ApiModelProperty("文件md5")
private String fileMd5;
@TableField("file_url")
@ApiModelProperty("文件链接")
private String fileUrl;
@TableField("file_code")
@ApiModelProperty("文件编码")
private String fileCode;
@TableField("object_name")
@ApiModelProperty("对象路径")
private String objectName;
} }
@@ -31,19 +31,40 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_quartz_job") @TableName("system_quartz_job")
public class SystemQuartzJobTb extends KitBaseUserTimeTb { public class SystemQuartzJobTb extends KitBaseUserTimeTb {
public static final String JOB_KEY = "JOB_KEY";
@TableId(value = "id", type = IdType.AUTO) @NotNull(groups = {Update.class}) private Long id; public static final String JOB_KEY = "JOB_KEY";
@TableField(exist = false) @ApiModelProperty(value = "用于子任务唯一标识", hidden = true) private String uuid; @TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "定时器名称") private String jobName; @NotNull(groups = {Update.class})
@NotBlank @ApiModelProperty(value = "Bean名称") private String beanName; private Long id;
@NotBlank @ApiModelProperty(value = "方法名称") private String methodName; @TableField(exist = false)
@ApiModelProperty(value = "参数") private String params; @ApiModelProperty(value = "用于子任务唯一标识", hidden = true)
@NotBlank @ApiModelProperty(value = "cron表达式") private String cronExpression; private String uuid;
@ApiModelProperty(value = "状态:暂停或启动") private Boolean isPause = false; @ApiModelProperty(value = "定时器名称")
@ApiModelProperty(value = "负责人") private String personInCharge; private String jobName;
@ApiModelProperty(value = "报警邮箱") private String email; @NotBlank
@ApiModelProperty(value = "子任务") private String subTask; @ApiModelProperty(value = "Bean名称")
@ApiModelProperty(value = "失败后暂停") private Boolean pauseAfterFailure; private String beanName;
@NotBlank @ApiModelProperty(value = "备注") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String @NotBlank
description; @ApiModelProperty(value = "方法名称")
private String methodName;
@ApiModelProperty(value = "参数")
private String params;
@NotBlank
@ApiModelProperty(value = "cron表达式")
private String cronExpression;
@ApiModelProperty(value = "状态:暂停或启动")
private Boolean isPause = false;
@ApiModelProperty(value = "负责人")
private String personInCharge;
@ApiModelProperty(value = "报警邮箱")
private String email;
@ApiModelProperty(value = "子任务")
private String subTask;
@ApiModelProperty(value = "失败后暂停")
private Boolean pauseAfterFailure;
@NotBlank
@ApiModelProperty(value = "备注")
@TableField(updateStrategy = FieldStrategy.ALWAYS)
private String
description;
} }
@@ -30,14 +30,27 @@ import lombok.EqualsAndHashCode;
@TableName("system_quartz_log") @TableName("system_quartz_log")
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemQuartzLogTb extends KitObject { public class SystemQuartzLogTb extends KitObject {
@TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id;
@ApiModelProperty(value = "任务名称", hidden = true) private String jobName; @TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "bean名称", hidden = true) private String beanName; @ApiModelProperty(value = "ID", hidden = true)
@ApiModelProperty(value = "方法名称", hidden = true) private String methodName; private Long id;
@ApiModelProperty(value = "参数", hidden = true) private String params; @ApiModelProperty(value = "任务名称", hidden = true)
@ApiModelProperty(value = "cron表达式", hidden = true) private String cronExpression; private String jobName;
@ApiModelProperty(value = "状态", hidden = true) private Boolean isSuccess; @ApiModelProperty(value = "bean名称", hidden = true)
@ApiModelProperty(value = "异常详情", hidden = true) private String exceptionDetail; private String beanName;
@ApiModelProperty(value = "执行耗时", hidden = true) private Long time; @ApiModelProperty(value = "方法名称", hidden = true)
@TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间", hidden = true) private Date createTime; private String methodName;
@ApiModelProperty(value = "参数", hidden = true)
private String params;
@ApiModelProperty(value = "cron表达式", hidden = true)
private String cronExpression;
@ApiModelProperty(value = "状态", hidden = true)
private Boolean isSuccess;
@ApiModelProperty(value = "异常详情", hidden = true)
private String exceptionDetail;
@ApiModelProperty(value = "执行耗时", hidden = true)
private Long time;
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间", hidden = true)
private Date createTime;
} }
@@ -25,6 +25,9 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_roles_depts") @TableName("system_roles_depts")
public class SystemRoleDeptTb extends KitObject { public class SystemRoleDeptTb extends KitObject {
@TableField(value = "role_id") private Long roleId;
@TableField(value = "dept_id") private Long deptId; @TableField(value = "role_id")
private Long roleId;
@TableField(value = "dept_id")
private Long deptId;
} }
@@ -12,6 +12,9 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_roles_menus") @TableName("system_roles_menus")
public class SystemRoleMenuTb { public class SystemRoleMenuTb {
@TableField(value = "role_id") private Long roleId;
@TableField(value = "menu_id") private Long menuId; @TableField(value = "role_id")
private Long roleId;
@TableField(value = "menu_id")
private Long menuId;
} }
@@ -23,9 +23,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.util.Objects;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.util.Objects;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -36,28 +36,37 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_role") @TableName("system_role")
public class SystemRoleTb extends KitBaseUserTimeTb { public class SystemRoleTb extends KitBaseUserTimeTb {
@NotNull(groups = {Update.class}) @TableId(value = "role_id", type = IdType.AUTO)
@ApiModelProperty(value = "ID", hidden = true) private Long id;
@NotBlank @ApiModelProperty(value = "名称", hidden = true) private String name;
@ApiModelProperty(value = "数据权限,全部 、 本级 、 自定义") private String dataScope =
SystemDataScopeEnum.THIS_LEVEL.getValue();
@ApiModelProperty(value = "级别,数值越小,级别越大") private Integer level = 3;
@ApiModelProperty(value = "描述") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description;
@Override @NotNull(groups = {Update.class})
public boolean equals(Object o) { @TableId(value = "role_id", type = IdType.AUTO)
if (this == o) { @ApiModelProperty(value = "ID", hidden = true)
return true; private Long id;
} @NotBlank
if (o == null || getClass() != o.getClass()) { @ApiModelProperty(value = "名称", hidden = true)
return false; private String name;
} @ApiModelProperty(value = "数据权限,全部 、 本级 、 自定义")
SystemRoleTb role = (SystemRoleTb)o; private String dataScope =
return Objects.equals(id, role.id); SystemDataScopeEnum.THIS_LEVEL.getValue();
} @ApiModelProperty(value = "级别,数值越小,级别越大")
private Integer level = 3;
@ApiModelProperty(value = "描述")
@TableField(updateStrategy = FieldStrategy.ALWAYS)
private String description;
@Override @Override
public int hashCode() { public boolean equals(Object o) {
return Objects.hash(id); if (this == o) {
return true;
} }
if (o == null || getClass() != o.getClass()) {
return false;
}
SystemRoleTb role = (SystemRoleTb) o;
return Objects.equals(id, role.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
} }
@@ -12,6 +12,9 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_users_jobs") @TableName("system_users_jobs")
public class SystemUserJobTb { public class SystemUserJobTb {
@TableField(value = "user_id") private Long userId;
@TableField(value = "job_id") private Long jobId; @TableField(value = "user_id")
private Long userId;
@TableField(value = "job_id")
private Long jobId;
} }
@@ -25,6 +25,9 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_users_roles") @TableName("system_users_roles")
public class SystemUserRoleTb extends KitObject { public class SystemUserRoleTb extends KitObject {
@TableField(value = "user_id") private Long userId;
@TableField(value = "role_id") private Long roleId; @TableField(value = "user_id")
private Long userId;
@TableField(value = "role_id")
private Long roleId;
} }
@@ -21,11 +21,11 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import java.util.Objects;
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.util.Date;
import java.util.Objects;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -33,36 +33,60 @@ import lombok.Setter;
@Setter @Setter
@TableName("system_user") @TableName("system_user")
public class SystemUserTb extends KitBaseUserTimeTb { public class SystemUserTb extends KitBaseUserTimeTb {
@NotNull(groups = Update.class) @TableId(value = "user_id", type = IdType.AUTO)
@ApiModelProperty(value = "ID", hidden = true) private Long id;
@TableField(value = "dept_id") @ApiModelProperty(hidden = true) private Long deptId;
@ApiModelProperty(value = "用户部门") @TableField(exist = false) private SystemDeptTb dept;
@NotBlank @ApiModelProperty(value = "用户名称") private String username;
@NotBlank @ApiModelProperty(value = "用户昵称") private String nickName;
@Email @NotBlank @ApiModelProperty(value = "邮箱") private String email;
@NotBlank @ApiModelProperty(value = "电话号码") private String phone;
@ApiModelProperty(value = "用户性别") private String gender;
@ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName;
@ApiModelProperty(value = "头像存储的路径", hidden = true) private String avatarPath;
@ApiModelProperty(value = "密码") private String password;
@NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled;
@ApiModelProperty(value = "是否为admin账号", hidden = true) private Boolean isAdmin = false;
@ApiModelProperty(value = "最后修改密码的时间", hidden = true) private Date pwdResetTime;
@Override @NotNull(groups = Update.class)
public boolean equals(Object o) { @TableId(value = "user_id", type = IdType.AUTO)
if (this == o) { @ApiModelProperty(value = "ID", hidden = true)
return true; private Long id;
} @TableField(value = "dept_id")
if (o == null || getClass() != o.getClass()) { @ApiModelProperty(hidden = true)
return false; private Long deptId;
} @ApiModelProperty(value = "用户部门")
SystemUserTb user = (SystemUserTb)o; @TableField(exist = false)
return Objects.equals(id, user.id) && Objects.equals(username, user.username); private SystemDeptTb dept;
} @NotBlank
@ApiModelProperty(value = "用户名称")
private String username;
@NotBlank
@ApiModelProperty(value = "用户昵称")
private String nickName;
@Email
@NotBlank
@ApiModelProperty(value = "邮箱")
private String email;
@NotBlank
@ApiModelProperty(value = "电话号码")
private String phone;
@ApiModelProperty(value = "用户性别")
private String gender;
@ApiModelProperty(value = "头像真实名称", hidden = true)
private String avatarName;
@ApiModelProperty(value = "头像存储的路径", hidden = true)
private String avatarPath;
@ApiModelProperty(value = "密码")
private String password;
@NotNull
@ApiModelProperty(value = "是否启用")
private Boolean enabled;
@ApiModelProperty(value = "是否为admin账号", hidden = true)
private Boolean isAdmin = false;
@ApiModelProperty(value = "最后修改密码的时间", hidden = true)
private Date pwdResetTime;
@Override @Override
public int hashCode() { public boolean equals(Object o) {
return Objects.hash(id, username); if (this == o) {
return true;
} }
if (o == null || getClass() != o.getClass()) {
return false;
}
SystemUserTb user = (SystemUserTb) o;
return Objects.equals(id, user.id) && Objects.equals(username, user.username);
}
@Override
public int hashCode() {
return Objects.hash(id, username);
}
} }
@@ -23,7 +23,11 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemCheckEmailCaptchaArgs extends KitObject { public class SystemCheckEmailCaptchaArgs extends KitObject {
@NotBlank(message = "邮箱不能为空") private String email;
@NotBlank(message = "验证码不能为空") private String code; @NotBlank(message = "邮箱不能为空")
@NotBlank(message = "验证码业务标识不能为空") private String bizCode; private String email;
@NotBlank(message = "验证码不能为空")
private String code;
@NotBlank(message = "验证码业务标识不能为空")
private String bizCode;
} }
@@ -24,10 +24,13 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemCreateDeptArgs extends KitObject { public class SystemCreateDeptArgs extends KitObject {
@NotBlank(message = "部门名称必填") private String name;
@NotNull(message = "部门排序必填") private Integer deptSort; @NotBlank(message = "部门名称必填")
private Boolean enabled; private String name;
private String isTop; @NotNull(message = "部门排序必填")
private Long pid; private Integer deptSort;
private Integer subCount = 0; private Boolean enabled;
private String isTop;
private Long pid;
private Integer subCount = 0;
} }
@@ -23,6 +23,8 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemCreateDictArgs extends KitObject { public class SystemCreateDictArgs extends KitObject {
@NotBlank(message = "字典名称必填") private String name;
private String description; @NotBlank(message = "字典名称必填")
private String name;
private String description;
} }
@@ -25,8 +25,13 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemCreateDictDetailArgs extends KitObject { public class SystemCreateDictDetailArgs extends KitObject {
@NotNull(message = "参数dict必填") private SystemDictTb dict;
@NotBlank(message = "字典标签必填") private String label; @NotNull(message = "参数dict必填")
@NotBlank(message = "字典值必填") private String value; private SystemDictTb dict;
@NotNull(message = "字典排序必填") private Integer dictSort; @NotBlank(message = "字典标签必填")
private String label;
@NotBlank(message = "字典值必填")
private String value;
@NotNull(message = "字典排序必填")
private Integer dictSort;
} }
@@ -24,7 +24,10 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemCreateJobArgs extends KitObject { public class SystemCreateJobArgs extends KitObject {
@NotBlank(message = "职位名称必填") private String name;
@NotNull(message = "职位排序必填") private Integer jobSort; @NotBlank(message = "职位名称必填")
private Boolean enabled; private String name;
@NotNull(message = "职位排序必填")
private Integer jobSort;
private Boolean enabled;
} }
@@ -17,22 +17,26 @@ package cn.odboy.system.dal.model;
import cn.odboy.base.KitObject; import cn.odboy.base.KitObject;
import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemDeptTb;
import java.util.Set;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.util.Set;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemCreateRoleArgs extends KitObject { public class SystemCreateRoleArgs extends KitObject {
@NotBlank(message = "角色名称必填") private String name;
@NotNull(message = "角色级别必填") private Integer level; @NotBlank(message = "角色名称必填")
@NotBlank(message = "数据范围必填") private String dataScope; private String name;
private String description; @NotNull(message = "角色级别必填")
/** private Integer level;
* 关联的部门 @NotBlank(message = "数据范围必填")
*/ private String dataScope;
private Long id; private String description;
private Set<SystemDeptTb> depts; /**
* 关联的部门
*/
private Long id;
private Set<SystemDeptTb> depts;
} }
@@ -24,5 +24,7 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemDictDetailVo extends SystemDictDetailTb { public class SystemDictDetailVo extends SystemDictDetailTb {
@ApiModelProperty(value = "字典") private SystemDictTb dict;
@ApiModelProperty(value = "字典")
private SystemDictTb dict;
} }
@@ -25,7 +25,11 @@ import lombok.EqualsAndHashCode;
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemMenuMetaVo extends KitObject { public class SystemMenuMetaVo extends KitObject {
@ApiModelProperty(value = "菜单标题") private String title;
@ApiModelProperty(value = "菜单图标") private String icon; @ApiModelProperty(value = "菜单标题")
@ApiModelProperty(value = "缓存") private Boolean noCache; private String title;
@ApiModelProperty(value = "菜单图标")
private String icon;
@ApiModelProperty(value = "缓存")
private Boolean noCache;
} }
@@ -27,12 +27,21 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemMenuVo extends KitObject { public class SystemMenuVo extends KitObject {
@ApiModelProperty(value = "菜单名称") private String name;
@ApiModelProperty(value = "路径") private String path; @ApiModelProperty(value = "菜单名称")
@ApiModelProperty(value = "隐藏状态") private Boolean hidden; private String name;
@ApiModelProperty(value = "重定向") private String redirect; @ApiModelProperty(value = "路径")
@ApiModelProperty(value = "组件") private String component; private String path;
@ApiModelProperty(value = "总是显示") private Boolean alwaysShow; @ApiModelProperty(value = "隐藏状态")
@ApiModelProperty(value = "元数据") private SystemMenuMetaVo meta; private Boolean hidden;
@ApiModelProperty(value = "子路由") private List<SystemMenuVo> children; @ApiModelProperty(value = "重定向")
private String redirect;
@ApiModelProperty(value = "组件")
private String component;
@ApiModelProperty(value = "总是显示")
private Boolean alwaysShow;
@ApiModelProperty(value = "元数据")
private SystemMenuMetaVo meta;
@ApiModelProperty(value = "子路由")
private List<SystemMenuVo> children;
} }
@@ -22,5 +22,6 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemOssStorageVo extends SystemOssStorageTb { public class SystemOssStorageVo extends SystemOssStorageTb {
private String fileSizeDesc;
private String fileSizeDesc;
} }
@@ -23,7 +23,8 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemProductLineTreeVo extends KitObject { public class SystemProductLineTreeVo extends KitObject {
private String value;
private String label; private String value;
private List<SystemProductLineTreeVo> children; private String label;
private List<SystemProductLineTreeVo> children;
} }
@@ -22,16 +22,17 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemProductLineVo extends KitObject { public class SystemProductLineVo extends KitObject {
/**
* 部门ID(select的value) /**
*/ * 部门ID(select的value)
private Long value; */
/** private Long value;
* 产品线,如"研发部/华南分部/devops组" /**
*/ * 产品线,如"研发部/华南分部/devops组"
private String label; */
/** private String label;
* ID路径,如"1-2-3" /**
*/ * ID路径,如"1-2-3"
private String idPath; */
private String idPath;
} }
@@ -22,10 +22,17 @@ import lombok.Data;
@Data @Data
public class SystemQueryDeptArgs { public class SystemQueryDeptArgs {
@ApiModelProperty(value = "部门id集合") private List<Long> ids;
@ApiModelProperty(value = "部门名称") private String name; @ApiModelProperty(value = "部门id集合")
@ApiModelProperty(value = "是否启用") private Boolean enabled; private List<Long> ids;
@ApiModelProperty(value = "上级部门") private Long pid; @ApiModelProperty(value = "部门名称")
@ApiModelProperty(value = "PID为空查询") private Boolean pidIsNull; private String name;
@ApiModelProperty(value = "创建时间") private List<Date> createTime; @ApiModelProperty(value = "是否启用")
private Boolean enabled;
@ApiModelProperty(value = "上级部门")
private Long pid;
@ApiModelProperty(value = "PID为空查询")
private Boolean pidIsNull;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
} }
@@ -20,7 +20,11 @@ import lombok.Data;
@Data @Data
public class SystemQueryDictArgs { public class SystemQueryDictArgs {
@ApiModelProperty(value = "模糊查询") private String blurry;
@ApiModelProperty(value = "页码", example = "1") private Integer page = 1; @ApiModelProperty(value = "模糊查询")
@ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; private String blurry;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -23,6 +23,9 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemQueryDictDetailArgs extends KitObject { public class SystemQueryDictDetailArgs extends KitObject {
@ApiModelProperty(value = "标签") private String label;
@ApiModelProperty(value = "字典名称") private String dictName; @ApiModelProperty(value = "标签")
private String label;
@ApiModelProperty(value = "字典名称")
private String dictName;
} }
@@ -24,9 +24,15 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class SystemQueryJobArgs { public class SystemQueryJobArgs {
@ApiModelProperty(value = "岗位名称") private String name;
@ApiModelProperty(value = "是否启用") private Boolean enabled; @ApiModelProperty(value = "岗位名称")
@ApiModelProperty(value = "创建时间") private List<Date> createTime; private String name;
@ApiModelProperty(value = "页码", example = "1") private Integer page = 1; @ApiModelProperty(value = "是否启用")
@ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; private Boolean enabled;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -22,8 +22,13 @@ import lombok.Data;
@Data @Data
public class SystemQueryMenuArgs { public class SystemQueryMenuArgs {
@ApiModelProperty(value = "模糊查询") private String blurry;
@ApiModelProperty(value = "创建时间") private List<Date> createTime; @ApiModelProperty(value = "模糊查询")
@ApiModelProperty(value = "PID为空查询") private Boolean pidIsNull; private String blurry;
@ApiModelProperty(value = "PID") private Long pid; @ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "PID为空查询")
private Boolean pidIsNull;
@ApiModelProperty(value = "PID")
private Long pid;
} }
@@ -22,9 +22,15 @@ import lombok.Data;
@Data @Data
public class SystemQueryQuartzJobArgs { public class SystemQueryQuartzJobArgs {
@ApiModelProperty(value = "定时任务名称") private String jobName;
@ApiModelProperty(value = "是否成功") private Boolean isSuccess; @ApiModelProperty(value = "定时任务名称")
@ApiModelProperty(value = "创建时间") private List<Date> createTime; private String jobName;
@ApiModelProperty(value = "页码", example = "1") private Integer page = 1; @ApiModelProperty(value = "是否成功")
@ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; private Boolean isSuccess;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -22,9 +22,15 @@ import lombok.Data;
@Data @Data
public class SystemQueryRoleArgs { public class SystemQueryRoleArgs {
@ApiModelProperty(value = "模糊查询") private String blurry;
@ApiModelProperty(value = "创建时间") private List<Date> createTime; @ApiModelProperty(value = "模糊查询")
@ApiModelProperty(value = "页码", example = "1") private Integer page = 1; private String blurry;
@ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; @ApiModelProperty(value = "创建时间")
@ApiModelProperty(value = "偏移量", hidden = true) private long offset; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
@ApiModelProperty(value = "偏移量", hidden = true)
private long offset;
} }
@@ -22,8 +22,13 @@ import lombok.Data;
@Data @Data
public class SystemQueryStorageArgs { public class SystemQueryStorageArgs {
@ApiModelProperty(value = "模糊查询") private String blurry;
@ApiModelProperty(value = "创建时间") private List<Date> createTime; @ApiModelProperty(value = "模糊查询")
@ApiModelProperty(value = "页码", example = "1") private Integer page = 1; private String blurry;
@ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; @ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -27,12 +27,21 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemQueryUserArgs extends KitObject { public class SystemQueryUserArgs extends KitObject {
@ApiModelProperty(value = "ID") private Long id;
@ApiModelProperty(value = "多个ID") private Set<Long> deptIds = new HashSet<>(); @ApiModelProperty(value = "ID")
@ApiModelProperty(value = "模糊查询") private String blurry; private Long id;
@ApiModelProperty(value = "是否启用") private Boolean enabled; @ApiModelProperty(value = "多个ID")
@ApiModelProperty(value = "部门ID") private Long deptId; private Set<Long> deptIds = new HashSet<>();
@ApiModelProperty(value = "创建时间") private List<Date> createTime; @ApiModelProperty(value = "模糊查询")
@ApiModelProperty(value = "页码", example = "1") private Integer page = 1; private String blurry;
@ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; @ApiModelProperty(value = "是否启用")
private Boolean enabled;
@ApiModelProperty(value = "部门ID")
private Long deptId;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -28,5 +28,7 @@ import org.springframework.security.core.GrantedAuthority;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class SystemRoleCodeVo implements GrantedAuthority { public class SystemRoleCodeVo implements GrantedAuthority {
@ApiModelProperty(value = "角色名") private String authority;
@ApiModelProperty(value = "角色名")
private String authority;
} }
@@ -12,7 +12,11 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemRoleVo extends SystemRoleTb { public class SystemRoleVo extends SystemRoleTb {
@ApiModelProperty(value = "用户", hidden = true) private Set<SystemUserTb> users;
@ApiModelProperty(value = "菜单", hidden = true) private Set<SystemMenuTb> menus; @ApiModelProperty(value = "用户", hidden = true)
@ApiModelProperty(value = "部门", hidden = true) private Set<SystemDeptTb> depts; private Set<SystemUserTb> users;
@ApiModelProperty(value = "菜单", hidden = true)
private Set<SystemMenuTb> menus;
@ApiModelProperty(value = "部门", hidden = true)
private Set<SystemDeptTb> depts;
} }
@@ -16,9 +16,9 @@
package cn.odboy.system.dal.model; package cn.odboy.system.dal.model;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.util.List;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -30,7 +30,14 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class SystemSendEmailArgs { public class SystemSendEmailArgs {
@NotEmpty @ApiModelProperty(value = "收件人") private List<String> tos;
@NotBlank @ApiModelProperty(value = "主题") private String subject; @NotEmpty
@NotBlank @ApiModelProperty(value = "内容") private String content; @ApiModelProperty(value = "收件人")
private List<String> tos;
@NotBlank
@ApiModelProperty(value = "主题")
private String subject;
@NotBlank
@ApiModelProperty(value = "内容")
private String content;
} }
@@ -28,17 +28,30 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemSimpleUserVo extends KitObject { public class SystemSimpleUserVo extends KitObject {
@ApiModelProperty(value = "ID", hidden = true) private Long id;
@ApiModelProperty(value = "用户角色") private Set<SystemRoleTb> roles; @ApiModelProperty(value = "ID", hidden = true)
@ApiModelProperty(value = "用户岗位") private Set<SystemJobTb> jobs; private Long id;
private Long deptId; @ApiModelProperty(value = "用户角色")
@TableField(exist = false) private SystemDeptTb dept; private Set<SystemRoleTb> roles;
@ApiModelProperty(value = "用户名称") private String username; @ApiModelProperty(value = "用户岗位")
@ApiModelProperty(value = "用户昵称") private String nickName; private Set<SystemJobTb> jobs;
@ApiModelProperty(value = "邮箱") private String email; private Long deptId;
@ApiModelProperty(value = "电话号码") private String phone; @TableField(exist = false)
@ApiModelProperty(value = "用户性别") private String gender; private SystemDeptTb dept;
@ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName; @ApiModelProperty(value = "用户名称")
@ApiModelProperty(value = "是否启用") private Boolean enabled; private String username;
@ApiModelProperty(value = "是否为admin账号", hidden = true) private Boolean isAdmin = false; @ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "邮箱")
private String email;
@ApiModelProperty(value = "电话号码")
private String phone;
@ApiModelProperty(value = "用户性别")
private String gender;
@ApiModelProperty(value = "头像真实名称", hidden = true)
private String avatarName;
@ApiModelProperty(value = "是否启用")
private Boolean enabled;
@ApiModelProperty(value = "是否为admin账号", hidden = true)
private Boolean isAdmin = false;
} }
@@ -24,17 +24,23 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemUpdateQuartzJobArgs extends KitObject { public class SystemUpdateQuartzJobArgs extends KitObject {
@NotNull private Long id;
private String uuid; @NotNull
private String jobName; private Long id;
@NotBlank private String beanName; private String uuid;
@NotBlank private String methodName; private String jobName;
private String params; @NotBlank
@NotBlank private String cronExpression; private String beanName;
private Boolean isPause = false; @NotBlank
private String personInCharge; private String methodName;
private String email; private String params;
private String subTask; @NotBlank
private Boolean pauseAfterFailure; private String cronExpression;
@NotBlank private String description; private Boolean isPause = false;
private String personInCharge;
private String email;
private String subTask;
private Boolean pauseAfterFailure;
@NotBlank
private String description;
} }
@@ -23,6 +23,9 @@ import lombok.Data;
*/ */
@Data @Data
public class SystemUpdateUserPasswordArgs { public class SystemUpdateUserPasswordArgs {
@ApiModelProperty(value = "旧密码") private String oldPass;
@ApiModelProperty(value = "新密码") private String newPass; @ApiModelProperty(value = "旧密码")
private String oldPass;
@ApiModelProperty(value = "新密码")
private String newPass;
} }
@@ -25,11 +25,12 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SystemUserInfoVo extends KitObject { public class SystemUserInfoVo extends KitObject {
private SystemSimpleUserVo user;
private List<Long> dataScopes;
private List<SystemRoleCodeVo> authorities;
public Set<String> getRoles() { private SystemSimpleUserVo user;
return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); private List<Long> dataScopes;
} private List<SystemRoleCodeVo> authorities;
public Set<String> getRoles() {
return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet());
}
} }
@@ -28,47 +28,51 @@ import org.springframework.security.core.userdetails.UserDetails;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public class SystemUserJwtVo implements UserDetails { public class SystemUserJwtVo implements UserDetails {
@ApiModelProperty(value = "用户") private final SystemUserTb user;
@ApiModelProperty(value = "数据权限") private final List<Long> dataScopes;
@ApiModelProperty(value = "角色") private final List<SystemRoleCodeVo> authorities;
public Set<String> getRoles() { @ApiModelProperty(value = "用户")
return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); private final SystemUserTb user;
} @ApiModelProperty(value = "数据权限")
private final List<Long> dataScopes;
@ApiModelProperty(value = "角色")
private final List<SystemRoleCodeVo> authorities;
@Override public Set<String> getRoles() {
@JSONField(serialize = false) return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet());
public String getPassword() { }
return user.getPassword();
}
@Override @Override
@JSONField(serialize = false) @JSONField(serialize = false)
public String getUsername() { public String getPassword() {
return user.getUsername(); return user.getPassword();
} }
@Override @Override
@JSONField(serialize = false) @JSONField(serialize = false)
public boolean isAccountNonExpired() { public String getUsername() {
return true; return user.getUsername();
} }
@Override @Override
@JSONField(serialize = false) @JSONField(serialize = false)
public boolean isAccountNonLocked() { public boolean isAccountNonExpired() {
return true; return true;
} }
@Override @Override
@JSONField(serialize = false) @JSONField(serialize = false)
public boolean isCredentialsNonExpired() { public boolean isAccountNonLocked() {
return true; return true;
} }
@Override @Override
@JSONField(serialize = false) @JSONField(serialize = false)
public boolean isEnabled() { public boolean isCredentialsNonExpired() {
return user.getEnabled(); return true;
} }
@Override
@JSONField(serialize = false)
public boolean isEnabled() {
return user.getEnabled();
}
} }
@@ -23,8 +23,15 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemUserLoginArgs { public class SystemUserLoginArgs {
@NotBlank @ApiModelProperty(value = "用户名") private String username;
@NotBlank @ApiModelProperty(value = "密码") private String password; @NotBlank
@ApiModelProperty(value = "验证码") private String code; @ApiModelProperty(value = "用户名")
@ApiModelProperty(value = "验证码的key") private String uuid = ""; private String username;
@NotBlank
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "验证码")
private String code;
@ApiModelProperty(value = "验证码的key")
private String uuid = "";
} }
@@ -24,13 +24,23 @@ import lombok.Data;
*/ */
@Data @Data
public class SystemUserOnlineVo { public class SystemUserOnlineVo {
@ApiModelProperty(value = "Token编号") private String uid;
@ApiModelProperty(value = "用户名") private String userName; @ApiModelProperty(value = "Token编号")
@ApiModelProperty(value = "昵称") private String nickName; private String uid;
@ApiModelProperty(value = "岗位") private String dept; @ApiModelProperty(value = "用户名")
@ApiModelProperty(value = "浏览器") private String browser; private String userName;
@ApiModelProperty(value = "IP") private String ip; @ApiModelProperty(value = "昵称")
@ApiModelProperty(value = "地址") private String address; private String nickName;
@ApiModelProperty(value = "token") private String key; @ApiModelProperty(value = "岗位")
@ApiModelProperty(value = "登录时间") private Date loginTime; private String dept;
@ApiModelProperty(value = "浏览器")
private String browser;
@ApiModelProperty(value = "IP")
private String ip;
@ApiModelProperty(value = "地址")
private String address;
@ApiModelProperty(value = "token")
private String key;
@ApiModelProperty(value = "登录时间")
private Date loginTime;
} }
@@ -11,6 +11,9 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class SystemUserVo extends SystemUserTb { public class SystemUserVo extends SystemUserTb {
@ApiModelProperty(value = "用户角色") private Set<SystemRoleTb> roles;
@ApiModelProperty(value = "用户岗位") private Set<SystemJobTb> jobs; @ApiModelProperty(value = "用户角色")
private Set<SystemRoleTb> roles;
@ApiModelProperty(value = "用户岗位")
private Set<SystemJobTb> jobs;
} }
@@ -32,46 +32,52 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SystemDeptMapper extends BaseMapper<SystemDeptTb> { public interface SystemDeptMapper extends BaseMapper<SystemDeptTb> {
default List<SystemDeptTb> selectDeptByPidIsNull() {
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>(); default List<SystemDeptTb> selectDeptByPidIsNull() {
wrapper.isNull(SystemDeptTb::getPid); LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
return selectList(wrapper); wrapper.isNull(SystemDeptTb::getPid);
} return selectList(wrapper);
default long countDeptByPid(Long pid) { }
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDeptTb::getPid, pid); default long countDeptByPid(Long pid) {
return selectCount(wrapper); LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
} wrapper.eq(SystemDeptTb::getPid, pid);
default List<SystemDeptTb> queryDeptByArgs(SystemQueryDeptArgs criteria) { return selectCount(wrapper);
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>(); }
if (criteria != null) {
wrapper.in(CollUtil.isNotEmpty(criteria.getIds()), SystemDeptTb::getId, criteria.getIds()); default List<SystemDeptTb> queryDeptByArgs(SystemQueryDeptArgs criteria) {
wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemDeptTb::getName, criteria.getName()); LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(criteria.getEnabled() != null, SystemDeptTb::getEnabled, criteria.getEnabled()); if (criteria != null) {
wrapper.eq(criteria.getPid() != null, SystemDeptTb::getPid, criteria.getPid()); wrapper.in(CollUtil.isNotEmpty(criteria.getIds()), SystemDeptTb::getId, criteria.getIds());
wrapper.isNull(criteria.getPidIsNull() != null, SystemDeptTb::getPid); wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemDeptTb::getName, criteria.getName());
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { wrapper.eq(criteria.getEnabled() != null, SystemDeptTb::getEnabled, criteria.getEnabled());
wrapper.between(SystemDeptTb::getCreateTime, criteria.getCreateTime().get(0), wrapper.eq(criteria.getPid() != null, SystemDeptTb::getPid, criteria.getPid());
criteria.getCreateTime().get(1)); wrapper.isNull(criteria.getPidIsNull() != null, SystemDeptTb::getPid);
} if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
} wrapper.between(SystemDeptTb::getCreateTime, criteria.getCreateTime().get(0),
wrapper.orderByAsc(SystemDeptTb::getDeptSort); criteria.getCreateTime().get(1));
return selectList(wrapper); }
}
default List<SystemDeptTb> selectEnabledDepts() {
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDeptTb::getEnabled, 1);
return selectList(wrapper);
}
default List<SystemDeptTb> selectDeptByPid(long pid) {
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDeptTb::getPid, pid);
return selectList(wrapper);
}
default void updateDeptSubCountById(long count, Long deptId) {
LambdaUpdateWrapper<SystemDeptTb> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(SystemDeptTb::getId, deptId);
wrapper.set(SystemDeptTb::getSubCount, count);
update(null, wrapper);
} }
wrapper.orderByAsc(SystemDeptTb::getDeptSort);
return selectList(wrapper);
}
default List<SystemDeptTb> selectEnabledDepts() {
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDeptTb::getEnabled, 1);
return selectList(wrapper);
}
default List<SystemDeptTb> selectDeptByPid(long pid) {
LambdaQueryWrapper<SystemDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDeptTb::getPid, pid);
return selectList(wrapper);
}
default void updateDeptSubCountById(long count, Long deptId) {
LambdaUpdateWrapper<SystemDeptTb> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(SystemDeptTb::getId, deptId);
wrapper.set(SystemDeptTb::getSubCount, count);
update(null, wrapper);
}
} }
@@ -31,14 +31,16 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SystemDictDetailMapper extends BaseMapper<SystemDictDetailTb> { public interface SystemDictDetailMapper extends BaseMapper<SystemDictDetailTb> {
default List<SystemDictDetailTb> selectByDictId(Long dictId) {
LambdaQueryWrapper<SystemDictDetailTb> wrapper = new LambdaQueryWrapper<>(); default List<SystemDictDetailTb> selectByDictId(Long dictId) {
wrapper.eq(SystemDictDetailTb::getDictId, dictId); LambdaQueryWrapper<SystemDictDetailTb> wrapper = new LambdaQueryWrapper<>();
return selectList(wrapper); wrapper.eq(SystemDictDetailTb::getDictId, dictId);
} return selectList(wrapper);
default IPage<SystemDictDetailTb> selectDictDetailByArgs(List<Long> dictIds, Page<SystemDictDetailTb> page) { }
LambdaQueryWrapper<SystemDictDetailTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(CollUtil.isNotEmpty(dictIds), SystemDictDetailTb::getDictId, dictIds); default IPage<SystemDictDetailTb> selectDictDetailByArgs(List<Long> dictIds, Page<SystemDictDetailTb> page) {
return selectPage(page, wrapper); LambdaQueryWrapper<SystemDictDetailTb> wrapper = new LambdaQueryWrapper<>();
} wrapper.in(CollUtil.isNotEmpty(dictIds), SystemDictDetailTb::getDictId, dictIds);
return selectPage(page, wrapper);
}
} }
@@ -31,25 +31,29 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SystemDictMapper extends BaseMapper<SystemDictTb> { public interface SystemDictMapper extends BaseMapper<SystemDictTb> {
default void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) {
if (args != null) { default void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or() if (args != null) {
.like(SystemDictTb::getDescription, args.getBlurry())); wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
} .like(SystemDictTb::getDescription, args.getBlurry()));
}
default List<SystemDictTb> selectDictByArgs(SystemQueryDictArgs args) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
return selectList(wrapper);
}
default List<SystemDictTb> selectDictByArgs(SystemQueryDictArgs args, Page<SystemDictTb> page) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
return selectList(page, wrapper);
}
default SystemDictTb getByName(String name) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDictTb::getName, name);
return selectOne(wrapper);
} }
}
default List<SystemDictTb> selectDictByArgs(SystemQueryDictArgs args) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
return selectList(wrapper);
}
default List<SystemDictTb> selectDictByArgs(SystemQueryDictArgs args, Page<SystemDictTb> page) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
return selectList(page, wrapper);
}
default SystemDictTb getByName(String name) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDictTb::getName, name);
return selectOne(wrapper);
}
} }
@@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper;
* @author odboy * @author odboy
*/ */
@Mapper @Mapper
public interface SystemEmailConfigMapper extends BaseMapper<SystemEmailConfigTb> {} public interface SystemEmailConfigMapper extends BaseMapper<SystemEmailConfigTb> {
}
@@ -33,32 +33,34 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SystemJobMapper extends BaseMapper<SystemJobTb> { public interface SystemJobMapper extends BaseMapper<SystemJobTb> {
default SystemJobTb getJobByName(String name) {
LambdaQueryWrapper<SystemJobTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemJobTb::getName, name);
return selectOne(wrapper);
}
default void injectQueryParams(SystemQueryJobArgs criteria, LambdaQueryWrapper<SystemJobTb> wrapper) {
if (criteria != null) {
wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemJobTb::getName, criteria.getName());
wrapper.eq(criteria.getEnabled() != null, SystemJobTb::getEnabled, criteria.getEnabled());
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, criteria.getCreateTime().get(0),
criteria.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId);
}
default IPage<SystemJobTb> selectJobByArgs(SystemQueryJobArgs criteria, Page<SystemJobTb> page) { default SystemJobTb getJobByName(String name) {
LambdaQueryWrapper<SystemJobTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemJobTb> wrapper = new LambdaQueryWrapper<>();
this.injectQueryParams(criteria, wrapper); wrapper.eq(SystemJobTb::getName, name);
return selectPage(page, wrapper); return selectOne(wrapper);
} }
default List<SystemJobTb> selectJobByArgs(SystemQueryJobArgs criteria) { default void injectQueryParams(SystemQueryJobArgs criteria, LambdaQueryWrapper<SystemJobTb> wrapper) {
LambdaQueryWrapper<SystemJobTb> wrapper = new LambdaQueryWrapper<>(); if (criteria != null) {
this.injectQueryParams(criteria, wrapper); wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemJobTb::getName, criteria.getName());
return selectList(wrapper); wrapper.eq(criteria.getEnabled() != null, SystemJobTb::getEnabled, criteria.getEnabled());
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, criteria.getCreateTime().get(0),
criteria.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId);
}
default IPage<SystemJobTb> selectJobByArgs(SystemQueryJobArgs criteria, Page<SystemJobTb> page) {
LambdaQueryWrapper<SystemJobTb> wrapper = new LambdaQueryWrapper<>();
this.injectQueryParams(criteria, wrapper);
return selectPage(page, wrapper);
}
default List<SystemJobTb> selectJobByArgs(SystemQueryJobArgs criteria) {
LambdaQueryWrapper<SystemJobTb> wrapper = new LambdaQueryWrapper<>();
this.injectQueryParams(criteria, wrapper);
return selectList(wrapper);
}
} }
@@ -33,31 +33,32 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SystemLocalStorageMapper extends BaseMapper<SystemLocalStorageTb> { public interface SystemLocalStorageMapper extends BaseMapper<SystemLocalStorageTb> {
default void injectQueryParams(SystemQueryStorageArgs criteria, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) {
if (criteria != null) {
wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, criteria.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, criteria.getBlurry()).or()
.like(SystemLocalStorageTb::getType, criteria.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, criteria.getBlurry()));
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, criteria.getCreateTime().get(0),
criteria.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemLocalStorageTb::getId);
}
default List<SystemLocalStorageTb> selectLocalStorageByArgs(SystemQueryStorageArgs criteria) { default void injectQueryParams(SystemQueryStorageArgs criteria, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) {
LambdaQueryWrapper<SystemLocalStorageTb> wrapper = new LambdaQueryWrapper<>(); if (criteria != null) {
injectQueryParams(criteria, wrapper); wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()),
return selectList(wrapper); c -> c.like(SystemLocalStorageTb::getName, criteria.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, criteria.getBlurry()).or()
.like(SystemLocalStorageTb::getType, criteria.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, criteria.getBlurry()));
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, criteria.getCreateTime().get(0),
criteria.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemLocalStorageTb::getId);
}
default IPage<SystemLocalStorageTb> selectLocalStorageByArgs(SystemQueryStorageArgs criteria, default List<SystemLocalStorageTb> selectLocalStorageByArgs(SystemQueryStorageArgs criteria) {
Page<SystemLocalStorageTb> page) { LambdaQueryWrapper<SystemLocalStorageTb> wrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<SystemLocalStorageTb> wrapper = new LambdaQueryWrapper<>(); injectQueryParams(criteria, wrapper);
injectQueryParams(criteria, wrapper); return selectList(wrapper);
return selectPage(page, wrapper); }
}
default IPage<SystemLocalStorageTb> selectLocalStorageByArgs(SystemQueryStorageArgs criteria,
Page<SystemLocalStorageTb> page) {
LambdaQueryWrapper<SystemLocalStorageTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(criteria, wrapper);
return selectPage(page, wrapper);
}
} }
@@ -32,61 +32,63 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface SystemMenuMapper extends BaseMapper<SystemMenuTb> { public interface SystemMenuMapper extends BaseMapper<SystemMenuTb> {
default void updateMenuSubCntByMenuId(Long count, Long menuId) {
if (count != null) {
LambdaUpdateWrapper<SystemMenuTb> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(SystemMenuTb::getId, menuId);
wrapper.set(SystemMenuTb::getSubCount, count);
update(wrapper);
}
}
default SystemMenuTb getMenuByComponentName(String componentName) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemMenuTb::getComponentName, componentName);
return selectOne(wrapper);
}
default SystemMenuTb getMenuByTitle(String title) { default void updateMenuSubCntByMenuId(Long count, Long menuId) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>(); if (count != null) {
wrapper.eq(SystemMenuTb::getTitle, title); LambdaUpdateWrapper<SystemMenuTb> wrapper = new LambdaUpdateWrapper<>();
return selectOne(wrapper); wrapper.eq(SystemMenuTb::getId, menuId);
wrapper.set(SystemMenuTb::getSubCount, count);
update(wrapper);
} }
}
default Long countMenuByPid(Long pid) { default SystemMenuTb getMenuByComponentName(String componentName) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemMenuTb::getPid, pid); wrapper.eq(SystemMenuTb::getComponentName, componentName);
return selectCount(wrapper); return selectOne(wrapper);
} }
default List<SystemMenuTb> selectMenuByArgs(SystemQueryMenuArgs criteria) { default SystemMenuTb getMenuByTitle(String title) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
if (criteria != null) { wrapper.eq(SystemMenuTb::getTitle, title);
wrapper.isNull(criteria.getPidIsNull() != null, SystemMenuTb::getPid); return selectOne(wrapper);
wrapper.eq(criteria.getPid() != null, SystemMenuTb::getPid, criteria.getPid()); }
wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()),
c -> c.like(SystemMenuTb::getTitle, criteria.getBlurry()).or()
.like(SystemMenuTb::getComponentName, criteria.getBlurry()).or()
.like(SystemMenuTb::getPermission, criteria.getBlurry()));
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
wrapper.between(SystemMenuTb::getCreateTime, criteria.getCreateTime().get(0),
criteria.getCreateTime().get(1));
}
}
wrapper.orderByAsc(SystemMenuTb::getMenuSort);
return selectList(wrapper);
}
default List<SystemMenuTb> selectMenuByPid(Long pid) { default Long countMenuByPid(Long pid) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemMenuTb::getPid, pid); wrapper.eq(SystemMenuTb::getPid, pid);
wrapper.orderByAsc(SystemMenuTb::getMenuSort); return selectCount(wrapper);
return selectList(wrapper); }
}
default List<SystemMenuTb> selectMenuByPidIsNull() { default List<SystemMenuTb> selectMenuByArgs(SystemQueryMenuArgs criteria) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.isNull(SystemMenuTb::getPid); if (criteria != null) {
wrapper.orderByAsc(SystemMenuTb::getMenuSort); wrapper.isNull(criteria.getPidIsNull() != null, SystemMenuTb::getPid);
return selectList(wrapper); wrapper.eq(criteria.getPid() != null, SystemMenuTb::getPid, criteria.getPid());
wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()),
c -> c.like(SystemMenuTb::getTitle, criteria.getBlurry()).or()
.like(SystemMenuTb::getComponentName, criteria.getBlurry()).or()
.like(SystemMenuTb::getPermission, criteria.getBlurry()));
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
wrapper.between(SystemMenuTb::getCreateTime, criteria.getCreateTime().get(0),
criteria.getCreateTime().get(1));
}
} }
wrapper.orderByAsc(SystemMenuTb::getMenuSort);
return selectList(wrapper);
}
default List<SystemMenuTb> selectMenuByPid(Long pid) {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemMenuTb::getPid, pid);
wrapper.orderByAsc(SystemMenuTb::getMenuSort);
return selectList(wrapper);
}
default List<SystemMenuTb> selectMenuByPidIsNull() {
LambdaQueryWrapper<SystemMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.isNull(SystemMenuTb::getPid);
wrapper.orderByAsc(SystemMenuTb::getMenuSort);
return selectList(wrapper);
}
} }
@@ -20,4 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface SystemOperationLogMapper extends BaseMapper<SystemOperationLogTb> {} public interface SystemOperationLogMapper extends BaseMapper<SystemOperationLogTb> {
}
@@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper;
* @since 2025-07-15 * @since 2025-07-15
*/ */
@Mapper @Mapper
public interface SystemOssStorageMapper extends BaseMapper<SystemOssStorageTb> {} public interface SystemOssStorageMapper extends BaseMapper<SystemOssStorageTb> {
}
@@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper;
* @author odboy * @author odboy
*/ */
@Mapper @Mapper
public interface SystemQuartzJobMapper extends BaseMapper<SystemQuartzJobTb> {} public interface SystemQuartzJobMapper extends BaseMapper<SystemQuartzJobTb> {
}
@@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper;
* @author odboy * @author odboy
*/ */
@Mapper @Mapper
public interface SystemQuartzLogMapper extends BaseMapper<SystemQuartzLogTb> {} public interface SystemQuartzLogMapper extends BaseMapper<SystemQuartzLogTb> {
}
@@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper;
* @author odboy * @author odboy
*/ */
@Mapper @Mapper
public interface SystemRoleDeptMapper extends BaseMapper<SystemRoleDeptTb> {} public interface SystemRoleDeptMapper extends BaseMapper<SystemRoleDeptTb> {
}
@@ -34,22 +34,28 @@ import org.apache.ibatis.annotations.Param;
*/ */
@Mapper @Mapper
public interface SystemRoleMapper extends BaseMapper<SystemRoleTb> { public interface SystemRoleMapper extends BaseMapper<SystemRoleTb> {
default Long countRoleByArgs(SystemQueryRoleArgs criteria) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>(); default Long countRoleByArgs(SystemQueryRoleArgs criteria) {
if (criteria != null) { LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), if (criteria != null) {
c -> c.like(SystemRoleTb::getName, criteria.getBlurry()).or() wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()),
.like(SystemRoleTb::getDescription, criteria.getBlurry())); c -> c.like(SystemRoleTb::getName, criteria.getBlurry()).or()
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { .like(SystemRoleTb::getDescription, criteria.getBlurry()));
wrapper.between(SystemRoleTb::getCreateTime, criteria.getCreateTime().get(0), if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
criteria.getCreateTime().get(1)); wrapper.between(SystemRoleTb::getCreateTime, criteria.getCreateTime().get(0),
} criteria.getCreateTime().get(1));
} }
return selectCount(wrapper);
} }
List<SystemRoleVo> selectRoleByArgs(@Param("criteria") SystemQueryRoleArgs criteria); return selectCount(wrapper);
List<SystemRoleVo> selectRoleByUserId(@Param("userId") Long userId); }
List<SystemRoleVo> selectRoleByMenuId(@Param("menuId") Long menuId);
SystemRoleVo getRoleById(@Param("roleId") Long roleId); List<SystemRoleVo> selectRoleByArgs(@Param("criteria") SystemQueryRoleArgs criteria);
Integer countRoleByDeptIds(@Param("deptIds") Set<Long> deptIds);
List<SystemRoleVo> selectRoleByUserId(@Param("userId") Long userId);
List<SystemRoleVo> selectRoleByMenuId(@Param("menuId") Long menuId);
SystemRoleVo getRoleById(@Param("roleId") Long roleId);
Integer countRoleByDeptIds(@Param("deptIds") Set<Long> deptIds);
} }
@@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper;
* @author odboy * @author odboy
*/ */
@Mapper @Mapper
public interface SystemRoleMenuMapper extends BaseMapper<SystemRoleMenuTb> {} public interface SystemRoleMenuMapper extends BaseMapper<SystemRoleMenuTb> {
}
@@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper;
* @author odboy * @author odboy
*/ */
@Mapper @Mapper
public interface SystemUserJobMapper extends BaseMapper<SystemUserJobTb> {} public interface SystemUserJobMapper extends BaseMapper<SystemUserJobTb> {
}
@@ -30,47 +30,61 @@ import org.apache.ibatis.annotations.Param;
@Mapper @Mapper
public interface SystemUserMapper extends BaseMapper<SystemUserTb> { public interface SystemUserMapper extends BaseMapper<SystemUserTb> {
List<SystemUserVo> selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria);
IPage<SystemUserVo> selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria, Page<SystemUserTb> page); List<SystemUserVo> selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria);
List<SystemUserVo> selectUserByRoleId(@Param("roleId") Long roleId);
List<SystemUserVo> selectUserByDeptId(@Param("deptId") Long deptId); IPage<SystemUserVo> selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria, Page<SystemUserTb> page);
List<SystemUserVo> selectUserByMenuId(@Param("menuId") Long menuId);
Long countUserByJobIds(@Param("jobIds") Set<Long> jobIds); List<SystemUserVo> selectUserByRoleId(@Param("roleId") Long roleId);
Long countUserByRoleIds(@Param("roleIds") Set<Long> roleIds);
SystemUserVo getUserByUsername(@Param("username") String username); List<SystemUserVo> selectUserByDeptId(@Param("deptId") Long deptId);
default long countUserByDeptIds(Set<Long> deptIds) {
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>(); List<SystemUserVo> selectUserByMenuId(@Param("menuId") Long menuId);
wrapper.in(SystemUserTb::getDeptId, deptIds);
return selectCount(wrapper); Long countUserByJobIds(@Param("jobIds") Set<Long> jobIds);
}
default SystemUserTb getUserByEmail(String email) { Long countUserByRoleIds(@Param("roleIds") Set<Long> roleIds);
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemUserTb::getEmail, email); SystemUserVo getUserByUsername(@Param("username") String username);
wrapper.eq(SystemUserTb::getEnabled, 1);
return selectOne(wrapper); default long countUserByDeptIds(Set<Long> deptIds) {
} LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
default SystemUserTb getUserByPhone(String phone) { wrapper.in(SystemUserTb::getDeptId, deptIds);
LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>(); return selectCount(wrapper);
wrapper.eq(SystemUserTb::getPhone, phone); }
wrapper.eq(SystemUserTb::getEnabled, 1);
return selectOne(wrapper); default SystemUserTb getUserByEmail(String email) {
} LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
default void updateUserPasswordByUsername(String username, String password) { wrapper.eq(SystemUserTb::getEmail, email);
LambdaUpdateWrapper<SystemUserTb> wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SystemUserTb::getEnabled, 1);
wrapper.eq(SystemUserTb::getUsername, username); return selectOne(wrapper);
wrapper.set(SystemUserTb::getPassword, password); }
update(null, wrapper);
} default SystemUserTb getUserByPhone(String phone) {
default void updateUserEmailByUsername(String username, String email) { LambdaQueryWrapper<SystemUserTb> wrapper = new LambdaQueryWrapper<>();
LambdaUpdateWrapper<SystemUserTb> wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SystemUserTb::getPhone, phone);
wrapper.eq(SystemUserTb::getUsername, username); wrapper.eq(SystemUserTb::getEnabled, 1);
wrapper.set(SystemUserTb::getEmail, email); return selectOne(wrapper);
update(null, wrapper); }
}
default void updateUserPasswordByUserIds(String password, Set<Long> userIds) { default void updateUserPasswordByUsername(String username, String password) {
LambdaUpdateWrapper<SystemUserTb> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<SystemUserTb> wrapper = new LambdaUpdateWrapper<>();
wrapper.in(SystemUserTb::getId, userIds); wrapper.eq(SystemUserTb::getUsername, username);
wrapper.set(SystemUserTb::getPassword, password); wrapper.set(SystemUserTb::getPassword, password);
update(null, wrapper); update(null, wrapper);
} }
default void updateUserEmailByUsername(String username, String email) {
LambdaUpdateWrapper<SystemUserTb> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(SystemUserTb::getUsername, username);
wrapper.set(SystemUserTb::getEmail, email);
update(null, wrapper);
}
default void updateUserPasswordByUserIds(String password, Set<Long> userIds) {
LambdaUpdateWrapper<SystemUserTb> wrapper = new LambdaUpdateWrapper<>();
wrapper.in(SystemUserTb::getId, userIds);
wrapper.set(SystemUserTb::getPassword, password);
update(null, wrapper);
}
} }
@@ -20,4 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface SystemUserRoleMapper extends BaseMapper<SystemUserRoleTb> {} public interface SystemUserRoleMapper extends BaseMapper<SystemUserRoleTb> {
}
@@ -19,50 +19,51 @@ package cn.odboy.system.dal.redis;
* 关于缓存的Key集合 * 关于缓存的Key集合
*/ */
public interface SystemCacheKey { public interface SystemCacheKey {
/**
* 用户 /**
*/ * 用户
String USER_ID = "user::id:"; */
/** String USER_ID = "user::id:";
* 数据 /**
*/ * 数据
String DATA_USER = "data::user:"; */
/** String DATA_USER = "data::user:";
* 菜单 /**
*/ * 菜单
String MENU_ID = "menu::id:"; */
String MENU_USER = "menu::user:"; String MENU_ID = "menu::id:";
/** String MENU_USER = "menu::user:";
* 角色授权 /**
*/ * 角色授权
String ROLE_AUTH = "role::auth:"; */
String ROLE_USER = "role::user:"; String ROLE_AUTH = "role::auth:";
/** String ROLE_USER = "role::user:";
* 角色信息 /**
*/ * 角色信息
String ROLE_ID = "role::id:"; */
/** String ROLE_ID = "role::id:";
* 部门 /**
*/ * 部门
String DEPT_ID = "dept::id:"; */
/** String DEPT_ID = "dept::id:";
* 岗位 /**
*/ * 岗位
String JOB_ID = "job::id:"; */
/** String JOB_ID = "job::id:";
* 数据字典 /**
*/ * 数据字典
String DICT_NAME = "dict::name:"; */
/** String DICT_NAME = "dict::name:";
* 在线用户 /**
*/ * 在线用户
String ONLINE_USER = "online::token:"; */
/** String ONLINE_USER = "online::token:";
* 登录验证码 /**
*/ * 登录验证码
String CAPTCHA_LOGIN = "captcha::login:"; */
/** String CAPTCHA_LOGIN = "captcha::login:";
* 用户信息 /**
*/ * 用户信息
String USER_INFO = "user::info:"; */
String USER_INFO = "user::info:";
} }
@@ -4,50 +4,51 @@ package cn.odboy.system.dal.redis;
* 关于缓存的Key集合 * 关于缓存的Key集合
*/ */
public interface SystemRedisKey { public interface SystemRedisKey {
/**
* 用户 /**
*/ * 用户
String USER_ID = "user::id:"; */
/** String USER_ID = "user::id:";
* 数据 /**
*/ * 数据
String DATA_USER = "data::user:"; */
/** String DATA_USER = "data::user:";
* 菜单 /**
*/ * 菜单
String MENU_ID = "menu::id:"; */
String MENU_USER = "menu::user:"; String MENU_ID = "menu::id:";
/** String MENU_USER = "menu::user:";
* 角色授权 /**
*/ * 角色授权
String ROLE_AUTH = "role::auth:"; */
String ROLE_USER = "role::user:"; String ROLE_AUTH = "role::auth:";
/** String ROLE_USER = "role::user:";
* 角色信息 /**
*/ * 角色信息
String ROLE_ID = "role::id:"; */
/** String ROLE_ID = "role::id:";
* 部门 /**
*/ * 部门
String DEPT_ID = "dept::id:"; */
/** String DEPT_ID = "dept::id:";
* 岗位 /**
*/ * 岗位
String JOB_ID = "job::id:"; */
/** String JOB_ID = "job::id:";
* 数据字典 /**
*/ * 数据字典
String DICT_NAME = "dict::name:"; */
/** String DICT_NAME = "dict::name:";
* 在线用户 /**
*/ * 在线用户
String ONLINE_USER = "online::token:"; */
/** String ONLINE_USER = "online::token:";
* 登录验证码 /**
*/ * 登录验证码
String CAPTCHA_LOGIN = "captcha::login:"; */
/** String CAPTCHA_LOGIN = "captcha::login:";
* 用户信息 /**
*/ * 用户信息
String USER_INFO = "user::info:"; */
String USER_INFO = "user::info:";
} }
@@ -13,46 +13,48 @@ import org.springframework.stereotype.Component;
*/ */
@Component @Component
public class SystemUserInfoDAO { public class SystemUserInfoDAO {
@Autowired private KitRedisHelper redisHelper;
/** @Autowired
* 添加缓存到Redis private KitRedisHelper redisHelper;
*
* @param userName 用户名
*/
@Async
public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) {
if (StrUtil.isNotEmpty(userName)) {
// 添加数据, 避免数据同时过期(2小时左右)
long time = 7200 + RandomUtil.randomInt(900, 1800);
redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time);
}
}
/** /**
* 清理用户缓存信息 用户信息变更时 * 添加缓存到Redis
* *
* @param userName 用户名 * @param userName 用户名
*/ */
@Async @Async
public void deleteUserLoginInfoByUserName(String userName) { public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) {
if (StrUtil.isNotEmpty(userName)) { if (StrUtil.isNotEmpty(userName)) {
// 清除数据 // 添加数据, 避免数据同时过期(2小时左右)
redisHelper.del(SystemRedisKey.USER_INFO + userName); long time = 7200 + RandomUtil.randomInt(900, 1800);
} redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time);
} }
}
/** /**
* 返回用户缓存 * 清理用户缓存信息 用户信息变更时
* *
* @param username 用户名 * @param userName 用户名
* @return UserJwtVo */
*/ @Async
public SystemUserJwtVo getUserLoginInfoByUserName(String username) { public void deleteUserLoginInfoByUserName(String userName) {
if (StrUtil.isNotEmpty(username)) { if (StrUtil.isNotEmpty(userName)) {
// 获取数据 // 清除数据
return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); redisHelper.del(SystemRedisKey.USER_INFO + userName);
}
return null;
} }
}
/**
* 返回用户缓存
*
* @param username 用户名
* @return UserJwtVo
*/
public SystemUserJwtVo getUserLoginInfoByUserName(String username) {
if (StrUtil.isNotEmpty(username)) {
// 获取数据
return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class);
}
return null;
}
} }
@@ -13,8 +13,6 @@ import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitIPUtil; import cn.odboy.util.KitIPUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -23,6 +21,8 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -31,129 +31,130 @@ import org.springframework.stereotype.Component;
@Component @Component
@AllArgsConstructor @AllArgsConstructor
public class SystemUserOnlineInfoDAO { public class SystemUserOnlineInfoDAO {
private final AppProperties properties;
private final TokenProvider tokenProvider;
private final KitRedisHelper redisHelper;
/** private final AppProperties properties;
* 保存在线用户信息 private final TokenProvider tokenProvider;
* private final KitRedisHelper redisHelper;
* @param userJwtVo /
* @param token /
* @param request /
*/
public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) {
String dept = userJwtVo.getUser().getDept().getName();
String ip = KitBrowserUtil.getIp(request);
String id = tokenProvider.getId(token);
String version = KitBrowserUtil.getVersion(request);
String address = KitIPUtil.getCityInfo(ip);
SystemUserOnlineVo userOnlineVo = null;
try {
userOnlineVo = new SystemUserOnlineVo();
userOnlineVo.setUid(id);
userOnlineVo.setUserName(userJwtVo.getUsername());
userOnlineVo.setNickName(userJwtVo.getUser().getNickName());
userOnlineVo.setDept(dept);
userOnlineVo.setBrowser(version);
userOnlineVo.setIp(ip);
userOnlineVo.setAddress(address);
userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token));
userOnlineVo.setLoginTime(new Date());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
String loginKey = tokenProvider.loginKey(token);
redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS);
}
/** /**
* 退出登录 * 保存在线用户信息
* *
* @param token / * @param userJwtVo /
*/ * @param token /
public void logoutByToken(String token) { * @param request /
String loginKey = tokenProvider.loginKey(token); */
redisHelper.del(loginKey); public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) {
String dept = userJwtVo.getUser().getDept().getName();
String ip = KitBrowserUtil.getIp(request);
String id = tokenProvider.getId(token);
String version = KitBrowserUtil.getVersion(request);
String address = KitIPUtil.getCityInfo(ip);
SystemUserOnlineVo userOnlineVo = null;
try {
userOnlineVo = new SystemUserOnlineVo();
userOnlineVo.setUid(id);
userOnlineVo.setUserName(userJwtVo.getUsername());
userOnlineVo.setNickName(userJwtVo.getUser().getNickName());
userOnlineVo.setDept(dept);
userOnlineVo.setBrowser(version);
userOnlineVo.setIp(ip);
userOnlineVo.setAddress(address);
userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token));
userOnlineVo.setLoginTime(new Date());
} catch (Exception e) {
log.error(e.getMessage(), e);
} }
String loginKey = tokenProvider.loginKey(token);
redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS);
}
/** /**
* 导出 * 退出登录
* *
* @param all / * @param token /
* @param response / */
* @throws IOException / public void logoutByToken(String token) {
*/ String loginKey = tokenProvider.loginKey(token);
public void downloadUserOnlineModelExcel(List<SystemUserOnlineVo> all, HttpServletResponse response) redisHelper.del(loginKey);
throws IOException { }
List<Map<String, Object>> list = new ArrayList<>();
for (SystemUserOnlineVo user : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("用户名", user.getUserName());
map.put("部门", user.getDept());
map.put("登录IP", user.getIp());
map.put("登录地点", user.getAddress());
map.put("浏览器", user.getBrowser());
map.put("登录日期", user.getLoginTime());
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 根据用户名强退用户 * 导出
* *
* @param username / * @param all /
*/ * @param response /
public void kickOutByUsername(String username) { * @throws IOException /
String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; */
redisHelper.scanDel(loginKey); public void downloadUserOnlineModelExcel(List<SystemUserOnlineVo> all, HttpServletResponse response)
throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (SystemUserOnlineVo user : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("用户名", user.getUserName());
map.put("部门", user.getDept());
map.put("登录IP", user.getIp());
map.put("登录地点", user.getAddress());
map.put("浏览器", user.getBrowser());
map.put("登录日期", user.getLoginTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 查询全部数据 * 根据用户名强退用户
* *
* @param onlineVo / * @param username /
* @param pageable / */
* @return / public void kickOutByUsername(String username) {
*/ String loginKey = SystemRedisKey.ONLINE_USER + username + "*";
public KitPageResult<SystemUserOnlineVo> queryUserOnlineModelPage(SystemUserOnlineVo onlineVo, redisHelper.scanDel(loginKey);
IPage<SystemUserOnlineVo> pageable) { }
String username = null;
if (onlineVo != null) {
username = onlineVo.getUserName();
}
List<SystemUserOnlineVo> onlineUserList = queryUserOnlineModelListByUsername(username);
List<SystemUserOnlineVo> paging =
KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList);
return KitPageUtil.toPage(paging, onlineUserList.size());
}
/** /**
* 查询全部数据,不分页 * 查询全部数据
* *
* @param username / * @param onlineVo /
* @return / * @param pageable /
*/ * @return /
public List<SystemUserOnlineVo> queryUserOnlineModelListByUsername(String username) { */
String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); public KitPageResult<SystemUserOnlineVo> queryUserOnlineModelPage(SystemUserOnlineVo onlineVo,
List<String> keys = redisHelper.scan(loginKey + "*"); IPage<SystemUserOnlineVo> pageable) {
Collections.reverse(keys); String username = null;
List<SystemUserOnlineVo> onlineUserList = new ArrayList<>(); if (onlineVo != null) {
for (String key : keys) { username = onlineVo.getUserName();
onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class));
}
onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
return onlineUserList;
} }
List<SystemUserOnlineVo> onlineUserList = queryUserOnlineModelListByUsername(username);
List<SystemUserOnlineVo> paging =
KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList);
return KitPageUtil.toPage(paging, onlineUserList.size());
}
/** /**
* 查询用户 * 查询全部数据,不分页
* *
* @param key / * @param username /
* @return / * @return /
*/ */
public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { public List<SystemUserOnlineVo> queryUserOnlineModelListByUsername(String username) {
return redisHelper.get(key, SystemUserOnlineVo.class); String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username);
List<String> keys = redisHelper.scan(loginKey + "*");
Collections.reverse(keys);
List<SystemUserOnlineVo> onlineUserList = new ArrayList<>();
for (String key : keys) {
onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class));
} }
onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
return onlineUserList;
}
/**
* 查询用户
*
* @param key /
* @return /
*/
public SystemUserOnlineVo queryUserOnlineModelByKey(String key) {
return redisHelper.get(key, SystemUserOnlineVo.class);
}
} }
@@ -35,53 +35,57 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class SystemDataService { public class SystemDataService {
@Autowired private SystemRoleService systemRoleService;
@Autowired private SystemDeptService systemDeptService;
@Autowired private SystemRoleDeptService systemRoleDeptService;
/** @Autowired
* 获取数据权限 private SystemRoleService systemRoleService;
* @Autowired
* @param user / private SystemDeptService systemDeptService;
* @return / @Autowired
*/ private SystemRoleDeptService systemRoleDeptService;
public List<Long> findDeptIdListByArgs(SystemUserTb user) {
List<Long> deptIds = new ArrayList<>();
// 查询用户角色
List<SystemRoleVo> roleList = systemRoleService.queryRoleByUsersId(user.getId());
// 获取对应的部门ID
for (SystemRoleTb role : roleList) {
SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope());
switch (Objects.requireNonNull(dataScopeEnum)) {
case THIS_LEVEL:
deptIds.add(user.getDept().getId());
break;
case CUSTOMIZE:
deptIds.addAll(this.findCustomDataPermissionList(deptIds, role));
break;
default:
return new ArrayList<>();
}
}
return deptIds.stream().distinct().collect(Collectors.toList());
}
/** /**
* 获取自定义的数据权限 * 获取数据权限
* *
* @param deptIds 部门ID * @param user /
* @param role 角色 * @return /
* @return 数据权限ID */
*/ public List<Long> findDeptIdListByArgs(SystemUserTb user) {
private List<Long> findCustomDataPermissionList(List<Long> deptIds, SystemRoleTb role) { List<Long> deptIds = new ArrayList<>();
List<SystemDeptTb> deptList = systemRoleDeptService.selectDeptByRoleId(role.getId()); // 查询用户角色
for (SystemDeptTb dept : deptList) { List<SystemRoleVo> roleList = systemRoleService.queryRoleByUsersId(user.getId());
deptIds.add(dept.getId()); // 获取对应的部门ID
List<SystemDeptTb> deptChildren = systemDeptService.queryDeptByPid(dept.getId()); for (SystemRoleTb role : roleList) {
if (CollUtil.isNotEmpty(deptChildren)) { SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope());
deptIds.addAll(systemDeptService.queryChildDeptIdListByDeptIds(deptChildren)); switch (Objects.requireNonNull(dataScopeEnum)) {
} case THIS_LEVEL:
} deptIds.add(user.getDept().getId());
return deptIds; break;
case CUSTOMIZE:
deptIds.addAll(this.findCustomDataPermissionList(deptIds, role));
break;
default:
return new ArrayList<>();
}
} }
return deptIds.stream().distinct().collect(Collectors.toList());
}
/**
* 获取自定义的数据权限
*
* @param deptIds 部门ID
* @param role 角色
* @return 数据权限ID
*/
private List<Long> findCustomDataPermissionList(List<Long> deptIds, SystemRoleTb role) {
List<SystemDeptTb> deptList = systemRoleDeptService.selectDeptByRoleId(role.getId());
for (SystemDeptTb dept : deptList) {
deptIds.add(dept.getId());
List<SystemDeptTb> deptChildren = systemDeptService.queryDeptByPid(dept.getId());
if (CollUtil.isNotEmpty(deptChildren)) {
deptIds.addAll(systemDeptService.queryChildDeptIdListByDeptIds(deptChildren));
}
}
return deptIds;
}
} }
@@ -34,7 +34,6 @@ import cn.odboy.system.dal.mysql.SystemUserMapper;
import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.framework.permission.core.KitSecurityHelper;
import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitClassUtil;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
@@ -48,393 +47,398 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemDeptService { public class SystemDeptService {
@Autowired private SystemDeptMapper systemDeptMapper;
@Autowired private SystemUserMapper systemUserMapper;
@Autowired private SystemRoleMapper systemRoleMapper;
/** @Autowired
* 创建 private SystemDeptMapper systemDeptMapper;
* @Autowired
* @param args / private SystemUserMapper systemUserMapper;
*/ @Autowired
@Transactional(rollbackFor = Exception.class) private SystemRoleMapper systemRoleMapper;
public void saveDept(SystemCreateDeptArgs args) {
systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); /**
this.updateDeptSubCnt(args.getPid()); * 创建
*
* @param args /
*/
@Transactional(rollbackFor = Exception.class)
public void saveDept(SystemCreateDeptArgs args) {
systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class));
this.updateDeptSubCnt(args.getPid());
}
/**
* 编辑
*
* @param args /
*/
@Transactional(rollbackFor = Exception.class)
public void updateDept(SystemDeptTb args) {
// 旧的部门
Long oldPid = this.getDeptById(args.getId()).getPid();
Long newPid = args.getPid();
if (args.getPid() != null && args.getId().equals(args.getPid())) {
throw new BadRequestException("上级不能为自己");
} }
SystemDeptTb dept = systemDeptMapper.selectById(args.getId());
args.setId(dept.getId());
systemDeptMapper.insertOrUpdate(args);
this.updateDeptSubCnt(oldPid);
this.updateDeptSubCnt(newPid);
}
/** /**
* 编辑 * 删除
* *
* @param args / * @param deptSet /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateDept(SystemDeptTb args) { public void removeDeptByIds(Set<SystemDeptTb> deptSet) {
// 旧的部门 for (SystemDeptTb dept : deptSet) {
Long oldPid = this.getDeptById(args.getId()).getPid(); systemDeptMapper.deleteById(dept.getId());
Long newPid = args.getPid(); this.updateDeptSubCnt(dept.getPid());
if (args.getPid() != null && args.getId().equals(args.getPid())) { }
throw new BadRequestException("上级不能为自己"); }
/**
* 导出数据
*
* @param deptList 待导出的数据
* @param response /
* @throws IOException /
*/
public void exportDeptExcel(List<SystemDeptTb> deptList, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (SystemDeptTb dept : deptList) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("部门名称", dept.getName());
map.put("部门状态", dept.getEnabled() ? "启用" : "停用");
map.put("创建日期", dept.getCreateTime());
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
}
/**
* 更新父节点中子节点数目
*
* @param deptId /
*/
@Transactional(rollbackFor = Exception.class)
public void updateDeptSubCnt(Long deptId) {
if (deptId != null) {
long count = systemDeptMapper.countDeptByPid(deptId);
systemDeptMapper.updateDeptSubCountById(count, deptId);
}
}
/**
* 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表
*/
private List<SystemDeptTb> deduplication(List<SystemDeptTb> list) {
List<SystemDeptTb> deptList = new ArrayList<>();
// 使用 Set 存储所有部门的 id
Set<Long> idSet = list.stream().map(SystemDeptTb::getId).collect(Collectors.toSet());
// 遍历部门列表, 筛选出没有父部门的部门
for (SystemDeptTb dept : list) {
if (!idSet.contains(dept.getPid())) {
deptList.add(dept);
}
}
return deptList;
}
/**
* 查询所有数据
*
* @param criteria 条件
* @param isQuery /
* @return /
* @throws Exception /
*/
public List<SystemDeptTb> queryAllDept(SystemQueryDeptArgs criteria, Boolean isQuery) throws Exception {
String dataScopeType = KitSecurityHelper.getDataScopeType();
if (isQuery) {
if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) {
criteria.setPidIsNull(true);
}
List<Field> fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>());
List<String> fieldNames = new ArrayList<>() {{
add("pidIsNull");
add("enabled");
}};
for (Field field : fields) {
// 设置对象的访问权限, 保证对private的属性的访问
field.setAccessible(true);
Object val = field.get(criteria);
if (fieldNames.contains(field.getName())) {
continue;
} }
SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); if (ObjectUtil.isNotNull(val)) {
args.setId(dept.getId()); criteria.setPidIsNull(null);
systemDeptMapper.insertOrUpdate(args); break;
this.updateDeptSubCnt(oldPid);
this.updateDeptSubCnt(newPid);
}
/**
* 删除
*
* @param deptSet /
*/
@Transactional(rollbackFor = Exception.class)
public void removeDeptByIds(Set<SystemDeptTb> deptSet) {
for (SystemDeptTb dept : deptSet) {
systemDeptMapper.deleteById(dept.getId());
this.updateDeptSubCnt(dept.getPid());
} }
}
} }
// 数据权限
criteria.setIds(KitSecurityHelper.getCurrentUserDataScope());
List<SystemDeptTb> list = systemDeptMapper.queryDeptByArgs(criteria);
// 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果
if (StrUtil.isBlank(dataScopeType)) {
return this.deduplication(list);
}
return list;
}
/** /**
* 导出数据 * 根据ID查询
* *
* @param deptList 待导出的数据 * @param id /
* @param response / * @return /
* @throws IOException / */
*/ public SystemDeptTb getDeptById(Long id) {
public void exportDeptExcel(List<SystemDeptTb> deptList, HttpServletResponse response) throws IOException { return systemDeptMapper.selectById(id);
List<Map<String, Object>> list = new ArrayList<>(); }
for (SystemDeptTb dept : deptList) {
Map<String, Object> map = new LinkedHashMap<>(); /**
map.put("部门名称", dept.getName()); * 根据PID查询
map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); *
map.put("创建日期", dept.getCreateTime()); * @param pid /
list.add(map); * @return /
*/
public List<SystemDeptTb> queryDeptByPid(long pid) {
return systemDeptMapper.selectDeptByPid(pid);
}
/**
* 获取部门下所有关联的部门
*
* @param deptTbList /
* @param depts /
* @return /
*/
public Set<SystemDeptTb> queryRelationDeptSet(List<SystemDeptTb> deptTbList, Set<SystemDeptTb> depts) {
for (SystemDeptTb dept : deptTbList) {
depts.add(dept);
List<SystemDeptTb> deptList = systemDeptMapper.selectDeptByPid(dept.getId());
if (CollUtil.isNotEmpty(deptList)) {
queryRelationDeptSet(deptList, depts);
}
}
return depts;
}
/**
* 获取
*
* @param deptList 、
* @return 、
*/
public List<Long> queryChildDeptIdListByDeptIds(List<SystemDeptTb> deptList) {
List<Long> list = new ArrayList<>();
for (SystemDeptTb systemDeptTb : deptList) {
if (systemDeptTb != null && systemDeptTb.getEnabled()) {
List<SystemDeptTb> deptList1 = systemDeptMapper.selectDeptByPid(systemDeptTb.getId());
if (CollUtil.isNotEmpty(deptList1)) {
list.addAll(queryChildDeptIdListByDeptIds(deptList1));
} }
KitFileUtil.downloadExcel(list, response); list.add(systemDeptTb.getId());
}
} }
return list;
}
/** /**
* 更新父节点中子节点数目 * 根据ID获取同级与上级数据
* *
* @param deptId / * @param dept /
*/ * @param deptList /
@Transactional(rollbackFor = Exception.class) * @return /
public void updateDeptSubCnt(Long deptId) { */
if (deptId != null) { public List<SystemDeptTb> querySuperiorDeptListByPid(SystemDeptTb dept, List<SystemDeptTb> deptList) {
long count = systemDeptMapper.countDeptByPid(deptId); if (dept.getPid() == null) {
systemDeptMapper.updateDeptSubCountById(count, deptId); deptList.addAll(systemDeptMapper.selectDeptByPidIsNull());
return deptList;
}
deptList.addAll(systemDeptMapper.selectDeptByPid(dept.getPid()));
return querySuperiorDeptListByPid(this.getDeptById(dept.getPid()), deptList);
}
/**
* 构建树形数据
*
* @param deptList /
* @return /
*/
public KitPageResult<SystemDeptTb> buildDeptTree(List<SystemDeptTb> deptList) {
Set<SystemDeptTb> trees = new LinkedHashSet<>();
Set<SystemDeptTb> deptSet = new LinkedHashSet<>();
List<String> deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList());
boolean isChild;
for (SystemDeptTb dept : deptList) {
isChild = false;
if (dept.getPid() == null) {
trees.add(dept);
}
for (SystemDeptTb it : deptList) {
if (it.getPid() != null && dept.getId().equals(it.getPid())) {
isChild = true;
if (dept.getChildren() == null) {
dept.setChildren(new ArrayList<>());
}
dept.getChildren().add(it);
} }
}
if (isChild) {
deptSet.add(dept);
} else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) {
deptSet.add(dept);
}
} }
if (CollectionUtil.isEmpty(trees)) {
trees = deptSet;
}
KitPageResult<SystemDeptTb> baseResult = new KitPageResult<>();
baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees));
baseResult.setTotalElements(deptSet.size());
return baseResult;
}
/** /**
* 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表 * 验证是否被角色或用户关联
*/ *
private List<SystemDeptTb> deduplication(List<SystemDeptTb> list) { * @param deptSet /
List<SystemDeptTb> deptList = new ArrayList<>(); */
// 使用 Set 存储所有部门的 id public void verifyBindRelationByIds(Set<SystemDeptTb> deptSet) {
Set<Long> idSet = list.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); Set<Long> deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet());
// 遍历部门列表, 筛选出没有父部门的部门 if (systemUserMapper.countUserByDeptIds(deptIds) > 0) {
for (SystemDeptTb dept : list) { throw new BadRequestException("所选部门存在用户关联,请解除后再试!");
if (!idSet.contains(dept.getPid())) {
deptList.add(dept);
}
}
return deptList;
} }
if (systemRoleMapper.countRoleByDeptIds(deptIds) > 0) {
throw new BadRequestException("所选部门存在角色关联,请解除后再试!");
}
}
/** /**
* 查询所有数据 * 遍历所有部门和子部门
* *
* @param criteria 条件 * @param ids /
* @param isQuery / */
* @return / public Set<SystemDeptTb> traverseDeptByIdWithPids(Set<Long> ids) {
* @throws Exception / Set<SystemDeptTb> depts = new HashSet<>();
*/ for (Long id : ids) {
public List<SystemDeptTb> queryAllDept(SystemQueryDeptArgs criteria, Boolean isQuery) throws Exception { // 根部门
String dataScopeType = KitSecurityHelper.getDataScopeType(); depts.add(this.getDeptById(id));
if (isQuery) { // 子部门
if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { List<SystemDeptTb> deptList = queryDeptByPid(id);
criteria.setPidIsNull(true); if (CollectionUtil.isNotEmpty(deptList)) {
} depts = queryRelationDeptSet(deptList, depts);
List<Field> fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); }
List<String> fieldNames = new ArrayList<>() {{
add("pidIsNull");
add("enabled");
}};
for (Field field : fields) {
// 设置对象的访问权限, 保证对private的属性的访问
field.setAccessible(true);
Object val = field.get(criteria);
if (fieldNames.contains(field.getName())) {
continue;
}
if (ObjectUtil.isNotNull(val)) {
criteria.setPidIsNull(null);
break;
}
}
}
// 数据权限
criteria.setIds(KitSecurityHelper.getCurrentUserDataScope());
List<SystemDeptTb> list = systemDeptMapper.queryDeptByArgs(criteria);
// 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果
if (StrUtil.isBlank(dataScopeType)) {
return this.deduplication(list);
}
return list;
} }
return depts;
}
/** public List<SystemProductLineVo> queryDeptSelectDataSource() {
* 根据ID查询 List<SystemDeptTb> depts = systemDeptMapper.selectEnabledDepts();
* return buildDeptSelectOptions(depts);
* @param id / }
* @return /
*/
public SystemDeptTb getDeptById(Long id) {
return systemDeptMapper.selectById(id);
}
/** private List<SystemProductLineVo> buildDeptSelectOptions(List<SystemDeptTb> depts) {
* 根据PID查询 // 获取所有部门并按父子关系组织
* Map<Long, SystemDeptTb> deptMap =
* @param pid / depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
* @return / List<SystemProductLineVo> options = new ArrayList<>();
*/ for (SystemDeptTb dept : depts) {
public List<SystemDeptTb> queryDeptByPid(long pid) { // 构建部门ID路径
return systemDeptMapper.selectDeptByPid(pid); List<Long> pathIds = new ArrayList<>();
buildDeptIdPath(dept, deptMap, pathIds);
// 反转路径,从顶级部门到当前部门
Collections.reverse(pathIds);
SystemProductLineVo dto = new SystemProductLineVo();
dto.setValue(dept.getId());
dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-")));
// 保留名称路径用于显示
dto.setLabel(buildNamePath(dept, deptMap));
options.add(dto);
} }
// 按部门名称路径排序
options.sort(Comparator.comparing(SystemProductLineVo::getLabel));
return options;
}
/** private void buildDeptIdPath(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap, List<Long> pathIds) {
* 获取部门下所有关联的部门 pathIds.add(dept.getId());
* if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) {
* @param deptTbList / buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds);
* @param depts /
* @return /
*/
public Set<SystemDeptTb> queryRelationDeptSet(List<SystemDeptTb> deptTbList, Set<SystemDeptTb> depts) {
for (SystemDeptTb dept : deptTbList) {
depts.add(dept);
List<SystemDeptTb> deptList = systemDeptMapper.selectDeptByPid(dept.getId());
if (CollUtil.isNotEmpty(deptList)) {
queryRelationDeptSet(deptList, depts);
}
}
return depts;
} }
}
/** private String buildNamePath(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap) {
* 获取 List<String> pathNames = new ArrayList<>();
* buildDeptNamePath(dept, deptMap, pathNames);
* @param deptList 、 Collections.reverse(pathNames);
* @return 、 return String.join(" / ", pathNames);
*/ }
public List<Long> queryChildDeptIdListByDeptIds(List<SystemDeptTb> deptList) {
List<Long> list = new ArrayList<>();
for (SystemDeptTb systemDeptTb : deptList) {
if (systemDeptTb != null && systemDeptTb.getEnabled()) {
List<SystemDeptTb> deptList1 = systemDeptMapper.selectDeptByPid(systemDeptTb.getId());
if (CollUtil.isNotEmpty(deptList1)) {
list.addAll(queryChildDeptIdListByDeptIds(deptList1));
}
list.add(systemDeptTb.getId());
}
}
return list;
}
/** private void buildDeptNamePath(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap, List<String> pathNames) {
* 根据ID获取同级与上级数据 pathNames.add(dept.getName());
* if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) {
* @param dept / buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames);
* @param deptList /
* @return /
*/
public List<SystemDeptTb> querySuperiorDeptListByPid(SystemDeptTb dept, List<SystemDeptTb> deptList) {
if (dept.getPid() == null) {
deptList.addAll(systemDeptMapper.selectDeptByPidIsNull());
return deptList;
}
deptList.addAll(systemDeptMapper.selectDeptByPid(dept.getPid()));
return querySuperiorDeptListByPid(this.getDeptById(dept.getPid()), deptList);
} }
}
/** public List<SystemProductLineTreeVo> queryDeptSelectProDataSource() {
* 构建树形数据 List<SystemDeptTb> depts = systemDeptMapper.selectEnabledDepts();
* // 获取所有部门并按父子关系组织
* @param deptList / Map<Long, SystemDeptTb> deptMap =
* @return / depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
*/ List<SystemProductLineTreeVo> options = new ArrayList<>();
public KitPageResult<SystemDeptTb> buildDeptTree(List<SystemDeptTb> deptList) { // 构建树形结构
Set<SystemDeptTb> trees = new LinkedHashSet<>(); for (SystemDeptTb dept : depts) {
Set<SystemDeptTb> deptSet = new LinkedHashSet<>(); // 只处理顶级部门(pid为null或0的部门)
List<String> deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); if (dept.getPid() == null || dept.getPid() == 0) {
boolean isChild; SystemProductLineTreeVo vo = buildDeptTreePro(dept, deptMap);
for (SystemDeptTb dept : deptList) { options.add(vo);
isChild = false; }
if (dept.getPid() == null) {
trees.add(dept);
}
for (SystemDeptTb it : deptList) {
if (it.getPid() != null && dept.getId().equals(it.getPid())) {
isChild = true;
if (dept.getChildren() == null) {
dept.setChildren(new ArrayList<>());
}
dept.getChildren().add(it);
}
}
if (isChild) {
deptSet.add(dept);
} else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) {
deptSet.add(dept);
}
}
if (CollectionUtil.isEmpty(trees)) {
trees = deptSet;
}
KitPageResult<SystemDeptTb> baseResult = new KitPageResult<>();
baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees));
baseResult.setTotalElements(deptSet.size());
return baseResult;
} }
// 按排序字段排序
options.sort(Comparator.comparingInt(o -> {
Long id = Long.valueOf(o.getValue());
return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0;
}));
return options;
}
/** /**
* 验证是否被角色或用户关联 * 递归构建部门树
* *
* @param deptSet / * @param dept 当前部门
*/ * @param deptMap 部门映射
public void verifyBindRelationByIds(Set<SystemDeptTb> deptSet) { * @return SystemProductLineTreeVo 树节点
Set<Long> deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); */
if (systemUserMapper.countUserByDeptIds(deptIds) > 0) { private SystemProductLineTreeVo buildDeptTreePro(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap) {
throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); SystemProductLineTreeVo vo = new SystemProductLineTreeVo();
} vo.setValue(String.valueOf(dept.getId()));
if (systemRoleMapper.countRoleByDeptIds(deptIds) > 0) { vo.setLabel(dept.getName());
throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); // 查找子部门
} List<SystemProductLineTreeVo> children = new ArrayList<>();
} for (SystemDeptTb childDept : deptMap.values()) {
if (dept.getId().equals(childDept.getPid())) {
/** children.add(buildDeptTreePro(childDept, deptMap));
* 遍历所有部门和子部门 }
*
* @param ids /
*/
public Set<SystemDeptTb> traverseDeptByIdWithPids(Set<Long> ids) {
Set<SystemDeptTb> depts = new HashSet<>();
for (Long id : ids) {
// 根部门
depts.add(this.getDeptById(id));
// 子部门
List<SystemDeptTb> deptList = queryDeptByPid(id);
if (CollectionUtil.isNotEmpty(deptList)) {
depts = queryRelationDeptSet(deptList, depts);
}
}
return depts;
}
public List<SystemProductLineVo> queryDeptSelectDataSource() {
List<SystemDeptTb> depts = systemDeptMapper.selectEnabledDepts();
return buildDeptSelectOptions(depts);
}
private List<SystemProductLineVo> buildDeptSelectOptions(List<SystemDeptTb> depts) {
// 获取所有部门并按父子关系组织
Map<Long, SystemDeptTb> deptMap =
depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
List<SystemProductLineVo> options = new ArrayList<>();
for (SystemDeptTb dept : depts) {
// 构建部门ID路径
List<Long> pathIds = new ArrayList<>();
buildDeptIdPath(dept, deptMap, pathIds);
// 反转路径,从顶级部门到当前部门
Collections.reverse(pathIds);
SystemProductLineVo dto = new SystemProductLineVo();
dto.setValue(dept.getId());
dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-")));
// 保留名称路径用于显示
dto.setLabel(buildNamePath(dept, deptMap));
options.add(dto);
}
// 按部门名称路径排序
options.sort(Comparator.comparing(SystemProductLineVo::getLabel));
return options;
}
private void buildDeptIdPath(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap, List<Long> pathIds) {
pathIds.add(dept.getId());
if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) {
buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds);
}
}
private String buildNamePath(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap) {
List<String> pathNames = new ArrayList<>();
buildDeptNamePath(dept, deptMap, pathNames);
Collections.reverse(pathNames);
return String.join(" / ", pathNames);
}
private void buildDeptNamePath(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap, List<String> pathNames) {
pathNames.add(dept.getName());
if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) {
buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames);
}
}
public List<SystemProductLineTreeVo> queryDeptSelectProDataSource() {
List<SystemDeptTb> depts = systemDeptMapper.selectEnabledDepts();
// 获取所有部门并按父子关系组织
Map<Long, SystemDeptTb> deptMap =
depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
List<SystemProductLineTreeVo> options = new ArrayList<>();
// 构建树形结构
for (SystemDeptTb dept : depts) {
// 只处理顶级部门(pid为null或0的部门)
if (dept.getPid() == null || dept.getPid() == 0) {
SystemProductLineTreeVo vo = buildDeptTreePro(dept, deptMap);
options.add(vo);
}
}
// 按排序字段排序
options.sort(Comparator.comparingInt(o -> {
Long id = Long.valueOf(o.getValue());
return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0;
}));
return options;
}
/**
* 递归构建部门树
*
* @param dept 当前部门
* @param deptMap 部门映射
* @return SystemProductLineTreeVo 树节点
*/
private SystemProductLineTreeVo buildDeptTreePro(SystemDeptTb dept, Map<Long, SystemDeptTb> deptMap) {
SystemProductLineTreeVo vo = new SystemProductLineTreeVo();
vo.setValue(String.valueOf(dept.getId()));
vo.setLabel(dept.getName());
// 查找子部门
List<SystemProductLineTreeVo> children = new ArrayList<>();
for (SystemDeptTb childDept : deptMap.values()) {
if (dept.getId().equals(childDept.getPid())) {
children.add(buildDeptTreePro(childDept, deptMap));
}
}
// 子部门按排序字段排序
children.sort(Comparator.comparingInt(o -> {
Long id = Long.valueOf(o.getValue());
return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0;
}));
vo.setChildren(children);
return vo;
} }
// 子部门按排序字段排序
children.sort(Comparator.comparingInt(o -> {
Long id = Long.valueOf(o.getValue());
return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0;
}));
vo.setChildren(children);
return vo;
}
} }
@@ -41,110 +41,113 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemDictDetailService { public class SystemDictDetailService {
@Autowired private SystemDictDetailMapper systemDictDetailMapper;
@Autowired private SystemDictMapper systemDictMapper;
/** @Autowired
* 创建 private SystemDictDetailMapper systemDictDetailMapper;
* @Autowired
* @param args / private SystemDictMapper systemDictMapper;
*/
@Transactional(rollbackFor = Exception.class) /**
public void saveDictDetail(SystemCreateDictDetailArgs args) { * 创建
SystemDictDetailTb dictDetail = BeanUtil.copyProperties(args, SystemDictDetailTb.class); *
dictDetail.setDictId(args.getDict().getId()); * @param args /
systemDictDetailMapper.insert(dictDetail); */
@Transactional(rollbackFor = Exception.class)
public void saveDictDetail(SystemCreateDictDetailArgs args) {
SystemDictDetailTb dictDetail = BeanUtil.copyProperties(args, SystemDictDetailTb.class);
dictDetail.setDictId(args.getDict().getId());
systemDictDetailMapper.insert(dictDetail);
}
/**
* 编辑
*
* @param args /
*/
@Transactional(rollbackFor = Exception.class)
public void modifyDictDetailById(SystemDictDetailTb args) {
SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId());
args.setId(dictDetail.getId());
systemDictDetailMapper.insertOrUpdate(args);
}
/**
* 删除
*
* @param id /
*/
@Transactional(rollbackFor = Exception.class)
public void removeDictDetailById(Long id) {
systemDictDetailMapper.deleteById(id);
}
@Transactional(rollbackFor = Exception.class)
public void deleteDictDetailByDictIds(Set<Long> ids) {
if (CollUtil.isNotEmpty(ids)) {
LambdaQueryWrapper<SystemDictDetailTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemDictDetailTb::getDictId, ids);
systemDictDetailMapper.delete(wrapper);
} }
}
/** /**
* 编辑 * 分页查询
* *
* @param args / * @param args 条件
*/ * @param page 分页参数
@Transactional(rollbackFor = Exception.class) * @return /
public void modifyDictDetailById(SystemDictDetailTb args) { */
SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); public KitPageResult<SystemDictDetailVo> queryDictDetailByArgs(SystemQueryDictDetailArgs args,
args.setId(dictDetail.getId()); Page<SystemDictDetailTb> page) {
systemDictDetailMapper.insertOrUpdate(args); IPage<SystemDictDetailVo> iPage = new Page<>();
} List<Long> dictIds = new ArrayList<>();
List<SystemDictTb> dictTbs = new ArrayList<>();
/** if (args == null) {
* 删除 dictTbs.addAll(systemDictMapper.selectList(null));
* dictIds = dictTbs.stream().map(SystemDictTb::getId).collect(Collectors.toList());
* @param id / } else {
*/ String dictName = args.getDictName();
@Transactional(rollbackFor = Exception.class) if (StrUtil.isBlank(dictName)) {
public void removeDictDetailById(Long id) {
systemDictDetailMapper.deleteById(id);
}
@Transactional(rollbackFor = Exception.class)
public void deleteDictDetailByDictIds(Set<Long> ids) {
if (CollUtil.isNotEmpty(ids)) {
LambdaQueryWrapper<SystemDictDetailTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemDictDetailTb::getDictId, ids);
systemDictDetailMapper.delete(wrapper);
}
}
/**
* 分页查询
*
* @param args 条件
* @param page 分页参数
* @return /
*/
public KitPageResult<SystemDictDetailVo> queryDictDetailByArgs(SystemQueryDictDetailArgs args,
Page<SystemDictDetailTb> page) {
IPage<SystemDictDetailVo> iPage = new Page<>();
List<Long> dictIds = new ArrayList<>();
List<SystemDictTb> dictTbs = new ArrayList<>();
if (args == null) {
dictTbs.addAll(systemDictMapper.selectList(null));
dictIds = dictTbs.stream().map(SystemDictTb::getId).collect(Collectors.toList());
} else {
String dictName = args.getDictName();
if (StrUtil.isBlank(dictName)) {
return KitPageUtil.toPage(iPage);
}
SystemDictTb dictTb = systemDictMapper.getByName(dictName);
if (dictTb == null) {
return KitPageUtil.toPage(iPage);
} else {
dictIds.add(dictTb.getId());
dictTbs.add(dictTb);
}
}
Map<Long, SystemDictTb> id2ItemMap = dictTbs.stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i));
iPage = systemDictDetailMapper.selectDictDetailByArgs(dictIds, page)
.convert(i -> BeanUtil.copyProperties(i, SystemDictDetailVo.class));
for (SystemDictDetailVo record : iPage.getRecords()) {
record.setDict(id2ItemMap.get(record.getDictId()));
}
return KitPageUtil.toPage(iPage); return KitPageUtil.toPage(iPage);
}
SystemDictTb dictTb = systemDictMapper.getByName(dictName);
if (dictTb == null) {
return KitPageUtil.toPage(iPage);
} else {
dictIds.add(dictTb.getId());
dictTbs.add(dictTb);
}
} }
/** Map<Long, SystemDictTb> id2ItemMap = dictTbs.stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i));
* 根据字典名称获取字典详情 iPage = systemDictDetailMapper.selectDictDetailByArgs(dictIds, page)
* .convert(i -> BeanUtil.copyProperties(i, SystemDictDetailVo.class));
* @param name 字典名称 for (SystemDictDetailVo record : iPage.getRecords()) {
* @return / record.setDict(id2ItemMap.get(record.getDictId()));
*/
public List<SystemDictDetailVo> queryDictDetailByName(String name) {
if (StrUtil.isBlank(name)) {
return new ArrayList<>();
}
SystemDictTb systemDictTb = systemDictMapper.getByName(name);
if (systemDictTb == null) {
return new ArrayList<>();
}
return systemDictDetailMapper.selectByDictId(systemDictTb.getId()).stream().map(m -> {
SystemDictDetailVo detailVo = BeanUtil.copyProperties(m, SystemDictDetailVo.class);
detailVo.setDict(systemDictTb);
return detailVo;
}).collect(Collectors.toList());
} }
return KitPageUtil.toPage(iPage);
}
/**
* 根据字典名称获取字典详情
*
* @param name 字典名称
* @return /
*/
public List<SystemDictDetailVo> queryDictDetailByName(String name) {
if (StrUtil.isBlank(name)) {
return new ArrayList<>();
}
SystemDictTb systemDictTb = systemDictMapper.getByName(name);
if (systemDictTb == null) {
return new ArrayList<>();
}
return systemDictDetailMapper.selectByDictId(systemDictTb.getId()).stream().map(m -> {
SystemDictDetailVo detailVo = BeanUtil.copyProperties(m, SystemDictDetailVo.class);
detailVo.setDict(systemDictTb);
return detailVo;
}).collect(Collectors.toList());
}
} }
@@ -27,115 +27,118 @@ import cn.odboy.system.dal.mysql.SystemDictMapper;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemDictService { public class SystemDictService {
@Autowired private SystemDictMapper systemDictMapper;
// @Autowired private SystemDictDetailMapper systemDictDetailMapper;
@Autowired private SystemDictDetailService systemDictDetailService;
/** @Autowired
* 创建 private SystemDictMapper systemDictMapper;
* // @Autowired private SystemDictDetailMapper systemDictDetailMapper;
* @param args / @Autowired
*/ private SystemDictDetailService systemDictDetailService;
@Transactional(rollbackFor = Exception.class)
public void saveDict(SystemCreateDictArgs args) {
systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class));
}
/** /**
* 编辑 * 创建
* *
* @param args / * @param args /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void modifyDictById(SystemDictTb args) { public void saveDict(SystemCreateDictArgs args) {
SystemDictTb dict = systemDictMapper.selectById(args.getId()); systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class));
dict.setName(args.getName()); }
dict.setDescription(args.getDescription());
systemDictMapper.insertOrUpdate(dict);
}
/** /**
* 删除 * 编辑
* *
* @param ids / * @param args /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void removeDictByIds(Set<Long> ids) { public void modifyDictById(SystemDictTb args) {
// 删除字典 SystemDictTb dict = systemDictMapper.selectById(args.getId());
systemDictMapper.deleteByIds(ids); dict.setName(args.getName());
// 删除字典详情 dict.setDescription(args.getDescription());
systemDictDetailService.deleteDictDetailByDictIds(ids); systemDictMapper.insertOrUpdate(dict);
} }
/** /**
* 导出数据 * 删除
* *
* @param dicts 待导出的数据 * @param ids /
* @param response / */
* @throws IOException / @Transactional(rollbackFor = Exception.class)
*/ public void removeDictByIds(Set<Long> ids) {
public void exportDictExcel(List<SystemDictTb> dicts, HttpServletResponse response) throws IOException { // 删除字典
List<Map<String, Object>> list = new ArrayList<>(); systemDictMapper.deleteByIds(ids);
for (SystemDictTb dict : dicts) { // 删除字典详情
List<SystemDictDetailVo> dictDetails = systemDictDetailService.queryDictDetailByName(dict.getName()); systemDictDetailService.deleteDictDetailByDictIds(ids);
if (CollectionUtil.isNotEmpty(dictDetails)) { }
for (SystemDictDetailTb dictDetail : dictDetails) {
Map<String, Object> map = new LinkedHashMap<>(); /**
map.put("字典名称", dict.getName()); * 导出数据
map.put("字典描述", dict.getDescription()); *
map.put("字典标签", dictDetail.getLabel()); * @param dicts 待导出的数据
map.put("字典值", dictDetail.getValue()); * @param response /
map.put("创建日期", dictDetail.getCreateTime()); * @throws IOException /
list.add(map); */
} public void exportDictExcel(List<SystemDictTb> dicts, HttpServletResponse response) throws IOException {
} else { List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map = new LinkedHashMap<>(); for (SystemDictTb dict : dicts) {
map.put("字典名称", dict.getName()); List<SystemDictDetailVo> dictDetails = systemDictDetailService.queryDictDetailByName(dict.getName());
map.put("字典描述", dict.getDescription()); if (CollectionUtil.isNotEmpty(dictDetails)) {
map.put("字典标签", null); for (SystemDictDetailTb dictDetail : dictDetails) {
map.put("字典值", null); Map<String, Object> map = new LinkedHashMap<>();
map.put("创建日期", dict.getCreateTime()); map.put("字典名称", dict.getName());
list.add(map); map.put("字典描述", dict.getDescription());
} map.put("字典标签", dictDetail.getLabel());
map.put("字典值", dictDetail.getValue());
map.put("创建日期", dictDetail.getCreateTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response); } else {
Map<String, Object> map = new LinkedHashMap<>();
map.put("字典名称", dict.getName());
map.put("字典描述", dict.getDescription());
map.put("字典标签", null);
map.put("字典值", null);
map.put("创建日期", dict.getCreateTime());
list.add(map);
}
} }
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 分页查询 * 分页查询
* *
* @param args 条件 * @param args 条件
* @param page 分页参数 * @param page 分页参数
* @return / * @return /
*/ */
public KitPageResult<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args, Page<SystemDictTb> page) { public KitPageResult<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args, Page<SystemDictTb> page) {
return KitPageUtil.toPage(systemDictMapper.selectDictByArgs(args, page)); return KitPageUtil.toPage(systemDictMapper.selectDictByArgs(args, page));
} }
/** /**
* 查询全部数据 * 查询全部数据
* *
* @param args / * @param args /
* @return / * @return /
*/ */
public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) { public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) {
return systemDictMapper.selectDictByArgs(args); return systemDictMapper.selectDictByArgs(args);
} }
public SystemDictTb getById(int id) { public SystemDictTb getById(int id) {
return systemDictMapper.selectById(id); return systemDictMapper.selectById(id);
} }
} }
@@ -38,114 +38,119 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j @Slf4j
@Service @Service
public class SystemEmailService { public class SystemEmailService {
@Autowired private SystemEmailConfigMapper systemEmailConfigMapper;
@Autowired private KitRedisHelper redisHelper;
@Autowired private AppProperties properties;
@Value("${spring.application.title}") private String applicationTitle;
/** @Autowired
* 更新邮件配置 private SystemEmailConfigMapper systemEmailConfigMapper;
* @Autowired
* @param emailConfig 邮箱配置 private KitRedisHelper redisHelper;
*/ @Autowired
@Transactional(rollbackFor = Exception.class) private AppProperties properties;
public void modifyEmailConfig(SystemEmailConfigTb emailConfig) throws Exception { @Value("${spring.application.title}")
SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); private String applicationTitle;
if (!emailConfig.getPassword().equals(systemEmailConfigTb.getPassword())) {
// 对称加密
systemEmailConfigTb.setPassword(KitDesEncryptUtil.desEncrypt(emailConfig.getPassword()));
}
systemEmailConfigTb.setId(1L);
systemEmailConfigMapper.insertOrUpdate(systemEmailConfigTb);
}
/** /**
* 发送邮件 * 更新邮件配置
* *
* @param sendEmailRequest 邮件发送的内容 * @param emailConfig 邮箱配置
*/ */
public void sendEmail(SystemSendEmailArgs sendEmailRequest) { @Transactional(rollbackFor = Exception.class)
SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); public void modifyEmailConfig(SystemEmailConfigTb emailConfig) throws Exception {
if (systemEmailConfigTb.getId() == null) { SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig();
throw new BadRequestException("请先配置, 再操作"); if (!emailConfig.getPassword().equals(systemEmailConfigTb.getPassword())) {
} // 对称加密
// 封装 systemEmailConfigTb.setPassword(KitDesEncryptUtil.desEncrypt(emailConfig.getPassword()));
MailAccount account = new MailAccount();
// 设置用户
String user = systemEmailConfigTb.getFromUser().split("@")[0];
account.setUser(user);
account.setHost(systemEmailConfigTb.getHost());
account.setPort(Integer.parseInt(systemEmailConfigTb.getPort()));
account.setAuth(true);
try {
// 对称解密
account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword()));
} catch (Exception e) {
throw new BadRequestException(e.getMessage());
}
account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">");
// ssl方式发送
account.setSslEnable(true);
// 使用STARTTLS安全连接
account.setStarttlsEnable(true);
// 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题
account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2");
String content = sendEmailRequest.getContent();
// 发送
try {
int size = sendEmailRequest.getTos().size();
Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size]))
.setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true)
// 关闭session
.setUseGlobalSession(false).send();
} catch (Exception e) {
log.error("邮件发送失败", e);
throw new BadRequestException("邮件发送失败");
}
} }
systemEmailConfigTb.setId(1L);
systemEmailConfigMapper.insertOrUpdate(systemEmailConfigTb);
}
/** /**
* 校验邮箱验证码 * 发送邮件
*/ *
public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) { * @param sendEmailRequest 邮件发送的内容
String redisKey = biEnum.getRedisKey() + email; */
String value = redisHelper.get(redisKey, String.class); public void sendEmail(SystemSendEmailArgs sendEmailRequest) {
if (value == null || !value.equals(code)) { SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig();
throw new BadRequestException("无效验证码"); if (systemEmailConfigTb.getId() == null) {
} else { throw new BadRequestException("请先配置, 再操作");
redisHelper.del(redisKey);
}
} }
// 封装
MailAccount account = new MailAccount();
// 设置用户
String user = systemEmailConfigTb.getFromUser().split("@")[0];
account.setUser(user);
account.setHost(systemEmailConfigTb.getHost());
account.setPort(Integer.parseInt(systemEmailConfigTb.getPort()));
account.setAuth(true);
try {
// 对称解密
account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword()));
} catch (Exception e) {
throw new BadRequestException(e.getMessage());
}
account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">");
// ssl方式发送
account.setSslEnable(true);
// 使用STARTTLS安全连接
account.setStarttlsEnable(true);
// 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题
account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2");
String content = sendEmailRequest.getContent();
// 发送
try {
int size = sendEmailRequest.getTos().size();
Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size]))
.setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true)
// 关闭session
.setUseGlobalSession(false).send();
} catch (Exception e) {
log.error("邮件发送失败", e);
throw new BadRequestException("邮件发送失败");
}
}
/** /**
* 发送给邮箱验证码 * 校验邮箱验证码
*/ */
public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) {
if (biEnum == null) { String redisKey = biEnum.getRedisKey() + email;
throw new BadRequestException("biEnum必填"); String value = redisHelper.get(redisKey, String.class);
} if (value == null || !value.equals(code)) {
String content; throw new BadRequestException("无效验证码");
String redisKey = biEnum.getRedisKey() + email; } else {
String oldCode = redisHelper.get(redisKey, String.class); redisHelper.del(redisKey);
if (oldCode == null) {
String code = RandomUtil.randomNumbers(6);
// 存入缓存
if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) {
throw new BadRequestException("服务异常, 请联系网站负责人");
}
// 存在就再次发送原来的验证码
content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code));
} else {
content =
KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
}
SystemSendEmailArgs sendEmailRequest =
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content);
sendEmail(sendEmailRequest);
} }
}
public SystemEmailConfigTb getLastEmailConfig() { /**
SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); * 发送给邮箱验证码
return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; */
public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) {
if (biEnum == null) {
throw new BadRequestException("biEnum必填");
} }
String content;
String redisKey = biEnum.getRedisKey() + email;
String oldCode = redisHelper.get(redisKey, String.class);
if (oldCode == null) {
String code = RandomUtil.randomNumbers(6);
// 存入缓存
if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) {
throw new BadRequestException("服务异常, 请联系网站负责人");
}
// 存在就再次发送原来的验证码
content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code));
} else {
content =
KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
}
SystemSendEmailArgs sendEmailRequest =
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content);
sendEmail(sendEmailRequest);
}
public SystemEmailConfigTb getLastEmailConfig() {
SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L);
return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb;
}
} }
@@ -26,110 +26,113 @@ import cn.odboy.system.dal.mysql.SystemUserMapper;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemJobService { public class SystemJobService {
@Autowired private SystemJobMapper systemJobMapper;
@Autowired private SystemUserMapper systemUserMapper;
/** @Autowired
* 创建 private SystemJobMapper systemJobMapper;
* @Autowired
* @param args / private SystemUserMapper systemUserMapper;
*/
@Transactional(rollbackFor = Exception.class)
public void saveJob(SystemCreateJobArgs args) {
SystemJobTb job = systemJobMapper.getJobByName(args.getName());
if (job != null) {
throw new BadRequestException("职位名称已存在");
}
systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class));
}
/** /**
* 编辑 * 创建
* *
* @param args / * @param args /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void modifyJobById(SystemJobTb args) { public void saveJob(SystemCreateJobArgs args) {
SystemJobTb job = systemJobMapper.selectById(args.getId()); SystemJobTb job = systemJobMapper.getJobByName(args.getName());
SystemJobTb old = systemJobMapper.getJobByName(args.getName()); if (job != null) {
if (old != null && !old.getId().equals(args.getId())) { throw new BadRequestException("职位名称已存在");
throw new BadRequestException("职位名称已存在");
}
args.setId(job.getId());
systemJobMapper.insertOrUpdate(args);
} }
systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class));
}
/** /**
* 删除 * 编辑
* *
* @param ids / * @param args /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void removeJobByIds(Set<Long> ids) { public void modifyJobById(SystemJobTb args) {
systemJobMapper.deleteByIds(ids); SystemJobTb job = systemJobMapper.selectById(args.getId());
SystemJobTb old = systemJobMapper.getJobByName(args.getName());
if (old != null && !old.getId().equals(args.getId())) {
throw new BadRequestException("职位名称已存在");
} }
args.setId(job.getId());
systemJobMapper.insertOrUpdate(args);
}
/** /**
* 导出数据 * 删除
* *
* @param jobs 待导出的数据 * @param ids /
* @param response / */
* @throws IOException @Transactional(rollbackFor = Exception.class)
*/ public void removeJobByIds(Set<Long> ids) {
public void exportJobExcel(List<SystemJobTb> jobs, HttpServletResponse response) throws IOException { systemJobMapper.deleteByIds(ids);
List<Map<String, Object>> list = new ArrayList<>(); }
for (SystemJobTb job : jobs) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("岗位名称", job.getName());
map.put("岗位状态", job.getEnabled() ? "启用" : "停用");
map.put("创建日期", job.getCreateTime());
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 分页查询 * 导出数据
* *
* @param args 条件 * @param jobs 待导出的数据
* @param page 分页参数 * @param response /
* @return * @throws IOException
*/ */
public KitPageResult<SystemJobTb> queryJobByArgs(SystemQueryJobArgs args, Page<SystemJobTb> page) { public void exportJobExcel(List<SystemJobTb> jobs, HttpServletResponse response) throws IOException {
return KitPageUtil.toPage(systemJobMapper.selectJobByArgs(args, page)); List<Map<String, Object>> list = new ArrayList<>();
for (SystemJobTb job : jobs) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("岗位名称", job.getName());
map.put("岗位状态", job.getEnabled() ? "启用" : "停用");
map.put("创建日期", job.getCreateTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 查询全部数据 * 分页查询
* *
* @param args / * @param args 条件
* @return / * @param page 分页参数
*/ * @return
public List<SystemJobTb> queryJobByArgs(SystemQueryJobArgs args) { */
return systemJobMapper.selectJobByArgs(args); public KitPageResult<SystemJobTb> queryJobByArgs(SystemQueryJobArgs args, Page<SystemJobTb> page) {
} return KitPageUtil.toPage(systemJobMapper.selectJobByArgs(args, page));
}
/** /**
* 验证是否被用户关联 * 查询全部数据
* *
* @param ids / * @param args /
*/ * @return /
public void verifyBindRelationByIds(Set<Long> ids) { */
if (systemUserMapper.countUserByJobIds(ids) > 0) { public List<SystemJobTb> queryJobByArgs(SystemQueryJobArgs args) {
throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); return systemJobMapper.selectJobByArgs(args);
} }
/**
* 验证是否被用户关联
*
* @param ids /
*/
public void verifyBindRelationByIds(Set<Long> ids) {
if (systemUserMapper.countUserByJobIds(ids) > 0) {
throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!");
} }
}
} }
@@ -29,7 +29,6 @@ import cn.odboy.system.dal.mysql.SystemLocalStorageMapper;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -37,6 +36,7 @@ import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -44,120 +44,124 @@ import org.springframework.web.multipart.MultipartFile;
@Service @Service
public class SystemLocalStorageService { public class SystemLocalStorageService {
@Autowired private SystemLocalStorageMapper systemLocalStorageMapper;
@Autowired private KitFileLocalUploadHelper fileUploadPathHelper;
@Autowired private AppProperties properties;
/** @Autowired
* 上传 private SystemLocalStorageMapper systemLocalStorageMapper;
* @Autowired
* @param name 文件名称 private KitFileLocalUploadHelper fileUploadPathHelper;
* @param multipartFile 文件 @Autowired
* @return / private AppProperties properties;
*/
@Transactional(rollbackFor = Exception.class)
public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) {
long size = multipartFile.getSize();
KitFileUtil.checkSize(properties.getOss().getMaxSize(), size);
String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename());
String type = KitFileUtil.getFileType(suffix);
String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT);
File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator);
if (file == null) {
throw new BadRequestException("上传失败");
}
try {
String formatSize = KitFileUtil.getSize(size);
String prefixName =
StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name;
SystemLocalStorageTb localStorage = new SystemLocalStorageTb();
localStorage.setRealName(file.getName());
localStorage.setName(prefixName);
localStorage.setSuffix(suffix);
localStorage.setPath(file.getPath());
localStorage.setType(type);
localStorage.setSize(formatSize);
localStorage.setDateGroup(uploadDateStr);
systemLocalStorageMapper.insert(localStorage);
return localStorage;
} catch (Exception e) {
KitFileUtil.del(file);
throw e;
}
}
/** /**
* 编辑 * 上传
* *
* @param args 文件信息 * @param name 文件名称
*/ * @param multipartFile 文件
@Transactional(rollbackFor = Exception.class) * @return /
public void modifyLocalStorageById(SystemLocalStorageTb args) { */
SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); @Transactional(rollbackFor = Exception.class)
localStorage.copy(args); public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) {
systemLocalStorageMapper.insertOrUpdate(localStorage); long size = multipartFile.getSize();
KitFileUtil.checkSize(properties.getOss().getMaxSize(), size);
String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename());
String type = KitFileUtil.getFileType(suffix);
String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT);
File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator);
if (file == null) {
throw new BadRequestException("上传失败");
} }
try {
String formatSize = KitFileUtil.getSize(size);
String prefixName =
StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name;
SystemLocalStorageTb localStorage = new SystemLocalStorageTb();
localStorage.setRealName(file.getName());
localStorage.setName(prefixName);
localStorage.setSuffix(suffix);
localStorage.setPath(file.getPath());
localStorage.setType(type);
localStorage.setSize(formatSize);
localStorage.setDateGroup(uploadDateStr);
systemLocalStorageMapper.insert(localStorage);
return localStorage;
} catch (Exception e) {
KitFileUtil.del(file);
throw e;
}
}
/** /**
* 多选删除 * 编辑
* *
* @param ids / * @param args 文件信息
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void removeFileByIds(Long[] ids) { public void modifyLocalStorageById(SystemLocalStorageTb args) {
for (Long id : ids) { SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId());
SystemLocalStorageTb storage = systemLocalStorageMapper.selectById(id); localStorage.copy(args);
try { systemLocalStorageMapper.insertOrUpdate(localStorage);
KitFileUtil.del(storage.getPath()); }
systemLocalStorageMapper.deleteById(storage);
} catch (IORuntimeException e) {
throw new BadRequestException("删除文件 " + storage.getName() + " 失败");
}
}
}
/** /**
* 导出数据 * 多选删除
* *
* @param localStorages 待导出的数据 * @param ids /
* @param response / */
* @throws IOException / @Transactional(rollbackFor = Exception.class)
*/ public void removeFileByIds(Long[] ids) {
public void exportLocalStorageExcel(List<SystemLocalStorageTb> localStorages, HttpServletResponse response) for (Long id : ids) {
throws IOException { SystemLocalStorageTb storage = systemLocalStorageMapper.selectById(id);
List<Map<String, Object>> list = new ArrayList<>(); try {
for (SystemLocalStorageTb localStorage : localStorages) { KitFileUtil.del(storage.getPath());
Map<String, Object> map = new LinkedHashMap<>(); systemLocalStorageMapper.deleteById(storage);
map.put("文件名", localStorage.getRealName()); } catch (IORuntimeException e) {
map.put("备注名", localStorage.getName()); throw new BadRequestException("删除文件 " + storage.getName() + " 失败");
map.put("文件类型", localStorage.getType()); }
map.put("文件大小", localStorage.getSize());
map.put("创建者", localStorage.getCreateBy());
map.put("创建日期", localStorage.getCreateTime());
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
} }
}
/** /**
* 分页查询 * 导出数据
* *
* @param criteria 条件 * @param localStorages 待导出的数据
* @param page 分页参数 * @param response /
* @return / * @throws IOException /
*/ */
public KitPageResult<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria, public void exportLocalStorageExcel(List<SystemLocalStorageTb> localStorages, HttpServletResponse response)
Page<SystemLocalStorageTb> page) { throws IOException {
return KitPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page)); List<Map<String, Object>> list = new ArrayList<>();
for (SystemLocalStorageTb localStorage : localStorages) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("文件名", localStorage.getRealName());
map.put("备注名", localStorage.getName());
map.put("文件类型", localStorage.getType());
map.put("文件大小", localStorage.getSize());
map.put("创建者", localStorage.getCreateBy());
map.put("创建日期", localStorage.getCreateTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 查询全部数据 * 分页查询
* *
* @param criteria 条件 * @param criteria 条件
* @return / * @param page 分页参数
*/ * @return /
public List<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria) { */
return systemLocalStorageMapper.selectLocalStorageByArgs(criteria); public KitPageResult<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria,
} Page<SystemLocalStorageTb> page) {
return KitPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page));
}
/**
* 查询全部数据
*
* @param criteria 条件
* @return /
*/
public List<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria) {
return systemLocalStorageMapper.selectLocalStorageByArgs(criteria);
}
} }
@@ -34,7 +34,6 @@ import cn.odboy.system.dal.mysql.SystemRoleMenuMapper;
import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitClassUtil;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
@@ -46,357 +45,363 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemMenuService { public class SystemMenuService {
private static final String YES_STR = "是";
private static final String NO_STR = "否";
@Autowired private SystemMenuMapper systemMenuMapper;
@Autowired private SystemRoleMenuMapper systemRoleMenuMapper;
@Autowired private SystemRoleService systemRoleService;
@Autowired private SystemRoleMenuService systemRoleMenuService;
/** private static final String YES_STR = "是";
* 创建 private static final String NO_STR = "否";
* @Autowired
* @param args / private SystemMenuMapper systemMenuMapper;
*/ @Autowired
@Transactional(rollbackFor = Exception.class) private SystemRoleMenuMapper systemRoleMenuMapper;
public void saveMenu(SystemMenuTb args) { @Autowired
if (systemMenuMapper.getMenuByTitle(args.getTitle()) != null) { private SystemRoleService systemRoleService;
throw new BadRequestException("菜单标题已存在"); @Autowired
} private SystemRoleMenuService systemRoleMenuService;
if (StrUtil.isNotBlank(args.getComponentName())) {
if (systemMenuMapper.getMenuByComponentName(args.getComponentName()) != null) { /**
throw new BadRequestException("菜单组件名称已存在"); * 创建
} *
} * @param args /
if (Long.valueOf(0L).equals(args.getPid())) { */
args.setPid(null); @Transactional(rollbackFor = Exception.class)
} public void saveMenu(SystemMenuTb args) {
if (args.getIFrame()) { if (systemMenuMapper.getMenuByTitle(args.getTitle()) != null) {
if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || throw new BadRequestException("菜单标题已存在");
args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) {
throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST);
}
}
systemMenuMapper.insert(args);
// 计算子节点数目
args.setSubCount(0);
// 更新父节点菜单数目
this.updateMenuSubCnt(args.getPid());
} }
if (StrUtil.isNotBlank(args.getComponentName())) {
/** if (systemMenuMapper.getMenuByComponentName(args.getComponentName()) != null) {
* 编辑 throw new BadRequestException("菜单组件名称已存在");
* }
* @param args /
*/
@Transactional(rollbackFor = Exception.class)
public void modifyMenuById(SystemMenuTb args) {
if (args.getId().equals(args.getPid())) {
throw new BadRequestException("上级不能为自己");
}
SystemMenuTb menu = systemMenuMapper.selectById(args.getId());
if (args.getIFrame()) {
if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) ||
args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) {
throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST);
}
}
SystemMenuTb menu1 = systemMenuMapper.getMenuByTitle(args.getTitle());
if (menu1 != null && !menu1.getId().equals(menu.getId())) {
throw new BadRequestException("菜单标题已存在");
}
if (args.getPid().equals(0L)) {
args.setPid(null);
}
// 记录的父节点ID
Long oldPid = menu.getPid();
Long newPid = args.getPid();
if (StrUtil.isNotBlank(args.getComponentName())) {
menu1 = systemMenuMapper.getMenuByComponentName(args.getComponentName());
if (menu1 != null && !menu1.getId().equals(menu.getId())) {
throw new BadRequestException("菜单组件名称已存在");
}
}
menu.setTitle(args.getTitle());
menu.setComponent(args.getComponent());
menu.setPath(args.getPath());
menu.setIcon(args.getIcon());
menu.setIFrame(args.getIFrame());
menu.setPid(args.getPid());
menu.setMenuSort(args.getMenuSort());
menu.setCache(args.getCache());
menu.setHidden(args.getHidden());
menu.setComponentName(args.getComponentName());
menu.setPermission(args.getPermission());
menu.setType(args.getType());
// auto fill
menu.setUpdateBy(null);
menu.setUpdateTime(null);
systemMenuMapper.insertOrUpdate(menu);
// 计算父级菜单节点数目
this.updateMenuSubCnt(oldPid);
this.updateMenuSubCnt(newPid);
} }
if (Long.valueOf(0L).equals(args.getPid())) {
/** args.setPid(null);
* 删除
*/
@Transactional(rollbackFor = Exception.class)
public void removeMenuByIds(Set<Long> ids) {
Set<SystemMenuTb> menuSet = new HashSet<>();
for (Long id : ids) {
List<SystemMenuTb> menuList = this.queryMenuByPid(id);
menuSet.add(systemMenuMapper.selectById(id));
menuSet = this.queryChildMenu(menuList, menuSet);
}
List<Long> menuIds =
menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (CollUtil.isNotEmpty(menuIds)) {
KitSpringBeanHolder.getBean(SystemMenuService.class).removeRoleMenuByMenuIds(menuIds);
systemMenuMapper.deleteByIds(menuIds);
}
for (SystemMenuTb menu : menuSet) {
this.updateMenuSubCnt(menu.getPid());
}
} }
if (args.getIFrame()) {
if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) ||
args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) {
throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST);
}
}
systemMenuMapper.insert(args);
// 计算子节点数目
args.setSubCount(0);
// 更新父节点菜单数目
this.updateMenuSubCnt(args.getPid());
}
@Transactional(rollbackFor = Exception.class) /**
public void removeRoleMenuByMenuIds(List<Long> menuIds) { * 编辑
if (CollUtil.isNotEmpty(menuIds)) { *
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>(); * @param args /
wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); */
systemRoleMenuMapper.delete(wrapper); @Transactional(rollbackFor = Exception.class)
public void modifyMenuById(SystemMenuTb args) {
if (args.getId().equals(args.getPid())) {
throw new BadRequestException("上级不能为自己");
}
SystemMenuTb menu = systemMenuMapper.selectById(args.getId());
if (args.getIFrame()) {
if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) ||
args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) {
throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST);
}
}
SystemMenuTb menu1 = systemMenuMapper.getMenuByTitle(args.getTitle());
if (menu1 != null && !menu1.getId().equals(menu.getId())) {
throw new BadRequestException("菜单标题已存在");
}
if (args.getPid().equals(0L)) {
args.setPid(null);
}
// 记录的父节点ID
Long oldPid = menu.getPid();
Long newPid = args.getPid();
if (StrUtil.isNotBlank(args.getComponentName())) {
menu1 = systemMenuMapper.getMenuByComponentName(args.getComponentName());
if (menu1 != null && !menu1.getId().equals(menu.getId())) {
throw new BadRequestException("菜单组件名称已存在");
}
}
menu.setTitle(args.getTitle());
menu.setComponent(args.getComponent());
menu.setPath(args.getPath());
menu.setIcon(args.getIcon());
menu.setIFrame(args.getIFrame());
menu.setPid(args.getPid());
menu.setMenuSort(args.getMenuSort());
menu.setCache(args.getCache());
menu.setHidden(args.getHidden());
menu.setComponentName(args.getComponentName());
menu.setPermission(args.getPermission());
menu.setType(args.getType());
// auto fill
menu.setUpdateBy(null);
menu.setUpdateTime(null);
systemMenuMapper.insertOrUpdate(menu);
// 计算父级菜单节点数目
this.updateMenuSubCnt(oldPid);
this.updateMenuSubCnt(newPid);
}
/**
* 删除
*/
@Transactional(rollbackFor = Exception.class)
public void removeMenuByIds(Set<Long> ids) {
Set<SystemMenuTb> menuSet = new HashSet<>();
for (Long id : ids) {
List<SystemMenuTb> menuList = this.queryMenuByPid(id);
menuSet.add(systemMenuMapper.selectById(id));
menuSet = this.queryChildMenu(menuList, menuSet);
}
List<Long> menuIds =
menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (CollUtil.isNotEmpty(menuIds)) {
KitSpringBeanHolder.getBean(SystemMenuService.class).removeRoleMenuByMenuIds(menuIds);
systemMenuMapper.deleteByIds(menuIds);
}
for (SystemMenuTb menu : menuSet) {
this.updateMenuSubCnt(menu.getPid());
}
}
@Transactional(rollbackFor = Exception.class)
public void removeRoleMenuByMenuIds(List<Long> menuIds) {
if (CollUtil.isNotEmpty(menuIds)) {
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemRoleMenuTb::getMenuId, menuIds);
systemRoleMenuMapper.delete(wrapper);
}
}
/**
* 导出
*
* @param menus 待导出的数据
* @param response /
* @throws IOException /
*/
public void exportMenuExcel(List<SystemMenuTb> menus, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (SystemMenuTb menu : menus) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("菜单标题", menu.getTitle());
map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮");
map.put("权限标识", menu.getPermission());
map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR);
map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR);
map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR);
map.put("创建日期", menu.getCreateTime());
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
}
@Transactional(rollbackFor = Exception.class)
public void updateMenuSubCnt(Long menuId) {
if (menuId != null) {
long count = systemMenuMapper.countMenuByPid(menuId);
systemMenuMapper.updateMenuSubCntByMenuId(count, menuId);
}
}
/**
* 查询全部数据
*
* @param criteria 条件
* @param isQuery /
* @return /
* @throws Exception /
*/
public List<SystemMenuTb> queryAllMenu(SystemQueryMenuArgs criteria, Boolean isQuery) throws Exception {
if (Boolean.TRUE.equals(isQuery)) {
criteria.setPidIsNull(true);
List<Field> fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>());
for (Field field : fields) {
//设置对象的访问权限, 保证对private的属性的访问
field.setAccessible(true);
Object val = field.get(criteria);
if ("pidIsNull".equals(field.getName())) {
continue;
} }
} // 如果有查询条件, 则不指定pidIsNull
if (ObjectUtil.isNotNull(val)) {
/** criteria.setPidIsNull(null);
* 导出 break;
*
* @param menus 待导出的数据
* @param response /
* @throws IOException /
*/
public void exportMenuExcel(List<SystemMenuTb> menus, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (SystemMenuTb menu : menus) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("菜单标题", menu.getTitle());
map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮");
map.put("权限标识", menu.getPermission());
map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR);
map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR);
map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR);
map.put("创建日期", menu.getCreateTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response); }
} }
return systemMenuMapper.selectMenuByArgs(criteria);
}
@Transactional(rollbackFor = Exception.class) /**
public void updateMenuSubCnt(Long menuId) { * 根据当前用户获取菜单
if (menuId != null) { *
long count = systemMenuMapper.countMenuByPid(menuId); * @param currentUserId /
systemMenuMapper.updateMenuSubCntByMenuId(count, menuId); * @return /
*/
public List<SystemMenuTb> queryMenuListByUserId(Long currentUserId) {
List<SystemRoleVo> roles = systemRoleService.queryRoleByUsersId(currentUserId);
Set<Long> roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet());
return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIdsAndType(roleIds, 2));
}
/**
* 获取所有子节点, 包含自身ID
*
* @param menuList /
* @param menuSet /
* @return /
*/
public Set<SystemMenuTb> queryChildMenu(List<SystemMenuTb> menuList, Set<SystemMenuTb> menuSet) {
for (SystemMenuTb menu : menuList) {
menuSet.add(menu);
List<SystemMenuTb> menus = systemMenuMapper.selectMenuByPid(menu.getId());
if (CollUtil.isNotEmpty(menus)) {
queryChildMenu(menus, menuSet);
}
}
return menuSet;
}
/**
* 懒加载菜单数据
*
* @param pid /
* @return /
*/
public List<SystemMenuTb> queryMenuByPid(Long pid) {
List<SystemMenuTb> menus;
if (pid != null && !pid.equals(0L)) {
menus = systemMenuMapper.selectMenuByPid(pid);
} else {
menus = systemMenuMapper.selectMenuByPidIsNull();
}
return menus;
}
/**
* 根据ID获取同级与上级数据
*
* @param menu /
* @param menus /
* @return /
*/
public List<SystemMenuTb> querySuperiorMenuList(SystemMenuTb menu, List<SystemMenuTb> menus) {
if (menu.getPid() == null) {
menus.addAll(systemMenuMapper.selectMenuByPidIsNull());
return menus;
}
menus.addAll(systemMenuMapper.selectMenuByPid(menu.getPid()));
return querySuperiorMenuList(systemMenuMapper.selectById(menu.getPid()), menus);
}
/**
* 构建菜单树
*
* @param menus 原始数据
* @return /
*/
public List<SystemMenuTb> buildMenuTree(List<SystemMenuTb> menus) {
List<SystemMenuTb> trees = new ArrayList<>();
Set<Long> ids = new HashSet<>();
for (SystemMenuTb menu : menus) {
if (menu.getPid() == null) {
trees.add(menu);
}
for (SystemMenuTb it : menus) {
if (menu.getId().equals(it.getPid())) {
if (menu.getChildren() == null) {
menu.setChildren(new ArrayList<>());
}
menu.getChildren().add(it);
ids.add(it.getId());
} }
}
} }
if (CollUtil.isNotEmpty(trees)) {
/** trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList());
* 查询全部数据
*
* @param criteria 条件
* @param isQuery /
* @return /
* @throws Exception /
*/
public List<SystemMenuTb> queryAllMenu(SystemQueryMenuArgs criteria, Boolean isQuery) throws Exception {
if (Boolean.TRUE.equals(isQuery)) {
criteria.setPidIsNull(true);
List<Field> fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>());
for (Field field : fields) {
//设置对象的访问权限, 保证对private的属性的访问
field.setAccessible(true);
Object val = field.get(criteria);
if ("pidIsNull".equals(field.getName())) {
continue;
}
// 如果有查询条件, 则不指定pidIsNull
if (ObjectUtil.isNotNull(val)) {
criteria.setPidIsNull(null);
break;
}
}
}
return systemMenuMapper.selectMenuByArgs(criteria);
} }
return trees;
}
/** /**
* 根据当前用户获取菜单 * 构建菜单树
* *
* @param currentUserId / * @param menus /
* @return / * @return /
*/ */
public List<SystemMenuTb> queryMenuListByUserId(Long currentUserId) { public List<SystemMenuVo> buildMenuVo(List<SystemMenuTb> menus) {
List<SystemRoleVo> roles = systemRoleService.queryRoleByUsersId(currentUserId); List<SystemMenuVo> list = new LinkedList<>();
Set<Long> roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); menus.forEach(menu -> {
return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIdsAndType(roleIds, 2)); if (menu != null) {
} List<SystemMenuTb> menuList = menu.getChildren();
SystemMenuVo menuVo = new SystemMenuVo();
/** menuVo.setName(
* 获取所有子节点, 包含自身ID ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle());
* // 一级目录需要加斜杠, 不然会报警告
* @param menuList / menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath());
* @param menuSet / menuVo.setHidden(menu.getHidden());
* @return / // 如果不是外链
*/
public Set<SystemMenuTb> queryChildMenu(List<SystemMenuTb> menuList, Set<SystemMenuTb> menuSet) {
for (SystemMenuTb menu : menuList) {
menuSet.add(menu);
List<SystemMenuTb> menus = systemMenuMapper.selectMenuByPid(menu.getId());
if (CollUtil.isNotEmpty(menus)) {
queryChildMenu(menus, menuSet);
}
}
return menuSet;
}
/**
* 懒加载菜单数据
*
* @param pid /
* @return /
*/
public List<SystemMenuTb> queryMenuByPid(Long pid) {
List<SystemMenuTb> menus;
if (pid != null && !pid.equals(0L)) {
menus = systemMenuMapper.selectMenuByPid(pid);
} else {
menus = systemMenuMapper.selectMenuByPidIsNull();
}
return menus;
}
/**
* 根据ID获取同级与上级数据
*
* @param menu /
* @param menus /
* @return /
*/
public List<SystemMenuTb> querySuperiorMenuList(SystemMenuTb menu, List<SystemMenuTb> menus) {
if (menu.getPid() == null) {
menus.addAll(systemMenuMapper.selectMenuByPidIsNull());
return menus;
}
menus.addAll(systemMenuMapper.selectMenuByPid(menu.getPid()));
return querySuperiorMenuList(systemMenuMapper.selectById(menu.getPid()), menus);
}
/**
* 构建菜单树
*
* @param menus 原始数据
* @return /
*/
public List<SystemMenuTb> buildMenuTree(List<SystemMenuTb> menus) {
List<SystemMenuTb> trees = new ArrayList<>();
Set<Long> ids = new HashSet<>();
for (SystemMenuTb menu : menus) {
if (menu.getPid() == null) {
trees.add(menu);
}
for (SystemMenuTb it : menus) {
if (menu.getId().equals(it.getPid())) {
if (menu.getChildren() == null) {
menu.setChildren(new ArrayList<>());
}
menu.getChildren().add(it);
ids.add(it.getId());
}
}
}
if (CollUtil.isNotEmpty(trees)) {
trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList());
}
return trees;
}
/**
* 构建菜单树
*
* @param menus /
* @return /
*/
public List<SystemMenuVo> buildMenuVo(List<SystemMenuTb> menus) {
List<SystemMenuVo> list = new LinkedList<>();
menus.forEach(menu -> {
if (menu != null) {
List<SystemMenuTb> menuList = menu.getChildren();
SystemMenuVo menuVo = new SystemMenuVo();
menuVo.setName(
ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle());
// 一级目录需要加斜杠, 不然会报警告
menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath());
menuVo.setHidden(menu.getHidden());
// 如果不是外链
if (!menu.getIFrame()) {
if (menu.getPid() == null) {
menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent());
// 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单
} else if (menu.getType() == 0) {
menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent());
} else if (StrUtil.isNotBlank(menu.getComponent())) {
menuVo.setComponent(menu.getComponent());
}
}
menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache()));
if (CollectionUtil.isNotEmpty(menuList)) {
menuVo.setAlwaysShow(true);
menuVo.setRedirect("noredirect");
menuVo.setChildren(buildMenuVo(menuList));
// 处理是一级菜单并且没有子菜单的情况
} else if (menu.getPid() == null) {
SystemMenuVo menuVo1 = getMenuVo(menu, menuVo);
menuVo.setName(null);
menuVo.setMeta(null);
menuVo.setComponent("Layout");
List<SystemMenuVo> list1 = new ArrayList<>();
list1.add(menuVo1);
menuVo.setChildren(list1);
}
list.add(menuVo);
}
});
return list;
}
/**
* 获取 MenuResponse
*
* @param menu /
* @param menuVo /
* @return /
*/
private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) {
SystemMenuVo menuVo1 = new SystemMenuVo();
menuVo1.setMeta(menuVo.getMeta());
// 非外链
if (!menu.getIFrame()) { if (!menu.getIFrame()) {
menuVo1.setPath("index"); if (menu.getPid() == null) {
menuVo1.setName(menuVo.getName()); menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent());
menuVo1.setComponent(menuVo.getComponent()); // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单
} else { } else if (menu.getType() == 0) {
menuVo1.setPath(menu.getPath()); menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent());
} else if (StrUtil.isNotBlank(menu.getComponent())) {
menuVo.setComponent(menu.getComponent());
}
} }
return menuVo1; menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache()));
} if (CollectionUtil.isNotEmpty(menuList)) {
menuVo.setAlwaysShow(true);
menuVo.setRedirect("noredirect");
menuVo.setChildren(buildMenuVo(menuList));
// 处理是一级菜单并且没有子菜单的情况
} else if (menu.getPid() == null) {
SystemMenuVo menuVo1 = getMenuVo(menu, menuVo);
menuVo.setName(null);
menuVo.setMeta(null);
menuVo.setComponent("Layout");
List<SystemMenuVo> list1 = new ArrayList<>();
list1.add(menuVo1);
menuVo.setChildren(list1);
}
list.add(menuVo);
}
});
return list;
}
public List<SystemMenuTb> queryMenuByIds(List<Long> ids) { /**
return systemMenuMapper.selectByIds(ids); * 获取 MenuResponse
*
* @param menu /
* @param menuVo /
* @return /
*/
private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) {
SystemMenuVo menuVo1 = new SystemMenuVo();
menuVo1.setMeta(menuVo.getMeta());
// 非外链
if (!menu.getIFrame()) {
menuVo1.setPath("index");
menuVo1.setName(menuVo.getName());
menuVo1.setComponent(menuVo.getComponent());
} else {
menuVo1.setPath(menu.getPath());
} }
return menuVo1;
}
public List<SystemMenuTb> queryMenuByIds(List<Long> ids) {
return systemMenuMapper.selectByIds(ids);
}
} }
@@ -43,172 +43,173 @@ import oshi.util.Util;
@Slf4j @Slf4j
@Service @Service
public class SystemMonitorService { public class SystemMonitorService {
private final DecimalFormat df = new DecimalFormat("0.00");
/** private final DecimalFormat df = new DecimalFormat("0.00");
* 查询服务器监控信息
*
* @return Map<String, Object>
*/
public Map<String, Object> queryServerMonitorInfo() {
Map<String, Object> resultMap = new LinkedHashMap<>(8);
try {
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
HardwareAbstractionLayer hal = si.getHardware();
// 系统信息
resultMap.put("sys", getSystemInfo(os));
// cpu 信息
resultMap.put("cpu", getCpuInfo(hal.getProcessor()));
// 内存信息
resultMap.put("memory", getMemoryInfo(hal.getMemory()));
// 交换区信息
resultMap.put("swap", getSwapInfo(hal.getMemory()));
// 磁盘
resultMap.put("disk", getDiskInfo(os));
resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss"));
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return resultMap;
}
/** /**
* 获取磁盘信息 * 查询服务器监控信息
* *
* @return / * @return Map<String, Object>
*/ */
private Map<String, Object> getDiskInfo(OperatingSystem os) { public Map<String, Object> queryServerMonitorInfo() {
Map<String, Object> diskInfo = new LinkedHashMap<>(); Map<String, Object> resultMap = new LinkedHashMap<>(8);
FileSystem fileSystem = os.getFileSystem(); try {
List<OSFileStore> fsArray = fileSystem.getFileStores(); SystemInfo si = new SystemInfo();
String osName = System.getProperty("os.name"); OperatingSystem os = si.getOperatingSystem();
long available = 0, total = 0; HardwareAbstractionLayer hal = si.getHardware();
for (OSFileStore fs : fsArray) { // 系统信息
// windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 resultMap.put("sys", getSystemInfo(os));
if (osName.toLowerCase().startsWith(SystemConst.WIN)) { // cpu 信息
available += fs.getUsableSpace(); resultMap.put("cpu", getCpuInfo(hal.getProcessor()));
total += fs.getTotalSpace(); // 内存信息
} else { resultMap.put("memory", getMemoryInfo(hal.getMemory()));
available = fs.getUsableSpace(); // 交换区信息
total = fs.getTotalSpace(); resultMap.put("swap", getSwapInfo(hal.getMemory()));
break; // 磁盘
} resultMap.put("disk", getDiskInfo(os));
} resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss"));
long used = total - available; } catch (Exception e) {
diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); log.error(e.getMessage(), e);
diskInfo.put("available", KitFileUtil.getSize(available));
diskInfo.put("used", KitFileUtil.getSize(used));
if (total != 0) {
diskInfo.put("usageRate", df.format(used / (double)total * 100));
} else {
diskInfo.put("usageRate", 0);
}
return diskInfo;
} }
return resultMap;
}
/** /**
* 获取交换区信息 * 获取磁盘信息
* *
* @param memory / * @return /
* @return / */
*/ private Map<String, Object> getDiskInfo(OperatingSystem os) {
private Map<String, Object> getSwapInfo(GlobalMemory memory) { Map<String, Object> diskInfo = new LinkedHashMap<>();
Map<String, Object> swapInfo = new LinkedHashMap<>(); FileSystem fileSystem = os.getFileSystem();
VirtualMemory virtualMemory = memory.getVirtualMemory(); List<OSFileStore> fsArray = fileSystem.getFileStores();
long total = virtualMemory.getSwapTotal(); String osName = System.getProperty("os.name");
long used = virtualMemory.getSwapUsed(); long available = 0, total = 0;
swapInfo.put("total", FormatUtil.formatBytes(total)); for (OSFileStore fs : fsArray) {
swapInfo.put("used", FormatUtil.formatBytes(used)); // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复
swapInfo.put("available", FormatUtil.formatBytes(total - used)); if (osName.toLowerCase().startsWith(SystemConst.WIN)) {
if (used == 0) { available += fs.getUsableSpace();
swapInfo.put("usageRate", 0); total += fs.getTotalSpace();
} else { } else {
swapInfo.put("usageRate", df.format(used / (double)total * 100)); available = fs.getUsableSpace();
} total = fs.getTotalSpace();
return swapInfo; break;
}
} }
long used = total - available;
diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?");
diskInfo.put("available", KitFileUtil.getSize(available));
diskInfo.put("used", KitFileUtil.getSize(used));
if (total != 0) {
diskInfo.put("usageRate", df.format(used / (double) total * 100));
} else {
diskInfo.put("usageRate", 0);
}
return diskInfo;
}
/** /**
* 获取内存信息 * 获取交换区信息
* *
* @param memory / * @param memory /
* @return / * @return /
*/ */
private Map<String, Object> getMemoryInfo(GlobalMemory memory) { private Map<String, Object> getSwapInfo(GlobalMemory memory) {
Map<String, Object> memoryInfo = new LinkedHashMap<>(); Map<String, Object> swapInfo = new LinkedHashMap<>();
memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); VirtualMemory virtualMemory = memory.getVirtualMemory();
memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); long total = virtualMemory.getSwapTotal();
memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); long used = virtualMemory.getSwapUsed();
memoryInfo.put("usageRate", swapInfo.put("total", FormatUtil.formatBytes(total));
df.format((memory.getTotal() - memory.getAvailable()) / (double)memory.getTotal() * 100)); swapInfo.put("used", FormatUtil.formatBytes(used));
return memoryInfo; swapInfo.put("available", FormatUtil.formatBytes(total - used));
if (used == 0) {
swapInfo.put("usageRate", 0);
} else {
swapInfo.put("usageRate", df.format(used / (double) total * 100));
} }
return swapInfo;
}
/** /**
* 获取Cpu相关信息 * 获取内存信息
* *
* @param processor / * @param memory /
* @return / * @return /
*/ */
private Map<String, Object> getCpuInfo(CentralProcessor processor) { private Map<String, Object> getMemoryInfo(GlobalMemory memory) {
Map<String, Object> cpuInfo = new LinkedHashMap<>(); Map<String, Object> memoryInfo = new LinkedHashMap<>();
cpuInfo.put("name", processor.getProcessorIdentifier().getName()); memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal()));
cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable()));
cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable()));
cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); memoryInfo.put("usageRate",
cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); df.format((memory.getTotal() - memory.getAvailable()) / (double) memory.getTotal() * 100));
// CPU信息 return memoryInfo;
long[] prevTicks = processor.getSystemCpuLoadTicks(); }
// 默认等待300毫秒...
long time = 300;
Util.sleep(time);
long[] ticks = processor.getSystemCpuLoadTicks();
long minCpuLoadTick = 1000;
while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < minCpuLoadTick) {
time += 25;
Util.sleep(25);
ticks = processor.getSystemCpuLoadTicks();
}
long user =
ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long nice =
ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long sys =
ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long idle =
ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long ioWait =
ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long irq =
ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] -
prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal =
ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal;
cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu));
cpuInfo.put("idle", df.format(100d * idle / totalCpu));
return cpuInfo;
}
/** /**
* 获取系统相关信息,系统、运行天数、系统IP * 获取Cpu相关信息
* *
* @param os / * @param processor /
* @return / * @return /
*/ */
private Map<String, Object> getSystemInfo(OperatingSystem os) { private Map<String, Object> getCpuInfo(CentralProcessor processor) {
Map<String, Object> systemInfo = new LinkedHashMap<>(); Map<String, Object> cpuInfo = new LinkedHashMap<>();
// jvm 运行时间 cpuInfo.put("name", processor.getProcessorIdentifier().getName());
long time = ManagementFactory.getRuntimeMXBean().getStartTime(); cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU");
Date date = new Date(time); cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心");
// 计算项目运行时间 cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount());
String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR); cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU");
// 系统信息 // CPU信息
systemInfo.put("os", os.toString()); long[] prevTicks = processor.getSystemCpuLoadTicks();
systemInfo.put("day", formatBetween); // 默认等待300毫秒...
systemInfo.put("ip", KitIPUtil.getLocalIp()); long time = 300;
return systemInfo; Util.sleep(time);
long[] ticks = processor.getSystemCpuLoadTicks();
long minCpuLoadTick = 1000;
while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < minCpuLoadTick) {
time += 25;
Util.sleep(25);
ticks = processor.getSystemCpuLoadTicks();
} }
long user =
ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long nice =
ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long sys =
ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long idle =
ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long ioWait =
ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long irq =
ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] -
prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal =
ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal;
cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu));
cpuInfo.put("idle", df.format(100d * idle / totalCpu));
return cpuInfo;
}
/**
* 获取系统相关信息,系统、运行天数、系统IP
*
* @param os /
* @return /
*/
private Map<String, Object> getSystemInfo(OperatingSystem os) {
Map<String, Object> systemInfo = new LinkedHashMap<>();
// jvm 运行时间
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
Date date = new Date(time);
// 计算项目运行时间
String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR);
// 系统信息
systemInfo.put("os", os.toString());
systemInfo.put("day", formatBetween);
systemInfo.put("ip", KitIPUtil.getLocalIp());
return systemInfo;
}
} }
@@ -21,9 +21,9 @@ import cn.odboy.system.dal.model.SystemOssStorageVo;
import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.dal.model.SystemQueryStorageArgs;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
/** /**
@@ -35,9 +35,14 @@ import org.springframework.web.multipart.MultipartFile;
* @since 2025-07-15 * @since 2025-07-15
*/ */
public interface SystemOssStorageService extends IService<SystemOssStorageTb> { public interface SystemOssStorageService extends IService<SystemOssStorageTb> {
KitPageResult<SystemOssStorageVo> queryOssStorage(SystemQueryStorageArgs criteria, Page<SystemOssStorageTb> page);
List<SystemOssStorageVo> queryOssStorage(SystemQueryStorageArgs criteria); KitPageResult<SystemOssStorageVo> queryOssStorage(SystemQueryStorageArgs criteria, Page<SystemOssStorageTb> page);
void exportOssStorageExcel(List<SystemOssStorageVo> list, HttpServletResponse response) throws IOException;
String uploadFile(MultipartFile file); List<SystemOssStorageVo> queryOssStorage(SystemQueryStorageArgs criteria);
void removeFileByIds(Long[] ids);
void exportOssStorageExcel(List<SystemOssStorageVo> list, HttpServletResponse response) throws IOException;
String uploadFile(MultipartFile file);
void removeFileByIds(Long[] ids);
} }
@@ -33,7 +33,6 @@ import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -41,6 +40,7 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import jakarta.servlet.http.HttpServletResponse;
import org.quartz.CronExpression; import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -48,261 +48,266 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemQuartzJobService { public class SystemQuartzJobService {
@Autowired private SystemQuartzJobMapper systemQuartzJobMapper;
@Autowired private SystemQuartzLogMapper systemQuartzLogMapper;
@Autowired private QuartzManage quartzManage;
@Autowired private KitRedisHelper redisHelper;
/** @Autowired
* 创建 private SystemQuartzJobMapper systemQuartzJobMapper;
* @Autowired
* @param args / private SystemQuartzLogMapper systemQuartzLogMapper;
*/ @Autowired
@Transactional(rollbackFor = Exception.class) private QuartzManage quartzManage;
public void createJob(SystemQuartzJobTb args) { @Autowired
if (!CronExpression.isValidExpression(args.getCronExpression())) { private KitRedisHelper redisHelper;
throw new BadRequestException("cron表达式格式错误");
}
systemQuartzJobMapper.insert(args);
quartzManage.addJob(args);
}
/** /**
* 修改任务并重新调度 * 创建
* *
* @param args / * @param args /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void modifyQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { public void createJob(SystemQuartzJobTb args) {
if (!CronExpression.isValidExpression(args.getCronExpression())) { if (!CronExpression.isValidExpression(args.getCronExpression())) {
throw new BadRequestException("cron表达式格式错误"); throw new BadRequestException("cron表达式格式错误");
}
if (StrUtil.isNotBlank(args.getSubTask())) {
List<String> tasks = Arrays.asList(args.getSubTask().split("[,,]"));
if (tasks.contains(args.getId().toString())) {
throw new BadRequestException("子任务中不能添加当前任务ID");
}
}
SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class);
systemQuartzJobMapper.insertOrUpdate(quartzJob);
quartzManage.updateJobCron(quartzJob);
} }
systemQuartzJobMapper.insert(args);
quartzManage.addJob(args);
}
/** /**
* 更改定时任务状态 * 修改任务并重新调度
* *
* @param quartzJob / * @param args /
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { public void modifyQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) {
// 置换暂停状态 if (!CronExpression.isValidExpression(args.getCronExpression())) {
if (quartzJob.getIsPause()) { throw new BadRequestException("cron表达式格式错误");
quartzManage.resumeJob(quartzJob);
quartzJob.setIsPause(false);
} else {
quartzManage.pauseJob(quartzJob);
quartzJob.setIsPause(true);
}
systemQuartzJobMapper.insertOrUpdate(quartzJob);
} }
if (StrUtil.isNotBlank(args.getSubTask())) {
List<String> tasks = Arrays.asList(args.getSubTask().split("[,,]"));
if (tasks.contains(args.getId().toString())) {
throw new BadRequestException("子任务中不能添加当前任务ID");
}
}
SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class);
systemQuartzJobMapper.insertOrUpdate(quartzJob);
quartzManage.updateJobCron(quartzJob);
}
/** /**
* 立即执行定时任务 * 更改定时任务状态
* *
* @param quartzJob / * @param quartzJob /
*/ */
public void startQuartzJob(SystemQuartzJobTb quartzJob) { @Transactional(rollbackFor = Exception.class)
quartzManage.runJobNow(quartzJob); public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) {
// 置换暂停状态
if (quartzJob.getIsPause()) {
quartzManage.resumeJob(quartzJob);
quartzJob.setIsPause(false);
} else {
quartzManage.pauseJob(quartzJob);
quartzJob.setIsPause(true);
} }
systemQuartzJobMapper.insertOrUpdate(quartzJob);
}
/** /**
* 删除任务 * 立即执行定时任务
* *
* @param ids / * @param quartzJob /
*/ */
@Transactional(rollbackFor = Exception.class) public void startQuartzJob(SystemQuartzJobTb quartzJob) {
public void removeJobByIds(Set<Long> ids) { quartzManage.runJobNow(quartzJob);
for (Long id : ids) { }
SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id);
quartzManage.deleteJob(quartzJob);
systemQuartzJobMapper.deleteById(quartzJob);
}
}
/** /**
* 执行子任务 * 删除任务
* *
* @param tasks / * @param ids /
* @throws InterruptedException / */
*/ @Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class) public void removeJobByIds(Set<Long> ids) {
public void startSubQuartJob(String[] tasks) throws InterruptedException { for (Long id : ids) {
for (String id : tasks) { SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id);
if (StrUtil.isBlank(id)) { quartzManage.deleteJob(quartzJob);
// 如果是手动清除子任务id, 会出现id为空字符串的问题 systemQuartzJobMapper.deleteById(quartzJob);
continue;
}
SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id));
if (quartzJob == null) {
// 防止子任务不存在
continue;
}
// 执行任务
String uuid = IdUtil.simpleUUID();
quartzJob.setUuid(uuid);
// 执行任务
startQuartzJob(quartzJob);
// 获取执行状态, 如果执行失败则停止后面的子任务执行
Boolean result = redisHelper.get(uuid, Boolean.class);
while (result == null) {
// 休眠5秒, 再次获取子任务执行情况
Thread.sleep(5000);
result = redisHelper.get(uuid, Boolean.class);
}
if (!result) {
redisHelper.del(uuid);
break;
}
}
} }
}
/** /**
* 导出定时任务 * 执行子任务
* *
* @param quartzJobs 待导出的数据 * @param tasks /
* @param response / * @throws InterruptedException /
* @throws IOException / */
*/ @Transactional(rollbackFor = Exception.class)
public void exportQuartzJobExcel(List<SystemQuartzJobTb> quartzJobs, HttpServletResponse response) public void startSubQuartJob(String[] tasks) throws InterruptedException {
throws IOException { for (String id : tasks) {
List<Map<String, Object>> list = new ArrayList<>(); if (StrUtil.isBlank(id)) {
for (SystemQuartzJobTb quartzJob : quartzJobs) { // 如果是手动清除子任务id, 会出现id为空字符串的问题
Map<String, Object> map = new LinkedHashMap<>(); continue;
map.put("任务名称", quartzJob.getJobName()); }
map.put("Bean名称", quartzJob.getBeanName()); SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id));
map.put("执行方法", quartzJob.getMethodName()); if (quartzJob == null) {
map.put("参数", quartzJob.getParams()); // 防止子任务不存在
map.put("表达式", quartzJob.getCronExpression()); continue;
map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); }
map.put("描述", quartzJob.getDescription()); // 执行任务
map.put("创建日期", quartzJob.getCreateTime()); String uuid = IdUtil.simpleUUID();
list.add(map); quartzJob.setUuid(uuid);
} // 执行任务
KitFileUtil.downloadExcel(list, response); startQuartzJob(quartzJob);
// 获取执行状态, 如果执行失败则停止后面的子任务执行
Boolean result = redisHelper.get(uuid, Boolean.class);
while (result == null) {
// 休眠5秒, 再次获取子任务执行情况
Thread.sleep(5000);
result = redisHelper.get(uuid, Boolean.class);
}
if (!result) {
redisHelper.del(uuid);
break;
}
} }
}
/** /**
* 导出定时任务日志 * 导出定时任务
* *
* @param queryAllLog 待导出的数据 * @param quartzJobs 待导出的数据
* @param response / * @param response /
* @throws IOException / * @throws IOException /
*/ */
public void exportQuartzLogExcel(List<SystemQuartzLogTb> queryAllLog, HttpServletResponse response) public void exportQuartzJobExcel(List<SystemQuartzJobTb> quartzJobs, HttpServletResponse response)
throws IOException { throws IOException {
List<Map<String, Object>> list = new ArrayList<>(); List<Map<String, Object>> list = new ArrayList<>();
for (SystemQuartzLogTb quartzLog : queryAllLog) { for (SystemQuartzJobTb quartzJob : quartzJobs) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
map.put("任务名称", quartzLog.getJobName()); map.put("任务名称", quartzJob.getJobName());
map.put("Bean名称", quartzLog.getBeanName()); map.put("Bean名称", quartzJob.getBeanName());
map.put("执行方法", quartzLog.getMethodName()); map.put("执行方法", quartzJob.getMethodName());
map.put("参数", quartzLog.getParams()); map.put("参数", quartzJob.getParams());
map.put("表达式", quartzLog.getCronExpression()); map.put("表达式", quartzJob.getCronExpression());
map.put("异常详情", quartzLog.getExceptionDetail()); map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中");
map.put("耗时/毫秒", quartzLog.getTime()); map.put("描述", quartzJob.getDescription());
map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); map.put("创建日期", quartzJob.getCreateTime());
map.put("创建日期", quartzLog.getCreateTime()); list.add(map);
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
} }
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 分页查询 * 导出定时任务日志
* *
* @param criteria 条件 * @param queryAllLog 待导出的数据
* @param page 分页参数 * @param response /
* @return / * @throws IOException /
*/ */
public KitPageResult<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria, public void exportQuartzLogExcel(List<SystemQuartzLogTb> queryAllLog, HttpServletResponse response)
Page<SystemQuartzJobTb> page) { throws IOException {
LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>(); List<Map<String, Object>> list = new ArrayList<>();
this.injectQuartzJobQueryParams(criteria, wrapper); for (SystemQuartzLogTb quartzLog : queryAllLog) {
return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); Map<String, Object> map = new LinkedHashMap<>();
map.put("任务名称", quartzLog.getJobName());
map.put("Bean名称", quartzLog.getBeanName());
map.put("执行方法", quartzLog.getMethodName());
map.put("参数", quartzLog.getParams());
map.put("表达式", quartzLog.getCronExpression());
map.put("异常详情", quartzLog.getExceptionDetail());
map.put("耗时/毫秒", quartzLog.getTime());
map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败");
map.put("创建日期", quartzLog.getCreateTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response);
}
private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs criteria, /**
LambdaQueryWrapper<SystemQuartzJobTb> wrapper) { * 分页查询
if (criteria != null) { *
wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzJobTb::getJobName, * @param criteria 条件
criteria.getJobName()); * @param page 分页参数
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { * @return /
wrapper.between(SystemQuartzJobTb::getUpdateTime, criteria.getCreateTime().get(0), */
criteria.getCreateTime().get(1)); public KitPageResult<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria,
} Page<SystemQuartzJobTb> page) {
} LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByDesc(SystemQuartzJobTb::getId); this.injectQuartzJobQueryParams(criteria, wrapper);
} return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper));
}
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs criteria, private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs criteria,
LambdaQueryWrapper<SystemQuartzLogTb> wrapper) { LambdaQueryWrapper<SystemQuartzJobTb> wrapper) {
if (criteria != null) { if (criteria != null) {
wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzLogTb::getJobName, wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzJobTb::getJobName,
criteria.getJobName()); criteria.getJobName());
wrapper.eq(criteria.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, criteria.getIsSuccess()); if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { wrapper.between(SystemQuartzJobTb::getUpdateTime, criteria.getCreateTime().get(0),
wrapper.between(SystemQuartzLogTb::getCreateTime, criteria.getCreateTime().get(0), criteria.getCreateTime().get(1));
criteria.getCreateTime().get(1)); }
}
}
wrapper.orderByDesc(SystemQuartzLogTb::getId);
} }
wrapper.orderByDesc(SystemQuartzJobTb::getId);
}
/** private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs criteria,
* 分页查询日志 LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
* if (criteria != null) {
* @param criteria 条件 wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzLogTb::getJobName,
* @param page 分页参数 criteria.getJobName());
* @return / wrapper.eq(criteria.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, criteria.getIsSuccess());
*/ if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) {
public KitPageResult<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria, wrapper.between(SystemQuartzLogTb::getCreateTime, criteria.getCreateTime().get(0),
Page<SystemQuartzLogTb> page) { criteria.getCreateTime().get(1));
LambdaQueryWrapper<SystemQuartzLogTb> wrapper = new LambdaQueryWrapper<>(); }
this.injectQuartzLogQueryParams(criteria, wrapper);
return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper));
} }
wrapper.orderByDesc(SystemQuartzLogTb::getId);
}
/** /**
* 查询全部 * 分页查询日志
* *
* @param criteria 条件 * @param criteria 条件
* @return / * @param page 分页参数
*/ * @return /
public List<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) { */
LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>(); public KitPageResult<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria,
this.injectQuartzJobQueryParams(criteria, wrapper); Page<SystemQuartzLogTb> page) {
return systemQuartzJobMapper.selectList(wrapper); LambdaQueryWrapper<SystemQuartzLogTb> wrapper = new LambdaQueryWrapper<>();
} this.injectQuartzLogQueryParams(criteria, wrapper);
return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper));
}
/** /**
* 查询全部 * 查询全部
* *
* @param criteria 条件 * @param criteria 条件
* @return / * @return /
*/ */
public List<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) { public List<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) {
LambdaQueryWrapper<SystemQuartzLogTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>();
this.injectQuartzLogQueryParams(criteria, wrapper); this.injectQuartzJobQueryParams(criteria, wrapper);
return systemQuartzLogMapper.selectList(wrapper); return systemQuartzJobMapper.selectList(wrapper);
} }
public SystemQuartzJobTb getQuartzJobById(Long id) { /**
return systemQuartzJobMapper.selectById(id); * 查询全部
} *
* @param criteria 条件
* @return /
*/
public List<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) {
LambdaQueryWrapper<SystemQuartzLogTb> wrapper = new LambdaQueryWrapper<>();
this.injectQuartzLogQueryParams(criteria, wrapper);
return systemQuartzLogMapper.selectList(wrapper);
}
public List<SystemQuartzJobTb> queryEnableQuartzJob() { public SystemQuartzJobTb getQuartzJobById(Long id) {
LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>(); return systemQuartzJobMapper.selectById(id);
wrapper.eq(SystemQuartzJobTb::getIsPause, 0); }
return systemQuartzJobMapper.selectList(wrapper);
} public List<SystemQuartzJobTb> queryEnableQuartzJob() {
LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemQuartzJobTb::getIsPause, 0);
return systemQuartzJobMapper.selectList(wrapper);
}
} }
@@ -31,46 +31,49 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemRoleDeptService { public class SystemRoleDeptService {
@Autowired private SystemRoleDeptMapper systemRoleDeptMapper;
@Autowired private SystemDeptMapper systemDeptMapper;
@Transactional(rollbackFor = Exception.class) @Autowired
public void batchDeleteRoleDept(Set<Long> roleIds) { private SystemRoleDeptMapper systemRoleDeptMapper;
if (CollUtil.isNotEmpty(roleIds)) { @Autowired
LambdaQueryWrapper<SystemRoleDeptTb> wrapper = new LambdaQueryWrapper<>(); private SystemDeptMapper systemDeptMapper;
wrapper.in(SystemRoleDeptTb::getRoleId, roleIds);
systemRoleDeptMapper.delete(wrapper);
}
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void batchInsertRoleDept(Set<SystemDeptTb> depts, Long id) { public void batchDeleteRoleDept(Set<Long> roleIds) {
if (CollUtil.isNotEmpty(depts)) { if (CollUtil.isNotEmpty(roleIds)) {
List<SystemRoleDeptTb> records = new ArrayList<>(); LambdaQueryWrapper<SystemRoleDeptTb> wrapper = new LambdaQueryWrapper<>();
for (SystemDeptTb dept : depts) { wrapper.in(SystemRoleDeptTb::getRoleId, roleIds);
SystemRoleDeptTb record = new SystemRoleDeptTb(); systemRoleDeptMapper.delete(wrapper);
record.setRoleId(id);
record.setDeptId(dept.getId());
records.add(record);
}
systemRoleDeptMapper.insert(records);
}
} }
}
/** @Transactional(rollbackFor = Exception.class)
* 根据角色id查询 public void batchInsertRoleDept(Set<SystemDeptTb> depts, Long id) {
* if (CollUtil.isNotEmpty(depts)) {
* @param roleId / List<SystemRoleDeptTb> records = new ArrayList<>();
* @return / for (SystemDeptTb dept : depts) {
*/ SystemRoleDeptTb record = new SystemRoleDeptTb();
public List<SystemDeptTb> selectDeptByRoleId(Long roleId) { record.setRoleId(id);
LambdaQueryWrapper<SystemRoleDeptTb> wrapper = new LambdaQueryWrapper<>(); record.setDeptId(dept.getId());
wrapper.eq(SystemRoleDeptTb::getRoleId, roleId); records.add(record);
List<SystemRoleDeptTb> systemRoleDeptTbs = systemRoleDeptMapper.selectList(wrapper); }
if (systemRoleDeptTbs.isEmpty()) { systemRoleDeptMapper.insert(records);
return new ArrayList<>();
}
List<Long> deptIds = systemRoleDeptTbs.stream().map(SystemRoleDeptTb::getDeptId).collect(Collectors.toList());
return systemDeptMapper.selectByIds(deptIds);
} }
}
/**
* 根据角色id查询
*
* @param roleId /
* @return /
*/
public List<SystemDeptTb> selectDeptByRoleId(Long roleId) {
LambdaQueryWrapper<SystemRoleDeptTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleDeptTb::getRoleId, roleId);
List<SystemRoleDeptTb> systemRoleDeptTbs = systemRoleDeptMapper.selectList(wrapper);
if (systemRoleDeptTbs.isEmpty()) {
return new ArrayList<>();
}
List<Long> deptIds = systemRoleDeptTbs.stream().map(SystemRoleDeptTb::getDeptId).collect(Collectors.toList());
return systemDeptMapper.selectByIds(deptIds);
}
} }
@@ -32,56 +32,59 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemRoleMenuService { public class SystemRoleMenuService {
@Autowired private SystemRoleMenuMapper systemRoleMenuMapper;
@Autowired private SystemMenuMapper systemMenuMapper;
@Transactional(rollbackFor = Exception.class) @Autowired
public void deleteRoleMenuByRoleId(Long roleId) { private SystemRoleMenuMapper systemRoleMenuMapper;
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>(); @Autowired
wrapper.eq(SystemRoleMenuTb::getRoleId, roleId); private SystemMenuMapper systemMenuMapper;
systemRoleMenuMapper.delete(wrapper);
@Transactional(rollbackFor = Exception.class)
public void deleteRoleMenuByRoleId(Long roleId) {
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleMenuTb::getRoleId, roleId);
systemRoleMenuMapper.delete(wrapper);
}
@Transactional(rollbackFor = Exception.class)
public void batchInsertRoleMenu(Set<SystemMenuTb> menus, Long roleId) {
if (CollUtil.isNotEmpty(menus)) {
List<SystemRoleMenuTb> records = new ArrayList<>();
for (SystemMenuTb menu : menus) {
SystemRoleMenuTb record = new SystemRoleMenuTb();
record.setMenuId(menu.getId());
record.setRoleId(roleId);
records.add(record);
}
systemRoleMenuMapper.insert(records);
}
}
@Transactional(rollbackFor = Exception.class)
public void batchDeleteRoleMenu(Set<Long> roleIds) {
if (CollUtil.isNotEmpty(roleIds)) {
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemRoleMenuTb::getRoleId, roleIds);
systemRoleMenuMapper.delete(wrapper);
}
}
public LinkedHashSet<SystemMenuTb> queryMenuByRoleIdsAndType(Set<Long> roleIds, int menuType) {
if (CollUtil.isEmpty(roleIds)) {
return new LinkedHashSet<>();
}
LambdaQueryWrapper<SystemRoleMenuTb> roleMenuWrapper = new LambdaQueryWrapper<>();
roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds);
List<Long> menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId)
.collect(Collectors.toList());
if (CollUtil.isEmpty(menuIds)) {
return new LinkedHashSet<>();
} }
@Transactional(rollbackFor = Exception.class) LambdaQueryWrapper<SystemMenuTb> menuWrapper = new LambdaQueryWrapper<>();
public void batchInsertRoleMenu(Set<SystemMenuTb> menus, Long roleId) { menuWrapper.in(SystemMenuTb::getId, menuIds);
if (CollUtil.isNotEmpty(menus)) { // 排除"按钮"
List<SystemRoleMenuTb> records = new ArrayList<>(); menuWrapper.ne(SystemMenuTb::getType, 2);
for (SystemMenuTb menu : menus) { menuWrapper.orderByAsc(SystemMenuTb::getMenuSort);
SystemRoleMenuTb record = new SystemRoleMenuTb(); return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper));
record.setMenuId(menu.getId()); }
record.setRoleId(roleId);
records.add(record);
}
systemRoleMenuMapper.insert(records);
}
}
@Transactional(rollbackFor = Exception.class)
public void batchDeleteRoleMenu(Set<Long> roleIds) {
if (CollUtil.isNotEmpty(roleIds)) {
LambdaQueryWrapper<SystemRoleMenuTb> wrapper = new LambdaQueryWrapper<>();
wrapper.in(SystemRoleMenuTb::getRoleId, roleIds);
systemRoleMenuMapper.delete(wrapper);
}
}
public LinkedHashSet<SystemMenuTb> queryMenuByRoleIdsAndType(Set<Long> roleIds, int menuType) {
if (CollUtil.isEmpty(roleIds)) {
return new LinkedHashSet<>();
}
LambdaQueryWrapper<SystemRoleMenuTb> roleMenuWrapper = new LambdaQueryWrapper<>();
roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds);
List<Long> menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId)
.collect(Collectors.toList());
if (CollUtil.isEmpty(menuIds)) {
return new LinkedHashSet<>();
}
LambdaQueryWrapper<SystemMenuTb> menuWrapper = new LambdaQueryWrapper<>();
menuWrapper.in(SystemMenuTb::getId, menuIds);
// 排除"按钮"
menuWrapper.ne(SystemMenuTb::getType, 2);
menuWrapper.orderByAsc(SystemMenuTb::getMenuSort);
return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper));
}
} }
@@ -34,7 +34,6 @@ import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -44,217 +43,223 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class SystemRoleService { public class SystemRoleService {
@Autowired private SystemRoleMapper systemRoleMapper;
@Autowired private SystemRoleMenuService systemRoleMenuService;
@Autowired private SystemUserMapper systemUserMapper;
@Autowired private SystemRoleDeptService systemRoleDeptService;
/** @Autowired
* 创建 private SystemRoleMapper systemRoleMapper;
* @Autowired
* @param args / private SystemRoleMenuService systemRoleMenuService;
*/ @Autowired
@Transactional(rollbackFor = Exception.class) private SystemUserMapper systemUserMapper;
public void saveRole(SystemCreateRoleArgs args) { @Autowired
if (this.getRoleByName(args.getName()) != null) { private SystemRoleDeptService systemRoleDeptService;
throw new BadRequestException("角色名称已存在");
}
systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class));
// 判断是否有部门数据, 若有, 则需创建关联
if (CollectionUtil.isNotEmpty(args.getDepts())) {
systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId());
}
}
private SystemRoleTb getRoleByName(String name) { /**
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>(); * 创建
wrapper.eq(SystemRoleTb::getName, name); *
return systemRoleMapper.selectOne(wrapper); * @param args /
*/
@Transactional(rollbackFor = Exception.class)
public void saveRole(SystemCreateRoleArgs args) {
if (this.getRoleByName(args.getName()) != null) {
throw new BadRequestException("角色名称已存在");
} }
systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class));
// 判断是否有部门数据, 若有, 则需创建关联
if (CollectionUtil.isNotEmpty(args.getDepts())) {
systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId());
}
}
/** private SystemRoleTb getRoleByName(String name) {
* 修改 LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
* wrapper.eq(SystemRoleTb::getName, name);
* @param args / return systemRoleMapper.selectOne(wrapper);
*/ }
@Transactional(rollbackFor = Exception.class)
public void modifyRoleById(SystemRoleVo args) {
SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class);
SystemRoleTb role1 = this.getRoleByName(args.getName());
if (role1 != null && !role1.getId().equals(role.getId())) {
throw new BadRequestException("角色名称已存在");
}
role.setName(args.getName());
role.setDescription(args.getDescription());
role.setDataScope(args.getDataScope());
role.setDepts(args.getDepts());
role.setLevel(args.getLevel());
// 更新
systemRoleMapper.insertOrUpdate(role);
// 删除关联部门数据
systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId()));
// 判断是否有部门数据, 若有, 则需更新关联
if (CollectionUtil.isNotEmpty(args.getDepts())) {
systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId());
}
}
/** /**
* 修改绑定的菜单 * 修改
* *
* @param role / * @param args /
*/ */
public void modifyBindMenuById(SystemRoleVo role) { @Transactional(rollbackFor = Exception.class)
// 更新菜单 public void modifyRoleById(SystemRoleVo args) {
systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class);
// 判断是否为空 SystemRoleTb role1 = this.getRoleByName(args.getName());
if (CollUtil.isNotEmpty(role.getMenus())) { if (role1 != null && !role1.getId().equals(role.getId())) {
systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); throw new BadRequestException("角色名称已存在");
}
} }
role.setName(args.getName());
role.setDescription(args.getDescription());
role.setDataScope(args.getDataScope());
role.setDepts(args.getDepts());
role.setLevel(args.getLevel());
// 更新
systemRoleMapper.insertOrUpdate(role);
// 删除关联部门数据
systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId()));
// 判断是否有部门数据, 若有, 则需更新关联
if (CollectionUtil.isNotEmpty(args.getDepts())) {
systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId());
}
}
/** /**
* 删除 * 修改绑定的菜单
* *
* @param ids / * @param role /
*/ */
@Transactional(rollbackFor = Exception.class) public void modifyBindMenuById(SystemRoleVo role) {
public void removeRoleByIds(Set<Long> ids) { // 更新菜单
systemRoleMapper.deleteByIds(ids); systemRoleMenuService.deleteRoleMenuByRoleId(role.getId());
// 删除角色部门关联数据、角色菜单关联数据 // 判断是否为空
systemRoleDeptService.batchDeleteRoleDept(ids); if (CollUtil.isNotEmpty(role.getMenus())) {
systemRoleMenuService.batchDeleteRoleMenu(ids); systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId());
} }
}
/** /**
* 导出数据 * 删除
* *
* @param roles 待导出的数据 * @param ids /
* @param response / */
* @throws IOException @Transactional(rollbackFor = Exception.class)
*/ public void removeRoleByIds(Set<Long> ids) {
public void exportRoleExcel(List<SystemRoleVo> roles, HttpServletResponse response) throws IOException { systemRoleMapper.deleteByIds(ids);
List<Map<String, Object>> list = new ArrayList<>(); // 删除角色部门关联数据、角色菜单关联数据
for (SystemRoleVo role : roles) { systemRoleDeptService.batchDeleteRoleDept(ids);
Map<String, Object> map = new LinkedHashMap<>(); systemRoleMenuService.batchDeleteRoleMenu(ids);
map.put("角色名称", role.getName()); }
map.put("角色级别", role.getLevel());
map.put("描述", role.getDescription());
map.put("创建日期", role.getCreateTime());
list.add(map);
}
KitFileUtil.downloadExcel(list, response);
}
/** /**
* 查询全部角色 * 导出数据
* *
* @return * @param roles 待导出的数据
*/ * @param response /
public List<SystemRoleTb> queryAllRole() { * @throws IOException
return this.selectAllRole(); */
public void exportRoleExcel(List<SystemRoleVo> roles, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (SystemRoleVo role : roles) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("角色名称", role.getName());
map.put("角色级别", role.getLevel());
map.put("描述", role.getDescription());
map.put("创建日期", role.getCreateTime());
list.add(map);
} }
KitFileUtil.downloadExcel(list, response);
}
private List<SystemRoleTb> selectAllRole() { /**
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>(); * 查询全部角色
wrapper.orderByAsc(SystemRoleTb::getLevel); *
return systemRoleMapper.selectList(wrapper); * @return
} */
public List<SystemRoleTb> queryAllRole() {
return this.selectAllRole();
}
/** private List<SystemRoleTb> selectAllRole() {
* 根据条件查询全部角色 LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
* wrapper.orderByAsc(SystemRoleTb::getLevel);
* @param criteria 条件 return systemRoleMapper.selectList(wrapper);
* @return }
*/
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs criteria) {
return systemRoleMapper.selectRoleByArgs(criteria);
}
/** /**
* 分页查询角色 * 根据条件查询全部角色
* *
* @param criteria 条件 * @param criteria 条件
* @param page 分页参数 * @return
* @return */
*/ public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs criteria) {
public KitPageResult<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs criteria, Page<Object> page) { return systemRoleMapper.selectRoleByArgs(criteria);
criteria.setOffset(page.offset()); }
List<SystemRoleVo> roles = systemRoleMapper.selectRoleByArgs(criteria);
Long total = systemRoleMapper.countRoleByArgs(criteria);
return KitPageUtil.toPage(roles, total);
}
/** /**
* 根据用户ID查询 * 分页查询角色
* *
* @param userId 用户ID * @param criteria 条件
* @return / * @param page 分页参数
*/ * @return
public List<SystemRoleVo> queryRoleByUsersId(Long userId) { */
return systemRoleMapper.selectRoleByUserId(userId); public KitPageResult<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs criteria, Page<Object> page) {
} criteria.setOffset(page.offset());
List<SystemRoleVo> roles = systemRoleMapper.selectRoleByArgs(criteria);
Long total = systemRoleMapper.countRoleByArgs(criteria);
return KitPageUtil.toPage(roles, total);
}
/** /**
* 根据角色查询角色级别 * 根据用户ID查询
* *
* @param roles / * @param userId 用户ID
* @return / * @return /
*/ */
public Integer getDeptLevelByRoles(Set<SystemRoleTb> roles) { public List<SystemRoleVo> queryRoleByUsersId(Long userId) {
if (CollUtil.isEmpty(roles)) { return systemRoleMapper.selectRoleByUserId(userId);
return Integer.MAX_VALUE; }
}
Set<SystemRoleTb> roleSet = new HashSet<>();
for (SystemRoleTb role : roles) {
roleSet.add(getRoleById(role.getId()));
}
return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList()));
}
/** /**
* 获取用户权限信息 * 根据角色查询角色级别
* *
* @param user 用户信息 * @param roles /
* @return 权限信息 * @return /
*/ */
public List<SystemRoleCodeVo> buildUserRolePermissions(SystemUserTb user) { public Integer getDeptLevelByRoles(Set<SystemRoleTb> roles) {
Set<String> permissions = new HashSet<>(); if (CollUtil.isEmpty(roles)) {
// 如果是管理员直接返回 return Integer.MAX_VALUE;
if (user.getIsAdmin()) {
permissions.add("admin");
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
}
List<SystemRoleVo> roles = systemRoleMapper.selectRoleByUserId(user.getId());
permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission)
.filter(StrUtil::isNotBlank).collect(Collectors.toSet());
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
} }
Set<SystemRoleTb> roleSet = new HashSet<>();
for (SystemRoleTb role : roles) {
roleSet.add(getRoleById(role.getId()));
}
return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList()));
}
/** /**
* 验证是否被用户关联 * 获取用户权限信息
* *
* @param ids / * @param user 用户信息
*/ * @return 权限信息
public void verifyBindRelationByIds(Set<Long> ids) { */
if (systemUserMapper.countUserByRoleIds(ids) > 0) { public List<SystemRoleCodeVo> buildUserRolePermissions(SystemUserTb user) {
throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); Set<String> permissions = new HashSet<>();
} // 如果是管理员直接返回
if (user.getIsAdmin()) {
permissions.add("admin");
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
} }
List<SystemRoleVo> roles = systemRoleMapper.selectRoleByUserId(user.getId());
permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission)
.filter(StrUtil::isNotBlank).collect(Collectors.toSet());
return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList());
}
/** /**
* 根据ID查询 * 验证是否被用户关联
* *
* @param id / * @param ids /
* @return / */
*/ public void verifyBindRelationByIds(Set<Long> ids) {
public SystemRoleTb getRoleById(Long id) { if (systemUserMapper.countUserByRoleIds(ids) > 0) {
return systemRoleMapper.selectById(id); throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!");
} }
}
/**
* 根据ID查询
*
* @param id /
* @return /
*/
public SystemRoleTb getRoleById(Long id) {
return systemRoleMapper.selectById(id);
}
} }

Some files were not shown because too many files have changed in this diff Show More