Java后台返回实现前端树形结构数据

java后端返回树形数据 java返回树形数据给前端 阅读详情

Java后台如何返回实现前端树形结构数据:

1.步(必须这样写):

package com.zhecre.jx.business.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 该类为树形结构的泛型类,所有使用TreeUtil的List集合中泛型都需要继承该类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseTreeNode<T> {
    /**
     * 子Id
     */
    private String indexid;

    private String indexname;//指标名字
    /**
     * 父ID ,若parentId等于0 或者null,表示为顶级
     */
    private String parentid;
    /**
     * 子节点
     */
    private List<T> children;

}

2步:

package com.zhecre.jx.business.model.cases.response;

import com.zhecre.jx.business.common.BaseTreeNode;
import lombok.Data;

import java.util.List;

/**
 * 描述:补偿方案管理新增指标配置三级下拉
 *
 */
@Data
public class AreaInfo extends BaseTreeNode<AreaInfo> {

    private String indexid;//指标ID

    private String indexname;//指标名字

    private String  unit;

    private Double coef;

    private String parentid;//上一级指标pid


    /** 子节点 */
    private List<AreaInfo> children;



}

3.controller

@GetMapping("/compensationtree")
    public List<AreaInfo> areaInfoList(){
        //首次查所有节点数据
        List<AreaInfo> areaInfu = pasCaseService.selectAll();
        List<AreaInfo> tree = TreeUtil.getTree(areaInfu);

        return tree;

    }

4.Service

 public List<AreaInfo> selectAll();

5.serviceimpl

@Override
    public List<AreaInfo> selectAll() {
        return pasCaseMapper.selectAll();
    }

6.Mapper

 List<AreaInfo> selectAll();

7.MapperXML

<select id="selectAll" resultType="com.zhecre.jx.business.model.cases.response.AreaInfo">
        SELECT INDEXID,INDEXNAME,PARENTID,UNIT,COEF FROM PAS_INDEX  WHERE INDEXID LIKE 'IA%'
    </select>

8.工具类:

package com.zhecre.jx.business.common;

import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;


@Slf4j
public class TreeUtil {



    //java8构建树

    /**
     * 将平铺的List<T>转换成Tree
     * @param listNodes
     * @param <T>
     * @return
     */
    public static <T extends BaseTreeNode> List<T> getTree(List<T> listNodes){
//        判断当前listNodes 是否为空
        if (CollectionUtil.isNotEmpty(listNodes)){
            //根据pid分组 key 都是parentId ,value 所有的permission对象
            Map<String, List<T>> listMap = listNodes.stream().collect(Collectors.groupingBy(t -> Optional.ofNullable(t.getParentid()).orElse(String.valueOf("root"))));
            //得到一级分类,第一级pid==0

            List<T> oneLevelClassify = listMap.get("root");//最底层跟节点id
            //递归
            List<T> list = getChildList(oneLevelClassify, listMap);
            return list;
        }
        return new ArrayList<>();
    }

    /**
     * 获取子节点
     * @param classifies
     * @param groupMap
     * @param <T>
     * @return
     */
    private static <T extends BaseTreeNode> List<T> getChildList(List<T> classifies, Map<String, List<T>> groupMap) {
        //判断一级的数据是否为空
       if (CollectionUtil.isNotEmpty(classifies)){
           //遍历 tree 父级对象
           for (T tree:classifies){
               //所有的二级的list对象
               List<T> classifyList = groupMap.get(tree.getIndexid());
               //判断是否为空
               if (!CollectionUtils.isEmpty(classifyList)) {
                   tree.setChildren((List<BaseTreeNode>)classifyList);
                   getChildList(classifyList, groupMap);
               } else {
                   tree.setChildren(null);
               }
           }
           //循环遍历
//           classifies.forEach(tree -> {
//               List<T> classifyList = groupMap.get(tree.getId());
//               if (!CollectionUtils.isEmpty(classifyList)) {
//                   tree.setChildren((List<BaseTreeNode>)classifyList);
//                   getChildList(classifyList, groupMap);
//               } else {
//                   tree.setChildren(null);
//               }
//           });
           return classifies;
       }
       return new ArrayList<>();
    }
}

JAVA后台转换成树结构数据返回给前端的实现方法 主要介绍了JAVA后台转换成树结构数据返回给前端的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

相关推荐

【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例

【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例 最近完成了一个关于时钟中断驻留的汇编大作业,对于TSR很是感兴趣,查阅了不少资料,发现现在很少相关的内容资料。尤其是TSR删除这一块几乎找不到在低的水平完全正确的做法,下面我对于TSR的删除我会介绍一种几乎小程序可以完成的方法。当然,标题中的TSR实现,热键设置我也会一一介绍。

cly116的博客 3970

Java后台返回树形结构的二种方式

【代码】Java后台返回树形结构的二种方式。

七一 4800

【计算机视觉】基于复杂环境下的车牌识别

本文针对复杂环境下(光照变化、车牌变形、噪声干扰)的车牌识别问题,提出了一套完整的优化方案。通过四个核心环节进行改进:1)采用CLAHE、同态滤波等技术优化光照处理;2)使用边缘检测和透视变换应对车牌变形;3)结合中值滤波和暗通道去噪算法消除干扰;4)改进字符分割与识别方法。文章提供了详细的Python实现代码,展示了从预处理到字符识别的完整流程,并通过多策略融合显著提升了复杂场景下的识别准确率。实验结果表明,该方法能有效应对各类复杂环境挑战,为实际应用提供了可靠解决方案。

2401_84149564的博客 1625

java返回前端树形结构数据(2种实现方式)

java返回前端树形结构数据(2种实现方式)

我的青春一去不复返 3490

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 455

完美解决前后端交互中后端返回树形结构数据

在我们开发中,前端有些树形组件需要的数据类型更多是树形类型,比如Element中的树节点: 前端需要补充的数据类型是: [{ id: 1, label: '一级 1', children: [{ id: 4, label: '二级 1-1', children: [{ id: 9, label: '三级 1-1-1' },

suncat的博客 9279

架构师成长之路(1)--什么是架构师

前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知。 如果我们要成为架构师,我们自己要面临的三大问题: 找准自己定位:我是谁?在哪里? 怎样做好架构师:我要做什么? 如何搭建架构师知识体系:我该怎么做? 这里面就是做事方法论:目标(我要做什么),方法(计划)(我该怎么做), 执行/行动找准自己定位:我是谁?在哪里...

黄规速博客:学如逆水行舟,不进则退 6万+

layui实现树状Treetavble表格

2、表格js实现tree 3、后台实现查询 效果如下

weixin_54685622的博客 954

Android系统去掉长按webview界面弹框中的分享功能

Android 系统去解决长按显示内容,去掉分享功能,不论那个界面,是所有界面都需要满足。如果仅仅去掉系统自带的,那么系统来处理如果客户自定义,部分App自定义的菜单项,不是调用系统的,那么还是需要应用去解决的。之前做过Editext,其实还需要去TextView,最难点的就是WebView中的HTML了 去分享功能了。WebView中涉及到分享功能菜单的界面,/***//***//***//***//***//***//***//***//**

十年饮冰,难凉热血 1019

点云从入门到精通技术详解100篇-基于点云语义分割的电力线提取及聚类研究

在现代社会,电力一直扮演着最重要的角色之一。它不仅与人民的生活息息相关,更是一个国家发展的命脉。近年来,随着我国各特高压输电线路建成(比如2022年1月份白鹤滩江苏特高压输电线路的放线)以及电网规模的不断扩大,我国年发电量稳步上升,人民的生活水平越来越高。我国土地辽阔,输电线路分布广泛,再加上地形环境复杂多样,电力线可能遭受风吹雨晒甚至是冰雪寒灾的影响。因此,为了保障电力线的可靠供电,防止停电意外发生,电力部门要定期对输电线路进行检查。目前我国主要。

getusushu的博客 1010

jquery zTree 入门,从后台获取数据

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34037977的博客 229

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2285

Jquery EasyUI 异步树

Jquery EasyUI 异步树 前台JSP 没什么难的 调用onBeforeExpand 点击节点触发下一节点 $('#tt').tree({  checkbox: false,  url: contextRoot + 'wf/WfDesignAction!TreeList.action?currentId=-1',//调用action返回j

zhongyy1991的专栏 703

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

xtree在struts下动态加载树

 显示树的页面 script type="text/javascript">var tree = new WebFXLoadTree("Hello World", "treeView.do");tree.write();script>treeView.do对应的action方法 public ActionForward execute(ActionMapping m

mohamode的专栏 1976

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java后台返回省市县树形结构

Java后台返回的数据格式如下: { "msg": "操作成功", "code": 0, "data": [ { "id": 100000, "name": "直辖市", "parentid": "000000", "code": "100000", "level": 1, "children": [ { "id": 100100, "name": "上海市

1只喵喵的博客 3792

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java后端返回前端树形结构_Java后端返回树型数据

前端有时需要展示部门树,城市树,人员树等树形结构,这时后端返回的数据需要经过一定的加工。1. 树结构的节点,设置children属性,可嵌套package com.jiangxb.test.util.tree;import java.util.ArrayList;import java.util.List;/*** @author jiangxiangbo* @date 2020/8/19* @D...

weixin_42509105的博客 2150

后台数据转树形结构返回前台

前台向后台请求数据时可能会希望能得到一个树结构的数据结构,方便我们前台获取和使用,也能使得数据结构清晰。这时候需要,后台将数据转化为树形结构。整体思路为: 1. 定义树形结构的实体类 2. 新建工具类,利用递归算法,将数据循环遍历并且返回 3. 在controller层,将工具类开辟空间,调用其中的递归算法 代码如下: 1,实体类 public class Tree { private Str...

java_xdo的博客 8412

java返回数据给前端_JAVA后台转换成树结构数据返回给前端的实现方法

我们会经常用到树形,那么树形结构的数据是在前端做还是在后台做呢?我自己用过前端的ztree,selectTree等这些属于前端的组件,后台只需要把一个表的所有数据返回给前段就可以,前端可以通过id,pid来把层级结构划分,要是我们前端需要后台直接返回树结构数据怎么办,那么接下来我给大家介绍一下我写过的例子。我们先看一张图了解一下树结构:我这里随便找一张图了解一下即可接下来我们看一下数据,主要包括i...

weixin_33957382的博客 751

如何返回一个树形结构数据

前言: 树形结构在开发中还挺常见的,后端需要返回一个树形结构给前端,前端直接拿着这个树形结构展示在页面上。 正文: package com.test.nodefault; import com.test.model.TestNode; import com.test.model.vo.TestNodeVo; import org.springframework.beans.BeanUti...

Soup's Blog 5449

JAVA后台转换成树结构数据返回给前端

我们会经常用到树形,那么树形结构的数据是在前端做还是在后台做呢?我自己用过前端的ztree,selectTree等这些属于前端的组件,后台只需要把一个表的所有数据返回给前段就可以,前端可以通过id,pid来把层级结构划分,要是我们前端需要后台直接返回树结构数据怎么办,那么接下来我给大家介绍一下我写过的例子。 我们先看一张图了解一下树结构:我这里随便找一张图了解一下即可 接下来我们看一下数据,主要...

qq_42281649的博客 4176

Java构建树形结构返回前端

Java构建树形结构返回前端的两种方法,本文以行政区划为例,组织架构同理。

weixin_44000378的博客 1166

Java后端递归构建树形结构

记录:在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。 简明:为了简化代码,引入Lombok的Jar包,可省略实体类set()、get()方法。 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> ...

彼岸尚有荣光在,应不断记录总结!!! 1万+

Java后台实现树形结构

Java后台实现树形结构 开发中有好多带层级的信息,关联性就是本级ID及对应的父ID,若直接返回给前端可能处理不方便,后台处理成json套json的树形结构返回给前端他们能更好的处理,话不多说直接上代码 金字塔尖父节点默认不存值,可根据个人项目情况来 //解析传来的集合 if(list != null){ //定义接受解析集合 List<TreeResultVo> resultList = new ArrayList(); //循环遍历 for(int i = 0; i &l

weixin_43949154的博客 1084

java构建树形结构

在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, 在Java后台利用递归思路进行构建数据,返回给前端,能以下拉菜单等形式进行展示, 以某市行政区为例。

m0_61682705的博客 1万+
上一篇: TkMyBatis插件&构造方法常用注解
下一篇: Mybatis中 一对多&一对多对多操作
北执南念
博客等级 码龄7年 1万+粉丝 310原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北执南念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值