farm模块-用户及角色关联,级联删除

This commit is contained in:
顾君禹
2025-08-29 16:37:12 +08:00
parent 04f1ec8c80
commit 9c1f16842b
11 changed files with 180 additions and 24 deletions

View File

@@ -307,12 +307,9 @@ public class DictController {
@Operation(summary = "字典数据维护-下拉框列表-二级物种类别") @Operation(summary = "字典数据维护-下拉框列表-二级物种类别")
@GetMapping("/list/two-library") @GetMapping("/list/two-library")
public CommonResult<List<SpeciesClassifyLibraryRespVO>> getTwoLibraryList() { public CommonResult<List<SpeciesThreeLevelTreeRespVO>> getTwoLibraryList() {
try { try {
// 获取物种类别字典数据 List<SpeciesThreeLevelTreeRespVO> twoList = speciesLibraryService.getSpeciesTwoLevelTree();
List<SysDictDO> dictList = sysDictService.getByTypeCode(CommonConstants.DICT_TYPE_CODE_3);
// 使用工具类构建二级树结构
List<SpeciesClassifyLibraryRespVO> twoList = TreeStructureUtil.buildTwoLevelTree(dictList);
return success(twoList); return success(twoList);
} catch (Exception e) { } catch (Exception e) {
log.error("获取二级物种类别列表失败", e); log.error("获取二级物种类别列表失败", e);

View File

@@ -24,6 +24,7 @@ import java.io.IOException;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 人员管理") @Tag(name = "管理后台 - 人员管理")
@@ -38,7 +39,12 @@ public class PersonnelManagementController {
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建人员管理") @Operation(summary = "创建人员管理")
public CommonResult<String> createPersonnelManagement(@Valid @RequestBody PersonnelManagementSaveReqVO createReqVO) { public CommonResult<String> createPersonnelManagement(@Valid @RequestBody PersonnelManagementSaveReqVO createReqVO) {
return success(personnelManagementService.createPersonnelManagement(createReqVO)); String management = personnelManagementService.createPersonnelManagement(createReqVO);
if (management.length() > 0) {
return success(management);
} else {
return error(501,"手机号重复!");
}
} }
@PutMapping("/reset") @PutMapping("/reset")

View File

@@ -8,7 +8,9 @@ import jakarta.validation.Valid;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -24,6 +26,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -44,14 +47,12 @@ public class PlotInfoController {
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建地块") @Operation(summary = "创建地块")
public CommonResult<String> createPlotInfo(@Valid @RequestBody PlotInfoSaveReqVO createReqVO) { public CommonResult<String> createPlotInfo(@Valid @RequestBody PlotInfoSaveReqVO createReqVO) {
return success(plotInfoService.createPlotInfo(createReqVO)); return success(plotInfoService.createPlotInfo(createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新地块") @Operation(summary = "更新地块")
public CommonResult<Boolean> updatePlotInfo(@Valid @RequestBody PlotInfoSaveReqVO updateReqVO) { public CommonResult<Boolean> updatePlotInfo(@Valid @RequestBody PlotInfoSaveReqVO updateReqVO) {
plotInfoService.updatePlotInfo(updateReqVO); plotInfoService.updatePlotInfo(updateReqVO);
return success(true); return success(true);
@@ -60,7 +61,6 @@ public class PlotInfoController {
@DeleteMapping("/delete") @DeleteMapping("/delete")
@Operation(summary = "删除地块") @Operation(summary = "删除地块")
@Parameter(name = "id", description = "编号", required = true) @Parameter(name = "id", description = "编号", required = true)
public CommonResult<Boolean> deletePlotInfo(@RequestParam("id") String id) { public CommonResult<Boolean> deletePlotInfo(@RequestParam("id") String id) {
plotInfoService.deletePlotInfo(id); plotInfoService.deletePlotInfo(id);
return success(true); return success(true);
@@ -69,7 +69,6 @@ public class PlotInfoController {
@DeleteMapping("/delete-list") @DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true) @Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除地块") @Operation(summary = "批量删除地块")
public CommonResult<Boolean> deletePlotInfoList(@RequestParam("ids") List<String> ids) { public CommonResult<Boolean> deletePlotInfoList(@RequestParam("ids") List<String> ids) {
plotInfoService.deletePlotInfoListByIds(ids); plotInfoService.deletePlotInfoListByIds(ids);
return success(true); return success(true);
@@ -78,7 +77,6 @@ public class PlotInfoController {
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得地块") @Operation(summary = "获得地块")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<PlotInfoRespVO> getPlotInfo(@RequestParam("id") String id) { public CommonResult<PlotInfoRespVO> getPlotInfo(@RequestParam("id") String id) {
PlotInfoDO plotInfo = plotInfoService.getPlotInfo(id); PlotInfoDO plotInfo = plotInfoService.getPlotInfo(id);
return success(BeanUtils.toBean(plotInfo, PlotInfoRespVO.class)); return success(BeanUtils.toBean(plotInfo, PlotInfoRespVO.class));
@@ -86,7 +84,6 @@ public class PlotInfoController {
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得地块分页") @Operation(summary = "获得地块分页")
public CommonResult<PageResult<PlotInfoRespVO>> getPlotInfoPage(@Valid PlotInfoPageReqVO pageReqVO) { public CommonResult<PageResult<PlotInfoRespVO>> getPlotInfoPage(@Valid PlotInfoPageReqVO pageReqVO) {
PageResult<PlotInfoDO> pageResult = plotInfoService.getPlotInfoPage(pageReqVO); PageResult<PlotInfoDO> pageResult = plotInfoService.getPlotInfoPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PlotInfoRespVO.class)); return success(BeanUtils.toBean(pageResult, PlotInfoRespVO.class));
@@ -94,15 +91,14 @@ public class PlotInfoController {
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出地块 Excel") @Operation(summary = "导出地块 Excel")
@ApiAccessLog(operateType = EXPORT) @ApiAccessLog(operateType = EXPORT)
public void exportPlotInfoExcel(@Valid PlotInfoPageReqVO pageReqVO, public void exportPlotInfoExcel(@Valid PlotInfoPageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PlotInfoDO> list = plotInfoService.getPlotInfoPage(pageReqVO).getList(); List<PlotInfoDO> list = plotInfoService.getPlotInfoPage(pageReqVO).getList();
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "地块.xls", "数据", PlotInfoRespVO.class, ExcelUtils.write(response, "地块.xls", "数据", PlotInfoRespVO.class,
BeanUtils.toBean(list, PlotInfoRespVO.class)); BeanUtils.toBean(list, PlotInfoRespVO.class));
} }
} }

View File

@@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
@TableName("system_user_role")
@KeySequence("system_user_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SystemUserRoleDO extends BaseDO {
/**
* 自增主键
*/
@TableId
private Long id;
/**
* 用户 ID
*/
private Long userId;
/**
* 角色 ID
*/
private Long roleId;
}

View File

@@ -0,0 +1,9 @@
package cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.SystemUserRoleDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemUserRoleMapper extends BaseMapperX<SystemUserRoleDO> {
}

View File

@@ -9,8 +9,10 @@ import cn.iocoder.yudao.module.farm.controller.admin.personnelmanagement.vo.Pers
import cn.iocoder.yudao.module.farm.controller.admin.personnelmanagement.vo.PersonnelManagementSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.personnelmanagement.vo.PersonnelManagementSaveReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.PersonnelManagementDO; import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.PersonnelManagementDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.SystemUserDO; import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.SystemUserDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.SystemUserRoleDO;
import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.PersonnelManagementMapper; import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.PersonnelManagementMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.SystemUserMapper; import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.SystemUserMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.SystemUserRoleMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
@@ -38,15 +40,21 @@ public class PersonnelManagementServiceImpl implements PersonnelManagementServic
private SystemUserMapper userMapper; private SystemUserMapper userMapper;
@Resource @Resource
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
@Resource
private SystemUserRoleMapper systemUserRoleMapper;
@Override @Override
public String createPersonnelManagement(PersonnelManagementSaveReqVO createReqVO) { public String createPersonnelManagement(PersonnelManagementSaveReqVO createReqVO) {
LoginUser user = getLoginUser(); LoginUser user = getLoginUser();
// 插入 // 插入
PersonnelManagementDO personnelManagement = BeanUtils.toBean(createReqVO, PersonnelManagementDO.class); PersonnelManagementDO personnelManagement = BeanUtils.toBean(createReqVO, PersonnelManagementDO.class);
personnelManagement.setId(IdUtil.fastUUID()); personnelManagement.setId(IdUtil.fastUUID());
personnelManagement.setTenantId(String.valueOf(user.getTenantId())); personnelManagement.setTenantId(String.valueOf(user.getTenantId()));
SystemUserDO userDO = userMapper.selectByPhone(personnelManagement.getPhone());
if (userDO != null) {
return "";
}
// 处理图片集合转换 // 处理图片集合转换
handleImageConversion(personnelManagement, createReqVO); handleImageConversion(personnelManagement, createReqVO);
@@ -59,7 +67,14 @@ public class PersonnelManagementServiceImpl implements PersonnelManagementServic
adminUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 adminUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
String substring = personnelManagement.getPhone().substring(personnelManagement.getPhone().length() - 6); String substring = personnelManagement.getPhone().substring(personnelManagement.getPhone().length() - 6);
adminUserDO.setPassword(encodePassword(substring)); // 加密密码 adminUserDO.setPassword(encodePassword(substring)); // 加密密码
userMapper.insert(adminUserDO); userMapper.insert(adminUserDO);// 系统用户同步新增
// 用户角色关联
for (String s : personnelManagement.getRole().split(",")) {
SystemUserRoleDO userRoleDO = new SystemUserRoleDO();
userRoleDO.setUserId(adminUserDO.getId());
userRoleDO.setRoleId(Long.valueOf(s));
systemUserRoleMapper.insert(userRoleDO);
}
personnelManagementMapper.insert(personnelManagement); personnelManagementMapper.insert(personnelManagement);
// 返回 // 返回
return personnelManagement.getId(); return personnelManagement.getId();
@@ -69,12 +84,25 @@ public class PersonnelManagementServiceImpl implements PersonnelManagementServic
public void updatePersonnelManagement(PersonnelManagementSaveReqVO updateReqVO) { public void updatePersonnelManagement(PersonnelManagementSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validatePersonnelManagementExists(updateReqVO.getId()); validatePersonnelManagementExists(updateReqVO.getId());
PersonnelManagementDO managementDO = personnelManagementMapper.selectById(updateReqVO.getId());
// 更新 // 更新
PersonnelManagementDO updateObj = BeanUtils.toBean(updateReqVO, PersonnelManagementDO.class); PersonnelManagementDO updateObj = BeanUtils.toBean(updateReqVO, PersonnelManagementDO.class);
SystemUserDO userDO = userMapper.selectByPhone(managementDO.getPhone());
if (updateReqVO.getPhone() != null) userDO.setUsername(updateReqVO.getPhone());
if (updateReqVO.getName() != null) userDO.setNickname(updateReqVO.getName());
if (updateReqVO.getPhone() != null) userDO.setMobile(updateReqVO.getPhone());
if (updateReqVO.getPicture() != null) userDO.setAvatar(updateReqVO.getPicture());
// 处理图片集合转换 // 处理图片集合转换
handleImageConversion(updateObj, updateReqVO); handleImageConversion(updateObj, updateReqVO);
for (String s : managementDO.getRole().split(",")) {
SystemUserRoleDO userRoleDO = new SystemUserRoleDO();
userRoleDO.setUserId(userDO.getId());
userRoleDO.setRoleId(Long.valueOf(s));
systemUserRoleMapper.insert(userRoleDO);
}
userMapper.updateById(userDO);
personnelManagementMapper.updateById(updateObj); personnelManagementMapper.updateById(updateObj);
} }
@@ -82,6 +110,10 @@ public class PersonnelManagementServiceImpl implements PersonnelManagementServic
public void deletePersonnelManagement(String id) { public void deletePersonnelManagement(String id) {
// 校验存在 // 校验存在
validatePersonnelManagementExists(id); validatePersonnelManagementExists(id);
PersonnelManagementDO managementDO = personnelManagementMapper.selectById(id);
SystemUserDO userDO = userMapper.selectByPhone(managementDO.getPhone());
userMapper.deleteById(userDO.getId());
systemUserRoleMapper.delete(SystemUserRoleDO::getUserId, userDO.getId());
// 删除 // 删除
personnelManagementMapper.deleteById(id); personnelManagementMapper.deleteById(id);
} }

View File

@@ -69,11 +69,11 @@ public interface SpeciesLibraryService {
*/ */
Map<String, String> getSpeciesLibraryForLifeCycMap(); Map<String, String> getSpeciesLibraryForLifeCycMap();
/**
* 基于 speciesName1 -> speciesName2 -> cultivarName 构建三级树
*/
List<SpeciesThreeLevelTreeRespVO> getSpeciesThreeLevelTree(); List<SpeciesThreeLevelTreeRespVO> getSpeciesThreeLevelTree();
List<SpeciesThreeLevelTreeRespVO> getSpeciesTwoLevelTree();
/** /**
* 物种与模型 * 物种与模型
* @return * @return

View File

@@ -305,6 +305,67 @@ public class SpeciesLibraryServiceImpl implements SpeciesLibraryService {
return result; return result;
} }
@Override
public List<SpeciesThreeLevelTreeRespVO> getSpeciesTwoLevelTree() {
List<TwoDictTreeRespVO> dictTree = twoDictService.getTwoDictTree();
if (dictTree == null || dictTree.isEmpty()) {
return new ArrayList<>();
}
// 1级:parentId == null 的节点
List<TwoDictTreeRespVO> level1Nodes = dictTree.stream()
.filter(n -> n != null && n.getParentId() == null)
.sorted(java.util.Comparator.comparing(TwoDictTreeRespVO::getName, java.util.Comparator.nullsLast(String::compareTo)))
.collect(Collectors.toList());
// 收集所有二级分类ID,一次性查询物种,避免 N+1
List<Long> level2Ids = dictTree.stream()
.filter(n -> n != null && n.getParentId() != null) // 非根即二级(在当前两级分类中)
.map(TwoDictTreeRespVO::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 批量查询所有二级分类下的物种,避免 N+1 查询
Map<String, List<SpeciesLibraryDO>> categoryToSpeciesMap;
if (level2Ids.isEmpty()) {
categoryToSpeciesMap = java.util.Collections.emptyMap();
} else {
// 构建查询条件:查询所有二级分类下的物种
LambdaQueryWrapper<SpeciesLibraryDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SpeciesLibraryDO::getCategory, level2Ids.stream().map(String::valueOf).collect(Collectors.toList()));
queryWrapper.eq(SpeciesLibraryDO::getTenantId, String.valueOf(getLoginUser().getTenantId()));
List<SpeciesLibraryDO> allSpecies = speciesLibraryMapper.selectList(queryWrapper);
// 按分类ID分组
categoryToSpeciesMap = allSpecies.stream()
.collect(Collectors.groupingBy(SpeciesLibraryDO::getCategory));
}
List<SpeciesThreeLevelTreeRespVO> result = new ArrayList<>();
for (TwoDictTreeRespVO lvl1 : level1Nodes) {
SpeciesThreeLevelTreeRespVO lvl1Vo = new SpeciesThreeLevelTreeRespVO();
lvl1Vo.setName(lvl1.getName());
lvl1Vo.setId(lvl1.getId().toString());
List<SpeciesThreeLevelTreeRespVO> lvl2Vos = new ArrayList<>();
if (lvl1.getChildren() != null && !lvl1.getChildren().isEmpty()) {
// 二级按名称排序
List<TwoDictTreeRespVO> lvl2Children = new ArrayList<>(lvl1.getChildren());
lvl2Children.sort(java.util.Comparator.comparing(TwoDictTreeRespVO::getName, java.util.Comparator.nullsLast(String::compareTo)));
for (TwoDictTreeRespVO lvl2 : lvl2Children) {
SpeciesThreeLevelTreeRespVO lvl2Vo = new SpeciesThreeLevelTreeRespVO();
lvl2Vo.setName(lvl2.getName());
lvl2Vo.setId(lvl2.getId().toString());
lvl2Vos.add(lvl2Vo);
}
}
lvl1Vo.setChildren(lvl2Vos);
result.add(lvl1Vo);
}
return result;
}
private String splitSpeciesName(String speciesName, int index) { private String splitSpeciesName(String speciesName, int index) {
if (speciesName == null) { if (speciesName == null) {
return ""; return "";

View File

@@ -7,4 +7,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface PersonnelMapper extends BaseMapperX<PersonnelDO> { public interface PersonnelMapper extends BaseMapperX<PersonnelDO> {
default PersonnelDO selectByPhone(String mobile) {
return selectOne(PersonnelDO::getPhone, mobile);
}
} }

View File

@@ -176,6 +176,27 @@ public class AdminUserServiceImpl implements AdminUserService {
// 2.1 更新用户 // 2.1 更新用户
AdminUserDO updateObj = BeanUtils.toBean(updateReqVO, AdminUserDO.class); AdminUserDO updateObj = BeanUtils.toBean(updateReqVO, AdminUserDO.class);
userMapper.updateById(updateObj); userMapper.updateById(updateObj);
AdminUserDO adminUserDO = userMapper.selectById(updateObj.getId());
PersonnelDO userDo = personnelMapper.selectByPhone(adminUserDO.getMobile());
if (updateObj.getNickname() != null) userDo.setName(updateObj.getNickname());
if (updateObj.getMobile() != null) userDo.setPhone(updateObj.getMobile());
if (updateObj.getDeptId() != null) userDo.setDepartment(updateObj.getDeptId().toString());
if (updateObj.getTenantId() != null) userDo.setTenantId(updateObj.getTenantId().toString());
if (updateObj.getAvatar() != null) userDo.setPicture(updateObj.getAvatar());
userDo.setAccountStatus(0);
List<UserPostDO> userPostDOS = convertList(updateObj.getPostIds(),
postId -> new UserPostDO().setUserId(updateObj.getId()).setPostId(postId));
String roles = "";
for (UserPostDO up : userPostDOS) {
if (roles.length() > 0) {
roles += "," + up.getPostId();
} else {
roles = up.getPostId().toString();
}
}
userDo.setRole(roles);
personnelMapper.updateById(userDo);
// 2.2 更新岗位 // 2.2 更新岗位
updateUserPost(updateReqVO, updateObj); updateUserPost(updateReqVO, updateObj);
@@ -262,7 +283,8 @@ public class AdminUserServiceImpl implements AdminUserService {
public void deleteUser(Long id) { public void deleteUser(Long id) {
// 1. 校验用户存在 // 1. 校验用户存在
AdminUserDO user = validateUserExists(id); AdminUserDO user = validateUserExists(id);
AdminUserDO adminUserDO = userMapper.selectById(id);
personnelMapper.delete(PersonnelDO::getPhone, adminUserDO.getMobile());
// 2.1 删除用户 // 2.1 删除用户
userMapper.deleteById(id); userMapper.deleteById(id);
// 2.2 删除用户关联数据 // 2.2 删除用户关联数据

View File

@@ -108,7 +108,7 @@ aj:
cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
type: blockPuzzle # 验证码类型 default 三种都实例化。blockPuzzle 滑块拼图、clickWord 文字点选、pictureWord 文本输入 type: blockPuzzle # 验证码类型 default 三种都实例化。blockPuzzle 滑块拼图、clickWord 文字点选、pictureWord 文本输入
water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode water-mark: 江西云戈 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode
interference-options: 0 # 滑动干扰项(0/1/2) interference-options: 0 # 滑动干扰项(0/1/2)
req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定 req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定