给会员等级分配数据权益 (前后端)

文章详细描述了前端如何通过API获取部门树结构数据,并根据角色ID设置选中项,同时展示了后端Java代码部分,包括获取会员权益树列表和查询权益树结构的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体架构流程

一:完成效果图展示

分配权益对话框

二: 先看看前端是如何实现的

handleMemberRight(row) {
  const levelId = row.levelId; // 获取行的 levelId 属性

  // 重置操作
  this.reset();

  // 获取部门树结构数据并赋值给 deptTreeSelect
  const deptTreeSelect = this.getDeptTree(levelId);

  // 根据 levelId 获取角色信息并处理响应
  getLevel(levelId).then(response => {
    this.form = response.data; // 将响应数据赋值给表单
    this.openDataScope = true; // 打开数据范围选项
    this.$nextTick(() => {
      deptTreeSelect.then(res => {
        this.$refs.dept.setCheckedKeys(res.checkedKeys); // 设置部门树的选中项
      });
    });
    this.title = "分配数据权限"; // 设置标题
  });
},

/** 
 * 根据角色ID查询部门树结构
 * @param {number} levelId - 角色的 levelId
 * @returns {Promise} - 包含部门树结构数据的 Promise 对象
 */
getDeptTree(levelId) {
  // 调用部门树结构查询函数并处理响应
  return deptTreeSelect(levelId).then(response => {
    this.deptOptions = response.depts; // 将部门数据赋值给 deptOptions
    return response; // 返回响应数据
  });
},

// 根据角色ID查询部门树结构
	export function deptTreeSelect(levelId) {
	  return request({
	    url: '/jskj/level/deptTree/' + levelId,
	    method: 'get'
	  })
	}


	export function getLevel(levelId) {
	  return request({
	    url: '/jskj/level/' + levelId,
	    method: 'get'
	  })
	}

三:后端代码

/**
 * 获取对应会员权益树列表
 * @param levelId 会员权益等级的ID
 * @return 包含树结构和选中项的AjaxResult
 */
@GetMapping(value = "/deptTree/{levelId}")
public AjaxResult deptTree(@PathVariable("levelId") Long levelId)
{
    // 创建一个成功的AjaxResult对象
    AjaxResult ajax = AjaxResult.success();
    
    // 将选中项的数据加入AjaxResult中
    ajax.put("checkedKeys", memberDetailNavService.selectDeptListBylevelId(levelId));
    
    // 将部门树结构的数据加入AjaxResult中
    ajax.put("depts", memberDetailNavService.selectDeptTreeList(levelId));
    
    // 返回AjaxResult对象
    return ajax;
}


	

	/**
     * 查询权益树结构信息
     *
     * @param
     * @return 部门树信息集合
     */
    @Override
    public List<TreeSelect>
    selectDeptTreeList(Long levelId) {
	    // 查询数据库以获取会员权益树结构的数据
	    List<MemberDetail> deptTreeList = memberDetailNavMapper.selectDeptTreeList(levelId);
	    
	    // 构建下拉树结构并返回结果
	    return buildDeptTreeSelect(deptTreeList);
    }

 
	/**
     * 构建前端所需要下拉树结构
     *
     * @param detailList 部门列表
     * @return 下拉树结构列表
     */
    @Override
    public List<TreeSelect> buildDeptTreeSelect(List<MemberDetail> detailList)
    {
        // 使用构建树结构的方法,将部门列表转换为树结构
    	List<MemberDetail> deptTrees = buildDeptTree(detailList);
    
    	// 将树结构的部门列表转换为下拉树结构,并返回结果
    	return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
    }


	/**
     * 构建前端所需要树结构
     *
     * @param depts 部门列表
     * @return 树结构列表
     */
    @Override
    public List<MemberDetail> buildDeptTree(List<MemberDetail> depts)
    {
        // 创建一个用于存储树结构的列表
    	List<MemberDetail> returnList = new ArrayList<MemberDetail>();
    
    	// 创建一个临时列表,包含所有部门的ID
    	List<Integer> tempList = depts.stream().map(MemberDetail::getId)
    	.collect(Collectors.toList());
    
    	// 遍历部门列表,查找顶级节点并构建树结构
    	for (MemberDetail dept : depts)
   	    {
	        // 如果当前部门不是其他部门的父节点,说明它是一个顶级节点
	        if (!tempList.contains(dept.getParentId()))
	        {
	            // 递归遍历所有子节点,并将它们添加到树结构中
	            recursionFn(depts, dept);
	            
	            // 将当前顶级节点添加到树结构列表中
	            returnList.add(dept);
	        }
	    }
    
	    // 如果树结构列表为空,则使用原始部门列表
	    if (returnList.isEmpty())
	    {
	        returnList = depts;
	    }
	    
	    // 返回构建好的树结构列表
	    return returnList;
	}
	/**
     * 递归列表
     */
    private void recursionFn(List<MemberDetail> list, MemberDetail t)
    {
        // 得到子节点列表
    	List<MemberDetail> childList = getChildList(list, t);
    
   	 	// 将子节点列表设置为当前部门的子节点
   	 	t.setChildren(childList);
    
    	// 遍历子节点,继续递归处理子节点的子节点
    	for (MemberDetail tChild : childList)
    	{
        	// 如果子节点仍然有子节点,继续递归处理
        	if (hasChild(list, tChild))
        	{
           	 	recursionFn(list, tChild);
        	}
    	}
    }

	/**
     * 得到子节点列表
     */
    private List<MemberDetail> getChildList(List<MemberDetail> list, MemberDetail t)
    {
       // 创建一个用于存储子节点的列表
    	List<MemberDetail> tlist = new ArrayList<MemberDetail>();
    
    	// 使用迭代器遍历部门列表
    	Iterator<MemberDetail> it = list.iterator();
    	while (it.hasNext())
    	{
       	 	MemberDetail n = (MemberDetail) it.next();
        
        	// 检查部门的父节点是否与当前部门的ID匹配
        	if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue())
        	{
           	 	// 如果匹配,将部门添加到子节点列表中
            	tlist.add(n);
        	}
    	}
    
    	// 返回子节点列表
   	 	return tlist;
	}
	/**
	 * 判断是否有子节点
	 */
	private boolean hasChild(List<MemberDetail> list, MemberDetail t)
	{
	    // 判断当前部门是否有子节点,如果子节点列表的大小大于0,则返回 true,否则返回 false
    	return getChildList(list, t).size() > 0 ? true : false;
	}
   <!-- selectDeptTreeList 查询语句 -->
	<select id="selectDeptTreeList" parameterType="Long" resultMap="MemberDetailResult">
	    <!-- 引用名为 selectMemberDetailVo 的查询模板 -->
	    <include refid="selectMemberDetailVo"/>
	</select>
	
	<!-- selectDeptListBylevelId 查询语句 -->
	<select id="selectDeptListBylevelId" resultType="Long">
	    <!-- 查询部门的 right_id 字段 -->
	    select d.right_id
	    from jskj_level_right d
	    left join jsky_level_right_relation rd on d.right_id = rd.right_id
	    where rd.level_id = #{levelId}
	        and d.right_id not in (select d.parent_id from jskj_level_right d inner join jsky_level_right_relation rd on d.right_id = rd.right_id
	            and rd.level_id = #{levelId})
	    order by d.parent_id
	</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值