字典功能 #5

Closed
jiangdingxuan wants to merge 9 commits from rzdata:feature/dict into main
5 changed files with 125 additions and 3 deletions
Showing only changes of commit 8eebf7e94c - Show all commits

View File

@ -0,0 +1,29 @@
package net.rzdata.demo.trait;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class GetReq<T> {
private Integer pageSize = 15;
private Integer pageNum = 1;
private String orderBy;
private Boolean asc = true;
public IPage<T> into() {
Page<T> page = new Page<>();
page.setSize(pageSize);
page.setCurrent(pageNum - 1);
if (orderBy != null) {
page.addOrder(this.asc ? OrderItem.asc(orderBy) : OrderItem.desc(orderBy));
}
return page;
}
}

View File

@ -1,11 +1,16 @@
package net.rzdata.demo.dict; package net.rzdata.demo.dict;
import com.baomidou.mybatisplus.core.metadata.IPage;
import net.rzdata.demo.dict.domain.AddDictReq; import net.rzdata.demo.dict.domain.AddDictReq;
import net.rzdata.demo.dict.domain.Dict; import net.rzdata.demo.dict.domain.Dict;
import net.rzdata.demo.dict.domain.GetDictTypeListReq;
import net.rzdata.demo.dict.domain.UpdateDictReq; import net.rzdata.demo.dict.domain.UpdateDictReq;
import net.rzdata.domain.Id; import net.rzdata.domain.Id;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.List;
@RestController @RestController
@RequestMapping("/dict") @RequestMapping("/dict")
public class DictController { public class DictController {
@ -16,6 +21,11 @@ public class DictController {
this.dictService = dictService; this.dictService = dictService;
} }
/**
* 新增字典
* @param req 新增字典请求
* @return 新增字典的ID
*/
@PostMapping() @PostMapping()
public Id addDict(@RequestBody AddDictReq req) { public Id addDict(@RequestBody AddDictReq req) {
Dict dict = req.into(); Dict dict = req.into();
@ -27,10 +37,49 @@ public class DictController {
return Id.of(dict.getId()); return Id.of(dict.getId());
} }
/**
* 更新字典
* @param req 更新字典请求
* @return 字典的ID
*/
@PutMapping() @PutMapping()
public Id updateDict(@RequestBody UpdateDictReq req) { public Id updateDict(@RequestBody UpdateDictReq req) {
Dict dict = req.into(); Dict dict = req.into();
dictService.updateDict(dict); dictService.updateDict(dict);
return Id.of(dict.getId()); return Id.of(dict.getId());
} }
/**
* 获取字典类型列表
* @param req 获取字典类型列表请求
* @return 字典类型列表分页
*/
@GetMapping("/type")
public IPage<Dict> getDictTypePage(@RequestParam GetDictTypeListReq req) {
return dictService.getDictTypePage(req);
}
/**
* 获取字典树
* @param parentId 父ID
* @param level 层级
* @return 字典树
*/
@GetMapping("/tree")
public List<Dict> getDictTree(
@RequestParam(required = false, defaultValue = "0") String parentId,
@RequestParam(required = false, defaultValue = "-1") Integer level
) {
return dictService.getDictTreeTopDown(Collections.singleton(parentId), level);
}
/**
* 获取字典数据
* @param type 字典类型
* @return 字典数据
*/
@GetMapping("/data/{type}")
public List<Dict> getDictData(@PathVariable String type) {
return dictService.getDictByType(type);
}
} }

View File

@ -1,14 +1,15 @@
package net.rzdata.demo.dict; package net.rzdata.demo.dict;
import com.baomidou.mybatisplus.core.metadata.IPage;
import net.rzdata.demo.dict.domain.Dict; import net.rzdata.demo.dict.domain.Dict;
import net.rzdata.demo.dict.domain.GetDictTypeListReq;
import net.rzdata.demo.dict.mapper.DictRepository; import net.rzdata.demo.dict.mapper.DictRepository;
import net.rzdata.exception.NotExistDataException; import net.rzdata.exception.NotExistDataException;
import net.rzdata.exception.RepeatDataException; import net.rzdata.exception.RepeatDataException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.*;
import java.util.Objects; import java.util.stream.Collectors;
import java.util.Optional;
@Service @Service
public class DictService { public class DictService {
@ -43,6 +44,30 @@ public class DictService {
} }
} }
protected IPage<Dict> getDictTypePage(GetDictTypeListReq req) {
return dictRepository.getDictTypePage(req);
}
protected List<Dict> getDictTreeTopDown(Collection<String> parentId, int level) {
if (level == 0 || level < Byte.MIN_VALUE) {
return Collections.emptyList();
} else if (parentId.isEmpty()) {
return Collections.emptyList();
}
List<Dict> children = dictRepository.findByParentIdIn(parentId);
Set<String> childIds = children.parallelStream()
.map(Dict::getId)
.collect(Collectors.toSet());
List<Dict> grandchildren = getDictTreeTopDown(childIds, level);
for (Dict child : children) {
List<Dict> grandchild = grandchildren.parallelStream()
.filter(g -> Objects.equals(g.getParentId(), child.getId()))
.toList();
child.setChildren(grandchild);
}
return children;
}
private Optional<Dict> getDictByTypeAndValue(String type, String value) { private Optional<Dict> getDictByTypeAndValue(String type, String value) {
List<Dict> dictList = this.getDictByType(type); List<Dict> dictList = this.getDictByType(type);
return dictList.parallelStream() return dictList.parallelStream()

View File

@ -0,0 +1,6 @@
package net.rzdata.demo.dict.domain;
import net.rzdata.demo.trait.GetReq;
public class GetDictTypeListReq extends GetReq<Dict> {
}

View File

@ -2,10 +2,13 @@ package net.rzdata.demo.dict.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import net.rzdata.demo.dict.domain.Dict; import net.rzdata.demo.dict.domain.Dict;
import net.rzdata.demo.dict.domain.GetDictTypeListReq;
import net.rzdata.demo.trait.BaseRepository; import net.rzdata.demo.trait.BaseRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.List; import java.util.List;
@Repository @Repository
@ -28,4 +31,14 @@ public class DictRepository extends BaseRepository<Dict, DictMapper> {
.eq(Dict::getType, oldValue) .eq(Dict::getType, oldValue)
); );
} }
public List<Dict> findByParentIdIn(Collection<String> parentId) {
return this.get().selectList(new LambdaQueryWrapper<Dict>()
.in(Dict::getParentId, parentId)
);
}
public IPage<Dict> getDictTypePage(GetDictTypeListReq req) {
return this.get().selectPage(req.into(), new LambdaQueryWrapper<>());
}
} }