思路:
1、上移,下移,置底,置顶是根据数据库表中 sort 关键字进行排序。
2、上移:查出比当前对象sort小的一条数据(lowerSort),交换两个sort。
3、下移:查出比当前对象sort大的一条数据(upperSort),交换两个sort。
4、置顶:查出当前层级中sort最小的一条数据(minSort),将当前sort设为min(sort)- 1。
5、置底:查出当前层级中sort最大的一条数据(maxSort),将当前sort设为max(sort)+ 1
sql实现:
<select id="selectSortUp">
SELECT
<include refid="allColumns"/>
FROM dir_
WHERE deleted_ = 0
AND parent_id_ = #{parentId,jdbcType=BIGINT}
<![CDATA[ AND sort_ < #{sort,jdbcType=INTEGER} ]]>
order by sort_ desc
LIMIT 1
</select>
<select id="selectSortDown" >
SELECT
<include refid="allColumns"/>
FROM dir_
WHERE deleted_ = 0
AND parent_id_ = #{parentId,jdbcType=BIGINT}
<![CDATA[ AND sort_ > #{sort,jdbcType=INTEGER} ]]>
order by sort_
LIMIT 1
</select>
<select id="selectMinSort" >
SELECT
<include refid="allColumns"/>
from dir_
where (parent_id_, sort_) in (
SELECT parent_id_, MIN(sort_)
FROM dir_
WHERE deleted_ = 0
AND parent_id_ = #{parentId,jdbcType=BIGINT}
group BY parent_id_)
order by update_time_ LIMIT 1
</select>
<select id="selectMaxSort" >
SELECT
<include refid="allColumns"/>
from dir_
where (parent_id_, sort_) in (
SELECT parent_id_, MAX(sort_)
FROM dir_
WHERE deleted_ = 0
AND parent_id_ = #{parentId,jdbcType=BIGINT}
group BY parent_id_)
order by update_time_ LIMIT 1
</select>
dao层
public dirVO selectMaxSort(Long parentId);
public dirVO selectMinSort(Long parentId);
public dirVO selectSortUp(Long parentId,Integer sort);
public dirVO selectSortDown(Long parentId,Integer sort);
service层
//上移操作,下移同理
public DirVO moveUpDir(DirVO dirVO) {
//获取比当前sort小的一位
DirVO lowerDir = dirMapper.selectSortUp(dirVO.getParentId(), dirVO.getSort());
if (lowerDir == null) {
// 为空结果为空,说明当前DirSort最小,返回自身
return dirVO;
}
//lowerSort大小
Integer lowerDirSort = lowerDir.getSort();
//当前sort大小
Integer localDirSort = dirVO.getSort();
//交换
dirVO.setSort(lowerDirSort);
lowerDir.setSort(localDirSort);
updateSort(dirVO.getId(), dirVO.getSort());
updateSort(lowerDir.getId(), lowerDir.getSort());
return dirVO;
}
//置顶操作,置底同理
public DirVO topDir(DirVO dirVO) {
DirVO minDir = dirMapper.selectMinSort(dirVO.getParentId());
if(minDir == null){
//若父节点下没子节点,返回自身
return dirVO;
}
//置顶
dirVO.setSort(minDir.getSort() - 1);
updateSort(dirVO.getId(), dirVO.getSort());
return dirVO;
}