!10 sync 同步ruoyi-vue-plus更新

update sa-token 1.28.0 => 1.29.0
修复Xss注解字段值为空时的异常问题
删除方法无返回值时,方法注释上的@HTTP4O4
update 使用 satoken 自带的 BCrypt 工具 替换 Security 加密工具 减少依赖
优化流程任务方法,统一响应格式
fix 修复 R 参数位置错误
fix 修复 验证码 强制校验问题
update 返回体 统一
修复自定义组件file-upload无法显示第一个文件,列表显示的文件比实际文件少一个的问题
update 修改验证码校验 增加 uuid 空判断
update 优化代码生成
fix 修复因升级 sa-token 导致 doLogin 无法获取 token 问题
update 更新 swagger 配置类错误注释
update 优化 TreeBuildUtils 工具 使用反射自动获取顶级父id
fix 回滚代码生成部分优化 修复优化导致的问题
update 使用 hutool Dict 优化 JsonUtils 防止类型解析异常
update 优化代码生成 使用新 JsonUtils.parseMap 方法
This commit is contained in:
KonBAI
2022-02-15 14:20:20 +00:00
parent 39ef71246b
commit 8c029a3dc3
58 changed files with 246 additions and 255 deletions

View File

@@ -0,0 +1,13 @@
### 使用版本
### 问题描述
### 希望结果
### 重现步骤
### 报错信息(截图为主 请勿发混乱格式)

View File

@@ -0,0 +1,7 @@
### 更改目的 解决了什么问题
### 描述 做了哪些改动
### 测试 都做了哪些测试(未经过测试不采纳)

3
.gitignore vendored
View File

@@ -25,6 +25,9 @@ target/
*.iml *.iml
*.ipr *.ipr
### JRebel ###
rebel.xml
### NetBeans ### ### NetBeans ###
nbproject/private/ nbproject/private/
build/* build/*

View File

@@ -26,7 +26,7 @@
<easyexcel.version>3.0.5</easyexcel.version> <easyexcel.version>3.0.5</easyexcel.version>
<cglib.version>3.3.0</cglib.version> <cglib.version>3.3.0</cglib.version>
<velocity.version>2.3</velocity.version> <velocity.version>2.3</velocity.version>
<satoken.version>1.28.0</satoken.version> <satoken.version>1.29.0</satoken.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version> <mybatis-plus.version>3.5.1</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version> <p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.7.20</hutool.version> <hutool.version>5.7.20</hutool.version>

View File

@@ -121,7 +121,7 @@ public class SysConfigController extends BaseController {
@DeleteMapping("/{configIds}") @DeleteMapping("/{configIds}")
public R<Void> remove(@ApiParam("参数ID串") @PathVariable Long[] configIds) { public R<Void> remove(@ApiParam("参数ID串") @PathVariable Long[] configIds) {
configService.deleteConfigByIds(configIds); configService.deleteConfigByIds(configIds);
return success(); return R.ok();
} }
/** /**

View File

@@ -108,6 +108,6 @@ public class SysDictDataController extends BaseController {
@DeleteMapping("/{dictCodes}") @DeleteMapping("/{dictCodes}")
public R<Void> remove(@ApiParam("字典code串") @PathVariable Long[] dictCodes) { public R<Void> remove(@ApiParam("字典code串") @PathVariable Long[] dictCodes) {
dictDataService.deleteDictDataByIds(dictCodes); dictDataService.deleteDictDataByIds(dictCodes);
return success(); return R.ok();
} }
} }

View File

@@ -98,7 +98,7 @@ public class SysDictTypeController extends BaseController {
@DeleteMapping("/{dictIds}") @DeleteMapping("/{dictIds}")
public R<Void> remove(@ApiParam("字典ID串") @PathVariable Long[] dictIds) { public R<Void> remove(@ApiParam("字典ID串") @PathVariable Long[] dictIds) {
dictTypeService.deleteDictTypeByIds(dictIds); dictTypeService.deleteDictTypeByIds(dictIds);
return success(); return R.ok();
} }
/** /**

View File

@@ -9,16 +9,13 @@ import cn.hutool.http.HttpUtil;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.core.validate.QueryGroup;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.oss.constant.OssConstant;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.SysOss;
import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.bo.SysOssBo;
import com.ruoyi.system.domain.vo.SysOssVo; import com.ruoyi.system.domain.vo.SysOssVo;
@@ -45,7 +42,7 @@ import java.util.Map;
* @author Lion Li * @author Lion Li
*/ */
@Validated @Validated
@Api(value = "OSS对象存储控制器", tags = {"OSS对象存储管理"}) @Api(value = "对象存储控制器", tags = {"对象存储管理"})
@RequiredArgsConstructor @RequiredArgsConstructor
@RestController @RestController
@RequestMapping("/system/oss") @RequestMapping("/system/oss")
@@ -69,7 +66,7 @@ public class SysOssController extends BaseController {
*/ */
@ApiOperation("上传OSS对象存储") @ApiOperation("上传OSS对象存储")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "file", value = "文件", dataTypeClass = File.class, required = true), @ApiImplicitParam(name = "file", value = "文件", paramType = "query", dataTypeClass = File.class, required = true)
}) })
@SaCheckPermission("system:oss:upload") @SaCheckPermission("system:oss:upload")
@Log(title = "OSS对象存储", businessType = BusinessType.INSERT) @Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@@ -123,20 +120,4 @@ public class SysOssController extends BaseController {
return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0); return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0);
} }
/**
* 变更图片列表预览状态
*/
@ApiOperation("变更图片列表预览状态")
@SaCheckPermission("system:oss:edit")
@Log(title = "OSS对象存储", businessType = BusinessType.UPDATE)
@PutMapping("/changePreviewListResource")
public R<Void> changePreviewListResource(@RequestBody String body) {
Map<String, Boolean> map = JsonUtils.parseMap(body);
SysConfig sysConfig = new SysConfig();
sysConfig.setConfigKey(OssConstant.PEREVIEW_LIST_RESOURCE_KEY);
SysConfig config = iSysConfigService.getOne(sysConfig);
config.setConfigValue(map.get("previewListResource").toString());
return toAjax(iSysConfigService.updateConfig(config));
}
} }

View File

@@ -1,5 +1,6 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import cn.dev33.satoken.secure.BCrypt;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
@@ -7,7 +8,6 @@ import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.SysOss;
import com.ruoyi.system.service.ISysOssService; import com.ruoyi.system.service.ISysOssService;
@@ -92,13 +92,14 @@ public class SysProfileController extends BaseController {
SysUser user = userService.selectUserById(LoginHelper.getUserId()); SysUser user = userService.selectUserById(LoginHelper.getUserId());
String userName = user.getUserName(); String userName = user.getUserName();
String password = user.getPassword(); String password = user.getPassword();
if (!SecurityUtils.matchesPassword(oldPassword, password)) { if (!BCrypt.checkpw(oldPassword, password)) {
return R.fail("修改密码失败,旧密码错误"); return R.fail("修改密码失败,旧密码错误");
} }
if (SecurityUtils.matchesPassword(newPassword, password)) { if (BCrypt.checkpw(newPassword, password)) {
return R.fail("新密码不能与旧密码相同"); return R.fail("新密码不能与旧密码相同");
} }
if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) {
if (userService.resetUserPwd(userName, BCrypt.hashpw(newPassword)) > 0) {
return R.ok(); return R.ok();
} }
return R.fail("修改密码异常,请联系管理员"); return R.fail("修改密码异常,请联系管理员");

View File

@@ -31,9 +31,9 @@ public class SysRegisterController extends BaseController {
@PostMapping("/register") @PostMapping("/register")
public R<Void> register(@Validated @RequestBody RegisterBody user) { public R<Void> register(@Validated @RequestBody RegisterBody user) {
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
return error("当前系统没有开启注册功能!"); return R.fail("当前系统没有开启注册功能!");
} }
registerService.register(user); registerService.register(user);
return success(); return R.ok();
} }
} }

View File

@@ -1,21 +1,21 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.excel.ExcelResult;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.vo.SysUserExportVo; import com.ruoyi.system.domain.vo.SysUserExportVo;
@@ -137,7 +137,7 @@ public class SysUserController extends BaseController {
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
} }
user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); user.setPassword(BCrypt.hashpw(user.getPassword()));
return toAjax(userService.insertUser(user)); return toAjax(userService.insertUser(user));
} }
@@ -170,7 +170,7 @@ public class SysUserController extends BaseController {
@DeleteMapping("/{userIds}") @DeleteMapping("/{userIds}")
public R<Void> remove(@ApiParam("角色ID串") @PathVariable Long[] userIds) { public R<Void> remove(@ApiParam("角色ID串") @PathVariable Long[] userIds) {
if (ArrayUtil.contains(userIds, getUserId())) { if (ArrayUtil.contains(userIds, getUserId())) {
return error("当前用户不能删除"); return R.fail("当前用户不能删除");
} }
return toAjax(userService.deleteUserByIds(userIds)); return toAjax(userService.deleteUserByIds(userIds));
} }
@@ -185,7 +185,7 @@ public class SysUserController extends BaseController {
public R<Void> resetPwd(@RequestBody SysUser user) { public R<Void> resetPwd(@RequestBody SysUser user) {
userService.checkUserAllowed(user); userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId()); userService.checkUserDataScope(user.getUserId());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); user.setPassword(BCrypt.hashpw(user.getPassword()));
return toAjax(userService.resetPwd(user)); return toAjax(userService.resetPwd(user));
} }
@@ -231,6 +231,6 @@ public class SysUserController extends BaseController {
public R<Void> insertAuthRole(Long userId, Long[] roleIds) { public R<Void> insertAuthRole(Long userId, Long[] roleIds) {
userService.checkUserDataScope(userId); userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds); userService.insertUserAuth(userId, roleIds);
return success(); return R.ok();
} }
} }

View File

@@ -83,10 +83,10 @@ public class FlowDefinitionController extends BaseController {
flowDefinitionService.importFile(name, category, in); flowDefinitionService.importFile(name, category, in);
} catch (Exception e) { } catch (Exception e) {
log.error("导入失败:", e); log.error("导入失败:", e);
return error(e.getMessage()); return R.fail(e.getMessage());
} }
return success("导入成功"); return R.ok("导入成功");
} }
@@ -94,7 +94,7 @@ public class FlowDefinitionController extends BaseController {
@GetMapping("/readXml/{definitionId}") @GetMapping("/readXml/{definitionId}")
public R<String> readXml(@ApiParam(value = "流程定义ID") @PathVariable(value = "definitionId") String definitionId) { public R<String> readXml(@ApiParam(value = "流程定义ID") @PathVariable(value = "definitionId") String definitionId) {
try { try {
return R.ok(flowDefinitionService.readXml(definitionId), null); return R.ok(null, flowDefinitionService.readXml(definitionId));
} catch (Exception e) { } catch (Exception e) {
return R.fail("加载xml文件异常"); return R.fail("加载xml文件异常");
} }
@@ -124,10 +124,10 @@ public class FlowDefinitionController extends BaseController {
flowDefinitionService.importFile(vo.getName(), vo.getCategory(), in); flowDefinitionService.importFile(vo.getName(), vo.getCategory(), in);
} catch (Exception e) { } catch (Exception e) {
log.error("导入失败:", e); log.error("导入失败:", e);
return success(e.getMessage()); return R.ok(e.getMessage());
} }
return success("导入成功"); return R.ok("导入成功");
} }
@@ -136,7 +136,7 @@ public class FlowDefinitionController extends BaseController {
public R<Void> start(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId, public R<Void> start(@ApiParam(value = "流程定义id") @PathVariable(value = "procDefId") String procDefId,
@ApiParam(value = "变量集合,json对象") @RequestBody Map<String, Object> variables) { @ApiParam(value = "变量集合,json对象") @RequestBody Map<String, Object> variables) {
flowDefinitionService.startProcessInstanceById(procDefId, variables); flowDefinitionService.startProcessInstanceById(procDefId, variables);
return success("流程启动成功"); return R.ok("流程启动成功");
} }
@@ -145,14 +145,14 @@ public class FlowDefinitionController extends BaseController {
public R<Void> updateState(@ApiParam(value = "ture:挂起,false:激活", required = true) @RequestParam Boolean suspended, public R<Void> updateState(@ApiParam(value = "ture:挂起,false:激活", required = true) @RequestParam Boolean suspended,
@ApiParam(value = "流程定义ID", required = true) @RequestParam String definitionId) { @ApiParam(value = "流程定义ID", required = true) @RequestParam String definitionId) {
flowDefinitionService.updateState(suspended, definitionId); flowDefinitionService.updateState(suspended, definitionId);
return success(); return R.ok();
} }
@ApiOperation(value = "删除流程") @ApiOperation(value = "删除流程")
@DeleteMapping(value = "/delete") @DeleteMapping(value = "/delete")
public R<Void> delete(@ApiParam(value = "流程部署ID", required = true) @RequestParam String deployId) { public R<Void> delete(@ApiParam(value = "流程部署ID", required = true) @RequestParam String deployId) {
flowDefinitionService.delete(deployId); flowDefinitionService.delete(deployId);
return success(); return R.ok();
} }
@ApiOperation(value = "指定流程办理人员列表") @ApiOperation(value = "指定流程办理人员列表")

View File

@@ -1,6 +1,5 @@
#错误消息 #错误消息
not.null=* 必须填写 not.null=* 必须填写
user.jcaptcha.blank=验证码不能为空
user.jcaptcha.error=验证码错误 user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效 user.jcaptcha.expire=验证码已失效
user.not.exists=对不起, 您的账号:{0} 不存在. user.not.exists=对不起, 您的账号:{0} 不存在.

View File

@@ -40,11 +40,6 @@
<artifactId>sa-token-jwt</artifactId> <artifactId>sa-token-jwt</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
<!-- 自定义验证注解 --> <!-- 自定义验证注解 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@@ -181,6 +181,11 @@ public interface GenConstants {
*/ */
String QUERY_LIKE = "LIKE"; String QUERY_LIKE = "LIKE";
/**
* 相等查询
*/
String QUERY_EQ = "EQ";
/** /**
* 需要 * 需要
*/ */

View File

@@ -8,38 +8,10 @@ import com.ruoyi.common.utils.StringUtils;
/** /**
* web层通用数据处理 * web层通用数据处理
* *
* @author ruoyi * @author Lion Li
*/ */
public class BaseController { public class BaseController {
/**
* 返回成功
*/
public R<Void> success() {
return R.ok();
}
/**
* 返回失败消息
*/
public R<Void> error() {
return R.fail();
}
/**
* 返回成功消息
*/
public R<Void> success(String message) {
return R.ok(message);
}
/**
* 返回失败消息
*/
public R<Void> error(String message) {
return R.fail(message);
}
/** /**
* 响应返回结果 * 响应返回结果
* *
@@ -57,7 +29,7 @@ public class BaseController {
* @return 操作结果 * @return 操作结果
*/ */
protected R<Void> toAjax(boolean result) { protected R<Void> toAjax(boolean result) {
return result ? success() : error(); return result ? R.ok() : R.fail();
} }
/** /**

View File

@@ -49,7 +49,7 @@ public class R<T> implements Serializable {
return restResult(null, SUCCESS, msg); return restResult(null, SUCCESS, msg);
} }
public static <T> R<T> ok(T data, String msg) { public static <T> R<T> ok(String msg, T data) {
return restResult(data, SUCCESS, msg); return restResult(data, SUCCESS, msg);
} }
@@ -65,7 +65,7 @@ public class R<T> implements Serializable {
return restResult(data, FAIL, null); return restResult(data, FAIL, null);
} }
public static <T> R<T> fail(T data, String msg) { public static <T> R<T> fail(String msg, T data) {
return restResult(data, FAIL, msg); return restResult(data, FAIL, msg);
} }

View File

@@ -37,7 +37,6 @@ public class LoginBody {
/** /**
* 验证码 * 验证码
*/ */
@NotBlank(message = "{user.jcaptcha.blank}")
@ApiModelProperty(value = "验证码") @ApiModelProperty(value = "验证码")
private String code; private String code;
@@ -45,6 +44,6 @@ public class LoginBody {
* 唯一标识 * 唯一标识
*/ */
@ApiModelProperty(value = "唯一标识") @ApiModelProperty(value = "唯一标识")
private String uuid = ""; private String uuid;
} }

View File

@@ -125,4 +125,19 @@ public class LoginHelper {
return UserType.getUserType(loginId); return UserType.getUserType(loginId);
} }
/**
* 是否为管理员
*
* @param userId 用户ID
* @return 结果
*/
public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
}
public static boolean isAdmin() {
Long userId = getUserId();
return userId != null && 1L == userId;
}
} }

View File

@@ -1,5 +1,6 @@
package com.ruoyi.common.utils; package com.ruoyi.common.utils;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
@@ -12,7 +13,6 @@ import lombok.NoArgsConstructor;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* JSON 工具类 * JSON 工具类
@@ -72,13 +72,23 @@ public class JsonUtils {
} }
} }
public static <T> Map<String, T> parseMap(String text) { public static Dict parseMap(String text) {
if (StringUtils.isBlank(text)) { if (StringUtils.isBlank(text)) {
return null; return null;
} }
try { try {
return OBJECT_MAPPER.readValue(text, new TypeReference<Map<String, T>>() { return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class));
}); } catch (IOException e) {
throw new RuntimeException(e);
}
}
public static List<Dict> parseArrayMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class));
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -1,47 +0,0 @@
package com.ruoyi.common.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* 安全服务工具类
*
* @author Long Li
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SecurityUtils {
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
/**
* 是否为管理员
*
* @param userId 用户ID
* @return 结果
*/
public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
}
}

View File

@@ -97,9 +97,8 @@ public class ServletUtils extends ServletUtil {
* *
* @param response 渲染对象 * @param response 渲染对象
* @param string 待渲染的字符串 * @param string 待渲染的字符串
* @return null
*/ */
public static String renderString(HttpServletResponse response, String string) { public static void renderString(HttpServletResponse response, String string) {
try { try {
response.setStatus(HttpStatus.HTTP_OK); response.setStatus(HttpStatus.HTTP_OK);
response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setContentType(MediaType.APPLICATION_JSON_VALUE);
@@ -108,7 +107,6 @@ public class ServletUtils extends ServletUtil {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return null;
} }
/** /**
@@ -119,12 +117,12 @@ public class ServletUtils extends ServletUtil {
public static boolean isAjaxRequest(HttpServletRequest request) { public static boolean isAjaxRequest(HttpServletRequest request) {
String accept = request.getHeader("accept"); String accept = request.getHeader("accept");
if (accept != null && accept.indexOf("application/json") != -1) { if (accept != null && accept.contains("application/json")) {
return true; return true;
} }
String xRequestedWith = request.getHeader("X-Requested-With"); String xRequestedWith = request.getHeader("X-Requested-With");
if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) {
return true; return true;
} }
@@ -134,10 +132,7 @@ public class ServletUtils extends ServletUtil {
} }
String ajax = request.getParameter("__ajax"); String ajax = request.getParameter("__ajax");
if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) { return StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml");
return true;
}
return false;
} }
public static String getClientIP() { public static String getClientIP() {

View File

@@ -1,9 +1,11 @@
package com.ruoyi.common.utils; package com.ruoyi.common.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.lang.tree.parser.NodeParser; import cn.hutool.core.lang.tree.parser.NodeParser;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -22,8 +24,12 @@ public class TreeBuildUtils extends TreeUtil {
*/ */
public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");
public static <T> List<Tree<Long>> build(List<T> list, Long parentId, NodeParser<T, Long> nodeParser) { public static <T, K> List<Tree<K>> build(List<T> list, NodeParser<T, K> nodeParser) {
return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); if (CollUtil.isEmpty(list)) {
return null;
}
K k = ReflectUtils.invokeGetter(list.get(0), "parentId");
return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.ruoyi.common.utils.ip; package com.ruoyi.common.utils.ip;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.net.NetUtil; import cn.hutool.core.net.NetUtil;
import cn.hutool.http.HtmlUtil; import cn.hutool.http.HtmlUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
@@ -11,8 +12,6 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/** /**
* 获取地址类 * 获取地址类
* *
@@ -48,14 +47,14 @@ public class AddressUtils {
log.error("获取地理位置异常 {}", ip); log.error("获取地理位置异常 {}", ip);
return UNKNOWN; return UNKNOWN;
} }
Map<String, String> obj = JsonUtils.parseMap(rspStr); Dict obj = JsonUtils.parseMap(rspStr);
String region = obj.get("pro"); String region = obj.getStr("pro");
String city = obj.get("city"); String city = obj.getStr("city");
return String.format("%s %s", region, city); return String.format("%s %s", region, city);
} catch (Exception e) { } catch (Exception e) {
log.error("获取地理位置异常 {}", ip); log.error("获取地理位置异常 {}", ip);
} }
} }
return address; return UNKNOWN;
} }
} }

View File

@@ -18,23 +18,27 @@ import java.util.List;
public class SwaggerProperties { public class SwaggerProperties {
/** /**
* 验证码类型 * 文档开关
*/ */
private Boolean enabled; private Boolean enabled;
/** /**
* 设置请求的统一前缀 * 设置请求的统一前缀
*/ */
private String pathMapping; private String pathMapping;
/** /**
* 验证码类别 * 标头
*/ */
private String title; private String title;
/** /**
* 数字验证码位数 * 描述
*/ */
private String description; private String description;
/** /**
* 字符验证码长度 * 项目版本
*/ */
private String version; private String version;

View File

@@ -13,7 +13,6 @@ import com.ruoyi.common.enums.DataScopeType;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.DataPermissionHelper; import com.ruoyi.common.helper.DataPermissionHelper;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -80,7 +79,7 @@ public class PlusDataPermissionHandler {
DataPermissionHelper.setVariable("user", currentUser); DataPermissionHelper.setVariable("user", currentUser);
} }
// 如果是超级管理员,则不过滤数据 // 如果是超级管理员,则不过滤数据
if (ObjectUtil.isNull(currentUser) || SecurityUtils.isAdmin(currentUser.getUserId())) { if (ObjectUtil.isNull(currentUser) || LoginHelper.isAdmin(currentUser.getUserId())) {
return where; return where;
} }
String dataFilterSql = buildDataFilter(dataColumns, isSelect); String dataFilterSql = buildDataFilter(dataColumns, isSelect);

View File

@@ -42,7 +42,7 @@ public class UserActionListener implements SaTokenListener {
UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
String ip = ServletUtils.getClientIP(); String ip = ServletUtils.getClientIP();
LoginUser user = LoginHelper.getLoginUser(); LoginUser user = LoginHelper.getLoginUser();
String tokenValue = StpUtil.getTokenValue(); String tokenValue = StpUtil.getTokenValueByLoginId(loginId);
UserOnlineDTO dto = new UserOnlineDTO(); UserOnlineDTO dto = new UserOnlineDTO();
dto.setIpaddr(ip); dto.setIpaddr(ip);
dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip));

View File

@@ -1,8 +1,8 @@
package com.ruoyi.generator.service; package com.ruoyi.generator.service;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
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;
@@ -294,8 +294,17 @@ public class GenTableServiceImpl implements IGenTableService {
GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName());
column.setColumnId(prevColumn.getColumnId()); column.setColumnId(prevColumn.getColumnId());
if (column.isList()) { if (column.isList()) {
// 如果是列表,继续保留字典类型 // 如果是列表,继续保留查询方式/字典类型选项
column.setDictType(prevColumn.getDictType()); column.setDictType(prevColumn.getDictType());
column.setQueryType(prevColumn.getQueryType());
}
if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk()
&& (column.isInsert() || column.isEdit())
&& ((column.isUsableColumn()) || (!column.isSuperColumn())))
{
// 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项
column.setIsRequired(prevColumn.getIsRequired());
column.setHtmlType(prevColumn.getHtmlType());
} }
genTableColumnMapper.updateById(column); genTableColumnMapper.updateById(column);
} else { } else {
@@ -436,13 +445,13 @@ public class GenTableServiceImpl implements IGenTableService {
* @param genTable 设置后的生成对象 * @param genTable 设置后的生成对象
*/ */
public void setTableFromOptions(GenTable genTable) { public void setTableFromOptions(GenTable genTable) {
Map<String, Object> paramsObj = JsonUtils.parseMap(genTable.getOptions()); Dict paramsObj = JsonUtils.parseMap(genTable.getOptions());
if (ObjectUtil.isNotNull(paramsObj)) { if (ObjectUtil.isNotNull(paramsObj)) {
String treeCode = Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)); String treeCode = paramsObj.getStr(GenConstants.TREE_CODE);
String treeParentCode = Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE)); String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE);
String treeName = Convert.toStr(paramsObj.get(GenConstants.TREE_NAME)); String treeName = paramsObj.getStr(GenConstants.TREE_NAME);
String parentMenuId = Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)); String parentMenuId = paramsObj.getStr(GenConstants.PARENT_MENU_ID);
String parentMenuName = Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_NAME)); String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME);
genTable.setTreeCode(treeCode); genTable.setTreeCode(treeCode);
genTable.setTreeParentCode(treeParentCode); genTable.setTreeParentCode(treeParentCode);

View File

@@ -41,6 +41,7 @@ public class GenUtils {
column.setJavaField(StringUtils.toCamelCase(columnName)); column.setJavaField(StringUtils.toCamelCase(columnName));
// 设置默认类型 // 设置默认类型
column.setJavaType(GenConstants.TYPE_STRING); column.setJavaType(GenConstants.TYPE_STRING);
column.setQueryType(GenConstants.QUERY_EQ);
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) {
// 字符串长度超过500设置为文本域 // 字符串长度超过500设置为文本域
@@ -136,8 +137,7 @@ public class GenUtils {
public static String getModuleName(String packageName) { public static String getModuleName(String packageName) {
int lastIndex = packageName.lastIndexOf("."); int lastIndex = packageName.lastIndexOf(".");
int nameLength = packageName.length(); int nameLength = packageName.length();
String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); return StringUtils.substring(packageName, lastIndex + 1, nameLength);
return moduleName;
} }
/** /**

View File

@@ -2,6 +2,7 @@ package com.ruoyi.generator.util;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
@@ -78,14 +79,14 @@ public class VelocityUtils {
public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
String options = genTable.getOptions(); String options = genTable.getOptions();
Map<String, Object> paramsObj = JsonUtils.parseMap(options); Dict paramsObj = JsonUtils.parseMap(options);
String parentMenuId = getParentMenuId(paramsObj); String parentMenuId = getParentMenuId(paramsObj);
context.put("parentMenuId", parentMenuId); context.put("parentMenuId", parentMenuId);
} }
public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
String options = genTable.getOptions(); String options = genTable.getOptions();
Map<String, Object> paramsObj = JsonUtils.parseMap(options); Dict paramsObj = JsonUtils.parseMap(options);
String treeCode = getTreecode(paramsObj); String treeCode = getTreecode(paramsObj);
String treeParentCode = getTreeParentCode(paramsObj); String treeParentCode = getTreeParentCode(paramsObj);
String treeName = getTreeName(paramsObj); String treeName = getTreeName(paramsObj);
@@ -207,8 +208,7 @@ public class VelocityUtils {
*/ */
public static String getPackagePrefix(String packageName) { public static String getPackagePrefix(String packageName) {
int lastIndex = packageName.lastIndexOf("."); int lastIndex = packageName.lastIndexOf(".");
String basePackage = StringUtils.substring(packageName, 0, lastIndex); return StringUtils.substring(packageName, 0, lastIndex);
return basePackage;
} }
/** /**
@@ -271,10 +271,10 @@ public class VelocityUtils {
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 上级菜单ID字段 * @return 上级菜单ID字段
*/ */
public static String getParentMenuId(Map<String, Object> paramsObj) { public static String getParentMenuId(Dict paramsObj) {
if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
&& StringUtils.isNotEmpty(Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)))) { && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) {
return Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)); return paramsObj.getStr(GenConstants.PARENT_MENU_ID);
} }
return DEFAULT_PARENT_MENU_ID; return DEFAULT_PARENT_MENU_ID;
} }
@@ -298,9 +298,9 @@ public class VelocityUtils {
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 树父编码 * @return 树父编码
*/ */
public static String getTreeParentCode(Map<String, Object> paramsObj) { public static String getTreeParentCode(Dict paramsObj) {
if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE))); return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE));
} }
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
@@ -311,9 +311,9 @@ public class VelocityUtils {
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 树名称 * @return 树名称
*/ */
public static String getTreeName(Map<String, Object> paramsObj) { public static String getTreeName(Dict paramsObj) {
if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) {
return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_NAME))); return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME));
} }
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
@@ -326,8 +326,8 @@ public class VelocityUtils {
*/ */
public static int getExpandColumn(GenTable genTable) { public static int getExpandColumn(GenTable genTable) {
String options = genTable.getOptions(); String options = genTable.getOptions();
Map<String, Object> paramsObj = JsonUtils.parseMap(options); Dict paramsObj = JsonUtils.parseMap(options);
String treeName = Convert.toStr(paramsObj.get(GenConstants.TREE_NAME)); String treeName = paramsObj.getStr(GenConstants.TREE_NAME);
int num = 0; int num = 0;
for (GenTableColumn column : genTable.getColumns()) { for (GenTableColumn column : genTable.getColumns()) {
if (column.isList()) { if (column.isList()) {

View File

@@ -18,43 +18,55 @@ import java.util.List;
* @date ${datetime} * @date ${datetime}
*/ */
public interface I${ClassName}Service { public interface I${ClassName}Service {
/** /**
* 查询单个 * 查询${functionName}
* @return *
* @param ${pkColumn.javaField} ${functionName}主键
* @return ${functionName}
*/ */
${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField});
#if($table.crud || $table.sub) #if($table.crud || $table.sub)
/** /**
* 查询列表 * 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}集合
*/ */
TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery);
#end #end
/** /**
* 查询列表 * 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}集合
*/ */
List<${ClassName}Vo> queryList(${ClassName}Bo bo); List<${ClassName}Vo> queryList(${ClassName}Bo bo);
/** /**
* 根据新增业务对象插入${functionName} * 修改${functionName}
* @param bo ${functionName}新增业务对象 *
* @return * @param ${className} ${functionName}
* @return 结果
*/ */
Boolean insertByBo(${ClassName}Bo bo); Boolean insertByBo(${ClassName}Bo bo);
/** /**
* 根据编辑业务对象修改${functionName} * 修改${functionName}
* @param bo ${functionName}编辑业务对象 *
* @return * @param ${className} ${functionName}
* @return 结果
*/ */
Boolean updateByBo(${ClassName}Bo bo); Boolean updateByBo(${ClassName}Bo bo);
/** /**
* 校验并删除数据 * 校验并批量删除${functionName}信息
* @param ids 主键集合 *
* @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合
* @param isValid 是否校验,true-删除前校验,false-不校验 * @param isValid 是否校验,true-删除前校验,false-不校验
* @return * @return 结果
*/ */
Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid);
} }

View File

@@ -5,12 +5,12 @@ import com.ruoyi.common.utils.StringUtils;
#if($table.crud || $table.sub) #if($table.crud || $table.sub)
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
#end
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
#end
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ${packageName}.domain.bo.${ClassName}Bo; import ${packageName}.domain.bo.${ClassName}Bo;
import ${packageName}.domain.vo.${ClassName}Vo; import ${packageName}.domain.vo.${ClassName}Vo;
import ${packageName}.domain.${ClassName}; import ${packageName}.domain.${ClassName};
@@ -33,12 +33,24 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
private final ${ClassName}Mapper baseMapper; private final ${ClassName}Mapper baseMapper;
/**
* 查询${functionName}
*
* @param ${pkColumn.javaField} ${functionName}主键
* @return ${functionName}
*/
@Override @Override
public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){
return baseMapper.selectVoById(${pkColumn.javaField}); return baseMapper.selectVoById(${pkColumn.javaField});
} }
#if($table.crud || $table.sub) #if($table.crud || $table.sub)
/**
* 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}
*/
@Override @Override
public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) {
LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo);
@@ -47,6 +59,12 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
} }
#end #end
/**
* 查询${functionName}列表
*
* @param ${className} ${functionName}
* @return ${functionName}
*/
@Override @Override
public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { public List<${ClassName}Vo> queryList(${ClassName}Bo bo) {
LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo);
@@ -80,6 +98,12 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
return lqw; return lqw;
} }
/**
* 新增${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
@Override @Override
public Boolean insertByBo(${ClassName}Bo bo) { public Boolean insertByBo(${ClassName}Bo bo) {
${ClassName} add = BeanUtil.toBean(bo, ${ClassName}.class); ${ClassName} add = BeanUtil.toBean(bo, ${ClassName}.class);
@@ -92,6 +116,12 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
return flag; return flag;
} }
/**
* 修改${functionName}
*
* @param ${className} ${functionName}
* @return 结果
*/
@Override @Override
public Boolean updateByBo(${ClassName}Bo bo) { public Boolean updateByBo(${ClassName}Bo bo) {
${ClassName} update = BeanUtil.toBean(bo, ${ClassName}.class); ${ClassName} update = BeanUtil.toBean(bo, ${ClassName}.class);
@@ -108,6 +138,12 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
//TODO 做一些数据校验,如唯一约束 //TODO 做一些数据校验,如唯一约束
} }
/**
* 批量删除${functionName}
*
* @param ${pkColumn.javaField}s 需要删除的${functionName}主键
* @return 结果
*/
@Override @Override
public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) {
if(isValid){ if(isValid){

View File

@@ -1,5 +1,6 @@
package com.ruoyi.system.listener; package com.ruoyi.system.listener;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
@@ -9,7 +10,6 @@ import com.ruoyi.common.excel.ExcelListener;
import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.excel.ExcelResult;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ValidatorUtils; import com.ruoyi.common.utils.ValidatorUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.vo.SysUserImportVo; import com.ruoyi.system.domain.vo.SysUserImportVo;
@@ -43,7 +43,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
public SysUserImportListener(Boolean isUpdateSupport) { public SysUserImportListener(Boolean isUpdateSupport) {
String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
this.userService = SpringUtils.getBean(ISysUserService.class); this.userService = SpringUtils.getBean(ISysUserService.class);
this.password = SecurityUtils.encryptPassword(initPassword); this.password = BCrypt.hashpw(initPassword);
this.isUpdateSupport = isUpdateSupport; this.isUpdateSupport = isUpdateSupport;
this.operName = LoginHelper.getUsername(); this.operName = LoginHelper.getUsername();
} }

View File

@@ -35,7 +35,7 @@ public interface SysUserMapper extends BaseMapperPlus<SysUserMapper, SysUser, Sy
List<SysUser> selectUserList(SysUser sysUser); List<SysUser> selectUserList(SysUser sysUser);
/** /**
* 根据条件分页查询已配用户角色列表 * 根据条件分页查询已配用户角色列表
* *
* @param user 用户信息 * @param user 用户信息
* @return 用户信息集合信息 * @return 用户信息集合信息

View File

@@ -67,7 +67,6 @@ public interface ISysConfigService {
* 批量删除参数信息 * 批量删除参数信息
* *
* @param configIds 需要删除的参数ID * @param configIds 需要删除的参数ID
* @return 结果
*/ */
void deleteConfigByIds(Long[] configIds); void deleteConfigByIds(Long[] configIds);

View File

@@ -45,7 +45,6 @@ public interface ISysDictDataService {
* 批量删除字典数据信息 * 批量删除字典数据信息
* *
* @param dictCodes 需要删除的字典数据ID * @param dictCodes 需要删除的字典数据ID
* @return 结果
*/ */
void deleteDictDataByIds(Long[] dictCodes); void deleteDictDataByIds(Long[] dictCodes);

View File

@@ -60,7 +60,6 @@ public interface ISysDictTypeService {
* 批量删除字典信息 * 批量删除字典信息
* *
* @param dictIds 需要删除的字典ID * @param dictIds 需要删除的字典ID
* @return 结果
*/ */
void deleteDictTypeByIds(Long[] dictIds); void deleteDictTypeByIds(Long[] dictIds);

View File

@@ -35,7 +35,7 @@ public interface ISysLogininforService {
* 批量删除系统登录日志 * 批量删除系统登录日志
* *
* @param infoIds 需要删除的登录日志ID * @param infoIds 需要删除的登录日志ID
* @return * @return 结果
*/ */
int deleteLogininforByIds(Long[] infoIds); int deleteLogininforByIds(Long[] infoIds);

View File

@@ -84,7 +84,6 @@ public interface ISysPostService {
* *
* @param postIds 需要删除的岗位ID * @param postIds 需要删除的岗位ID
* @return 结果 * @return 结果
* @throws Exception 异常
*/ */
int deletePostByIds(Long[] postIds); int deletePostByIds(Long[] postIds);

View File

@@ -1,5 +1,6 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
@@ -16,8 +17,8 @@ import com.ruoyi.common.exception.user.UserException;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.redis.RedisUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -68,7 +69,7 @@ public class SysLoginService {
SysUser user = loadUserByUsername(username); SysUser user = loadUserByUsername(username);
if (!SecurityUtils.matchesPassword(password, user.getPassword())) { if (!BCrypt.checkpw(password, user.getPassword())) {
// 是否第一次 // 是否第一次
errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
// 达到规定错误次数 则锁定登录 // 达到规定错误次数 则锁定登录
@@ -104,7 +105,7 @@ public class SysLoginService {
* @param uuid 唯一标识 * @param uuid 唯一标识
*/ */
public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) {
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey); String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey); RedisUtils.deleteObject(verifyKey);
if (captcha == null) { if (captcha == null) {

View File

@@ -1,5 +1,6 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import cn.dev33.satoken.secure.BCrypt;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
@@ -10,8 +11,8 @@ import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException; import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserException; import com.ruoyi.common.exception.user.UserException;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.redis.RedisUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -53,7 +54,7 @@ public class SysRegisterService {
SysUser sysUser = new SysUser(); SysUser sysUser = new SysUser();
sysUser.setUserName(username); sysUser.setUserName(username);
sysUser.setNickName(username); sysUser.setNickName(username);
sysUser.setPassword(SecurityUtils.encryptPassword(password)); sysUser.setPassword(BCrypt.hashpw(password));
sysUser.setUserType(userType); sysUser.setUserType(userType);
boolean regFlag = userService.registerUser(sysUser); boolean regFlag = userService.registerUser(sysUser);
if (!regFlag) { if (!regFlag) {
@@ -71,7 +72,7 @@ public class SysRegisterService {
* @return 结果 * @return 结果
*/ */
public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) {
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey); String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey); RedisUtils.deleteObject(verifyKey);
if (captcha == null) { if (captcha == null) {

View File

@@ -153,7 +153,6 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService {
* 批量删除参数信息 * 批量删除参数信息
* *
* @param configIds 需要删除的参数ID * @param configIds 需要删除的参数ID
* @return 结果
*/ */
@Override @Override
public void deleteConfigByIds(Long[] configIds) { public void deleteConfigByIds(Long[] configIds) {

View File

@@ -60,8 +60,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
if (CollUtil.isEmpty(depts)) { if (CollUtil.isEmpty(depts)) {
return CollUtil.newArrayList(); return CollUtil.newArrayList();
} }
Long parentId = depts.get(0).getParentId(); return TreeBuildUtils.build(depts, (dept, tree) ->
return TreeBuildUtils.build(depts, parentId, (dept, tree) ->
tree.setId(dept.getDeptId()) tree.setId(dept.getDeptId())
.setParentId(dept.getParentId()) .setParentId(dept.getParentId())
.setName(dept.getDeptName()) .setName(dept.getDeptName())

View File

@@ -83,7 +83,6 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
* 批量删除字典数据信息 * 批量删除字典数据信息
* *
* @param dictCodes 需要删除的字典数据ID * @param dictCodes 需要删除的字典数据ID
* @return 结果
*/ */
@Override @Override
public void deleteDictDataByIds(Long[] dictCodes) { public void deleteDictDataByIds(Long[] dictCodes) {

View File

@@ -123,7 +123,6 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
* 批量删除字典类型信息 * 批量删除字典类型信息
* *
* @param dictIds 需要删除的字典ID * @param dictIds 需要删除的字典ID
* @return 结果
*/ */
@Override @Override
public void deleteDictTypeByIds(Long[] dictIds) { public void deleteDictTypeByIds(Long[] dictIds) {

View File

@@ -140,7 +140,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService, Logininf
* 批量删除系统登录日志 * 批量删除系统登录日志
* *
* @param infoIds 需要删除的登录日志ID * @param infoIds 需要删除的登录日志ID
* @return * @return 结果
*/ */
@Override @Override
public int deleteLogininforByIds(Long[] infoIds) { public int deleteLogininforByIds(Long[] infoIds) {

View File

@@ -9,7 +9,7 @@ import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.TreeBuildUtils; import com.ruoyi.common.utils.TreeBuildUtils;
import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.SysRoleMenu;
@@ -99,7 +99,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
@Override @Override
public List<SysMenu> selectMenuTreeByUserId(Long userId) { public List<SysMenu> selectMenuTreeByUserId(Long userId) {
List<SysMenu> menus = null; List<SysMenu> menus = null;
if (SecurityUtils.isAdmin(userId)) { if (LoginHelper.isAdmin(userId)) {
menus = baseMapper.selectMenuTreeAll(); menus = baseMapper.selectMenuTreeAll();
} else { } else {
menus = baseMapper.selectMenuTreeByUserId(userId); menus = baseMapper.selectMenuTreeByUserId(userId);
@@ -181,8 +181,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
if (CollUtil.isEmpty(menus)) { if (CollUtil.isEmpty(menus)) {
return CollUtil.newArrayList(); return CollUtil.newArrayList();
} }
Long parentId = menus.get(0).getParentId(); return TreeBuildUtils.build(menus, (menu, tree) ->
return TreeBuildUtils.build(menus, parentId, (menu, tree) ->
tree.setId(menu.getMenuId()) tree.setId(menu.getMenuId())
.setParentId(menu.getParentId()) .setParentId(menu.getParentId())
.setName(menu.getMenuName()) .setName(menu.getMenuName())

View File

@@ -148,7 +148,6 @@ public class SysPostServiceImpl implements ISysPostService {
* *
* @param postIds 需要删除的岗位ID * @param postIds 需要删除的岗位ID
* @return 结果 * @return 结果
* @throws Exception 异常
*/ */
@Override @Override
public int deletePostByIds(Long[] postIds) { public int deletePostByIds(Long[] postIds) {

View File

@@ -374,7 +374,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
* 批量选择授权用户角色 * 批量选择授权用户角色
* *
* @param roleId 角色ID * @param roleId 角色ID
* @param userIds 需要删除的用户数据ID * @param userIds 需要授权的用户数据ID
* @return 结果 * @return 结果
*/ */
@Override @Override

View File

@@ -2,7 +2,6 @@ package com.ruoyi.system.service.impl;
import com.ruoyi.common.core.service.SensitiveService; import com.ruoyi.common.core.service.SensitiveService;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
@@ -21,7 +20,7 @@ public class SysSensitiveServiceImpl implements SensitiveService {
*/ */
@Override @Override
public boolean isSensitive() { public boolean isSensitive() {
return SecurityUtils.isAdmin(LoginHelper.getUserId()); return LoginHelper.isAdmin();
} }
} }

View File

@@ -26,7 +26,7 @@
<!-- 文件列表 --> <!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> <li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
<el-link :href="`${file.url}`" :underline="false" target="_blank"> <el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span> <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link> </el-link>

View File

@@ -194,7 +194,7 @@ export const dynamicRoutes = [
permissions: ['tool:gen:edit'], permissions: ['tool:gen:edit'],
children: [ children: [
{ {
path: 'index', path: 'index/:tableId(\\d+)',
component: () => import('@/views/tool/gen/editTable'), component: () => import('@/views/tool/gen/editTable'),
name: 'GenEdit', name: 'GenEdit',
meta: { title: '修改生成配置', activeMenu: '/tool/gen' } meta: { title: '修改生成配置', activeMenu: '/tool/gen' }

View File

@@ -31,7 +31,7 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="showFileName" label="文件名" prop="fileName"> <el-form-item v-if="showFileName" label="文件名" prop="fileName">
<el-input v-model="formData.fileName" placeholder="请输入文件名" clearable/> <el-input v-model="formData.fileName" placeholder="请输入文件名" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-form> </el-form>
@@ -41,7 +41,7 @@
<el-button @click="close"> <el-button @click="close">
取消 取消
</el-button> </el-button>
<el-button type="primary" @click="handelConfirm"> <el-button type="primary" @click="handleConfirm">
确定 确定
</el-button> </el-button>
</div> </div>
@@ -79,10 +79,10 @@ export default {
}] }]
} }
}, },
computed: {}, computed: {
watch: {},
mounted() {
}, },
watch: {},
mounted() {},
methods: { methods: {
onOpen() { onOpen() {
if (this.showFileName) { if (this.showFileName) {
@@ -94,7 +94,7 @@ export default {
close(e) { close(e) {
this.$emit('update:visible', false) this.$emit('update:visible', false)
}, },
handelConfirm() { handleConfirm() {
this.$refs.elForm.validate(valid => { this.$refs.elForm.validate(valid => {
if (!valid) return if (!valid) return
this.$emit('confirm', { ...this.formData }) this.$emit('confirm', { ...this.formData })
@@ -104,7 +104,3 @@ export default {
} }
} }
</script> </script>
<style lang="scss" scoped>
</style>

View File

@@ -59,7 +59,7 @@
<div slot="footer"> <div slot="footer">
<el-button <el-button
type="primary" type="primary"
@click="handelConfirm" @click="handleConfirm"
> >
确定 确定
</el-button> </el-button>
@@ -72,9 +72,6 @@
</template> </template>
<script> <script>
import { isNumberStr } from '@/utils/index' import { isNumberStr } from '@/utils/index'
import { getTreeNodeId, saveTreeNodeId } from '@/utils/db'
const id = getTreeNodeId()
export default { export default {
components: {}, components: {},
@@ -82,7 +79,7 @@ export default {
props: [], props: [],
data() { data() {
return { return {
id, id: 100,
formData: { formData: {
label: undefined, label: undefined,
value: undefined value: undefined
@@ -121,9 +118,6 @@ export default {
// eslint-disable-next-line func-names // eslint-disable-next-line func-names
'formData.value': function (val) { 'formData.value': function (val) {
this.dataType = isNumberStr(val) ? 'number' : 'string' this.dataType = isNumberStr(val) ? 'number' : 'string'
},
id(val) {
saveTreeNodeId(val)
} }
}, },
created() {}, created() {},
@@ -139,7 +133,7 @@ export default {
close() { close() {
this.$emit('update:visible', false) this.$emit('update:visible', false)
}, },
handelConfirm() { handleConfirm() {
this.$refs.elForm.validate(valid => { this.$refs.elForm.validate(valid => {
if (!valid) return if (!valid) return
if (this.dataType === 'number') { if (this.dataType === 'number') {
@@ -153,6 +147,3 @@ export default {
} }
} }
</script> </script>
<style lang="scss" scoped>
</style>

View File

@@ -149,7 +149,7 @@ import { beautifierConf, titleCase, deepClone, isObjectObject } from '@/utils/in
import { makeUpHtml, vueTemplate, vueScript, cssStyle } from '@/utils/generator/html' import { makeUpHtml, vueTemplate, vueScript, cssStyle } from '@/utils/generator/html'
import { makeUpJs } from '@/utils/generator/js' import { makeUpJs } from '@/utils/generator/js'
import { makeUpCss } from '@/utils/generator/css' import { makeUpCss } from '@/utils/generator/css'
import drawingDefalut from '@/utils/generator/drawingDefalut' import drawingDefalut from '@/utils/generator/drawingDefault'
import logo from '@/assets/logo/logo.png' import logo from '@/assets/logo/logo.png'
import CodeTypeDialog from './CodeTypeDialog' import CodeTypeDialog from './CodeTypeDialog'
import DraggableItem from './DraggableItem' import DraggableItem from './DraggableItem'

View File

@@ -159,7 +159,7 @@ export default {
}; };
}, },
created() { created() {
const tableId = this.$route.query && this.$route.query.tableId; const tableId = this.$route.params && this.$route.params.tableId;
if (tableId) { if (tableId) {
// 获取表详细信息 // 获取表详细信息
getGenTable(tableId).then(res => { getGenTable(tableId).then(res => {

View File

@@ -322,7 +322,7 @@ export default {
/** 修改按钮操作 */ /** 修改按钮操作 */
handleEditTable(row) { handleEditTable(row) {
const tableId = row.tableId || this.ids[0]; const tableId = row.tableId || this.ids[0];
this.$router.push({ path: '/tool/gen-edit/index', query: { tableId: tableId, pageNum: this.queryParams.pageNum } }); this.$router.push({ path: '/tool/gen-edit/index/' + tableId, query: { pageNum: this.queryParams.pageNum } });
}, },
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {