纳税服务系统三(优化处理)【异常处理、抽取BaseAction】

自定义的struts2的resulttype 自定义struts2的result-type的一个小例子... 立即下载

前言

本博文主要讲解在项目中异常是怎么处理的。一般我们都不会直接把后台异常信息返回给用户,用户是看不懂的。让用户看见一大串的错误代码,这是不合理的。因此我们需要对报错进行处理。

我们在开发的时候是使用层次来进行开发的。因此有三个层次:

① Action层可能出现解析请求参数、返回结果有问题;

② Service 层则可能出现请求中要做的业务操作出现问题;出现了问题要根据实际情况判断是否会影响本次操作结果,action中要根据异常信息进行判断然后确定是否操作成功;

③ dao层也可能出现在操作数据库时出现错误;而此种错误一般都是致命的会影响操作结果。

因此;在3个层次中至少要有两种类型的异常信息来标识。

异常类的定义应该放在core核心模块的exception包下的。

640?wx_fmt=png
这里写图片描述

自定义异常类

总的系统异常类

/**** * 这是我们自定义的总系统异常类 * * */public class SysException extends Exception {    //用来记录错误的信息!    private String errorMsg;    public String getErrorMsg() {        return errorMsg;    }    public void setErrorMsg(String errorMsg) {        this.errorMsg = errorMsg;    }    public SysException() {    }    public SysException(String message) {        super(message);        this.errorMsg= message;    }    public SysException(String message, Throwable cause) {        super(message, cause);        this.errorMsg= message;    }    public SysException(Throwable cause) {        super(cause);    }}
public class SysException extends Exception {

   //用来记录错误的信息!
   private String errorMsg;

   public String getErrorMsg() {
       return errorMsg;
   }
   public void setErrorMsg(String errorMsg) {
       this.errorMsg = errorMsg;
   }
   public SysException() {
   }

   public SysException(String message) {
       super(message);
       this.errorMsg= message;
   }

   public SysException(String message, Throwable cause) {
       super(message, cause);
       this.errorMsg= message;
   }

   public SysException(Throwable cause) {
       super(cause);
   }
}

Action异常类

继承着我们自定义的总系统异常类/** * Action的异常类 * */public class ActionException extends SysException {    public ActionException() {        super("请求操作失败了!");    }    public ActionException(String message) {        super(message);    }}
/**
* Action的异常类
* */

public class ActionException extends SysException {

   public ActionException() {

       super("请求操作失败了!");
   }

   public ActionException(String message) {
       super(message);
   }
}

Service异常类

/** * Created by ozc on 2017/5/26. */public class ServiceException extends SysException {    public ServiceException() {        super("操作业务失败了!");    }    public ServiceException(String message) {        super(message);    }}
public class ServiceException extends SysException {
   public ServiceException() {
       super("操作业务失败了!");

   }

   public ServiceException(String message) {
       super(message);
   }
}

全局异常映射

我们使用的是Struts2框架,想要报错的信息不直接给用户看见。就在Struts总配置文件中配置对应的映射。

    <!-- 配置全局结果及异常映射 -->    <package name="base-default" extends="struts-default">        <!-- 全局返回结果 -->        <global-results>            <!--这是我们自定义异常的错误-->            <result name="sysError">/WEB-INF/jsp/error.jsp</result>            <!--这是找不着映射路径的错误-->            <result name="input">/WEB-INF/jsp/error.jsp</result>        </global-results>        <!-- 全局异常映射 -->        <global-exception-mappings>            <exception-mapping result="sysError" exception="zhongfucheng.core.exception.SysException"></exception-mapping>            <exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>        </global-exception-mappings>    </package>
   <package name="base-default" extends="struts-default">
       <!-- 全局返回结果 -->
       <global-results>

           <!--这是我们自定义异常的错误-->
           <result name="sysError">/WEB-INF/jsp/error.jsp</result>
           <!--这是找不着映射路径的错误-->
           <result name="input">/WEB-INF/jsp/error.jsp</result>
       </global-results>

       <!-- 全局异常映射 -->
       <global-exception-mappings>
           <exception-mapping result="sysError" exception="zhongfucheng.core.exception.SysException"></exception-mapping>
           <exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>
       </global-exception-mappings>
   </package>

应用

在子模块中,只要继承着我配置异常信息的package就行了。

640?wx_fmt=png
这里写图片描述

Serive层抛出异常:

    @Override    public List<User> findObjects() throws ServiceException {        try {            int i = 1 / 0;        } catch (Exception e) {            throw new ServiceException(e.getMessage());        }        return userDaoImpl.findObjects();    }
   public List<User> findObjects() throws ServiceException {

       try {
           int i = 1 / 0;
       } catch (Exception e) {
           throw new ServiceException(e.getMessage());
       }
       return userDaoImpl.findObjects();

   }

Action层把它catch住,并抛出Action异常:

    //抛出Action异常    public String listUI() throws ActionException {        try {            userList = userServiceImpl.findObjects();        } catch (ServiceException e) {            throw new ActionException("请求操作失败!!!" + e.getMessage());        }        return "listUI";    }
   public String listUI() throws ActionException {
       try {
           userList = userServiceImpl.findObjects();
       } catch (ServiceException e) {
           throw new ActionException("请求操作失败!!!" + e.getMessage());
       }
       return "listUI";
   }

即使Action中出现了ActionExcpetion以外的异常,我们在Struts配置文件中已经配置了Exception了。还是可以将它捕获得到

  <body>      <img src="<%=request.getContextPath() %>/images/common/error.jpg">    <br>    <s:if test="exception.errorMsg != '' && exception.errorMsg != null">        <s:property value="exception.errorMsg"/>    </s:if>    <s:else>        操作失败!<s:property value="exception.message"/>    </s:else>  </body>
     <img src="<%=request.getContextPath() %>/images/common/error.jpg">
   <br>
   <s:if test="exception.errorMsg != '' && exception.errorMsg != null">
       <s:property value="exception.errorMsg"/>
   </s:if>
   <s:else>
       操作失败!<s:property value="exception.message"/>
   </s:else>
 </body>

效果:

640?wx_fmt=png
这里写图片描述

抽取BaseAction

我们在用Action的时候,未免都会存在一些功能的属性。例如:在listUI,我们要获取多个用户的时候,需要有selectedRow这么一个属性。在其他的子模块也应该要有这个样属性。所以我们可以抽取出来--->形成一个BaseAction。其他的Action只要继承着BaseAction就有相对应的属性了。

public class BaseAction extends ActionSupport {    public  String[] selectedRow;    public String[] getSelectedRow() {        return selectedRow;    }    public void setSelectedRow(String[] selectedRow) {        this.selectedRow = selectedRow;    }}class BaseAction extends ActionSupport {

   public  String[] selectedRow;

   public String[] getSelectedRow() {
       return selectedRow;
   }

   public void setSelectedRow(String[] selectedRow) {
       this.selectedRow = selectedRow;
   }


}

制定返回类型StrutsResultSupport

在有特殊情况时;如果没有异常信息,但是有错误并且有错误信息等内容;此时也需要进行友好的错误处理的话,那么可以借助StrutsResultSupport 返回结果类型来实现特定处理。

此种方式先需要继承StrutsResultSupport ,然后可以在子类中获取本次请求的相关信息,再根据相关信息进行结果处理:

import com.opensymphony.xwork2.ActionInvocation;import org.apache.struts2.ServletActionContext;import org.apache.struts2.dispatcher.StrutsResultSupport;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SysResultAction extends StrutsResultSupport {    @Override    protected void doExecute(String arg0, ActionInvocation invocation) throws Exception {        HttpServletRequest request = ServletActionContext.getRequest();        HttpServletResponse response = ServletActionContext.getResponse();        BaseAction action = (BaseAction)invocation.getAction();         //do something        System.out.println("进入了 SysResultAction ...");    }}
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SysResultAction extends StrutsResultSupport {

   @Override
   protected void doExecute(String arg0, ActionInvocation invocation) throws Exception {
       HttpServletRequest request = ServletActionContext.getRequest();
       HttpServletResponse response = ServletActionContext.getResponse();
       BaseAction action = (BaseAction)invocation.getAction();


       //do something
       System.out.println("进入了 SysResultAction ...");
   }

}

配置:

    <!-- 配置全局结果及异常映射 -->    <package name="base-default" extends="struts-default">        <!-- 返回结果类型 -->        <result-types>            <result-type name="error" class="zhongfucheng.action.SysResultAction"></result-type>        </result-types>        <!-- 全局返回结果 -->        <global-results>            <result name="error" type="error">/WEB-INF/jsp/error.jsp</result>            <result name="sysError">/WEB-INF/jsp/error.jsp</result>            <result name="input">/WEB-INF/jsp/error.jsp</result>        </global-results>        <!-- 全局异常映射 -->        <global-exception-mappings>            <exception-mapping result="sysError" exception="zhongfucheng.action.SysResultAction"></exception-mapping>            <exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>        </global-exception-mappings>    </package>
   <package name="base-default" extends="struts-default">
       <!-- 返回结果类型 -->
       <result-types>
           <result-type name="error" class="zhongfucheng.action.SysResultAction"></result-type>
       </result-types>
       <!-- 全局返回结果 -->
       <global-results>
           <result name="error" type="error">/WEB-INF/jsp/error.jsp</result>
           <result name="sysError">/WEB-INF/jsp/error.jsp</result>
           <result name="input">/WEB-INF/jsp/error.jsp</result>
       </global-results>
       <!-- 全局异常映射 -->
       <global-exception-mappings>

           <exception-mapping result="sysError" exception="zhongfucheng.action.SysResultAction"></exception-mapping>
           <exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>
       </global-exception-mappings>
   </package>

总结

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y


SpringBoot+Vue+Mysql社区医院信息平台(源码+文档) SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心... 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

StrutsResultSupport

A base class for all Struts action execution results. The "location" param is the default parameter, meaning the most common usage of this result would be: This class provides two common parameters ...

yaozuodaoforfly的博客 250

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Struts2生成随机验证码图片(自定义结果集StrutsResultSupport)

1.工程文件夹如下: 2. HelloAction.java代码如下。StrutsResultSupport是struts的自定义结果集。我们的HelloAction类只要继承StrutsResultSupport抽象类并实现doExecute方法,就可以把doExecute方法里面的验证码图片code传到调用这个HelloAction类的jsp页面啦~~ 下面是用get和set注入的方法从...

weixin_37891342的博客 366

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

扩展struts2的结果集StrutsResultSupport 自定义Result处理JSON

以前在采用Struts2开发的项目中,对JSON的处理一直都在Action里处理的,在Action中直接Response,最近研读了一下Struts2的源码,发现了一个更加优雅的解决办法,自己定义一个ResultType, 首先大家先看下Struts2中的源码 包com.opensymphony.xwork2下的DefaultActionInvocation 472行 [java]...

weixin_30917213的博客 352

无参考图像质量评估方法:BRISQUE、RankIQA、DIQA

常用的图像质量评估(IQA)分为无参考和有参考两种类型。常见的有参考图像质量评估方法有PSNR,SSIM以及VMAF。其中vmaf是针对视频来讲的,在它的评价方法里面添加了一些时域信息,如果应用于单张图片,需要做一些处理,如去除时域信息。有参考意味着图像质量是以参考图为基准。基于参考图像都是高清图像的假设,这些评价方法已经广泛应用于图像压缩以及图像传输、拼接之类的处理后图像的质量,假如这张参考图的质量本身就比较渣,那么该评价指标可信度就大大降低。

weixin_51732791的博客 3191

Struts2自定义Result(二)- StrutsResultSupport

在上篇博客中的图片可以看到,Struts有一个基本的抽象类,我们也可以继承他来自定义Result 继承他之后,只需要实现一个方法就可以了: @Override protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { } 这里简单说一下,怎样实现一个返

什么是江湖? 3802

vue3接入大华摄像头

┃ ┃ ┣ 📜PlaybackModal.vue 回放列表模态框。┃ ┃ ┗ 📜VideoGrid.vue 视频播放区域。┃ ┃ ┣ 📜ControlPanel.vue 控制面板。┃ ┃ ┣ 📜DeviceList.vue 设备列表。┃ ┣ 📂module //大华摄像头文件。

💻 专注 Vue 前端与 Java 后端技术 🌱 目前正在深入 Spring Boot、微服务与性能优化 📝 定期分享实战踩坑经验与学习笔记 🤝 欢迎交流,共同进步 914

反激开关电源变压器设计实例讲解(定明芳)

内容来自《反激变压器的设计》(定明芳主讲)。 定名芳老师主要讲了10步,最后应该还有一步,线径的选择已经绕制方式。这里进行了记录整理,把一些公式来源进行了推导。所有的设计都是基于理论计算。 1.确定电源规格 2.确定工作频率和最大占空比 3.计算匝比(利用伏秒平衡原则) 此处插入解释一下伏秒平衡,根源是磁通量平衡。该原则可以用来检查MOS管耐压是否够。 4.计算初级线圈峰值电流 基于CCM模式计算的。ip1是开关管要关闭时的峰值电流,ip2是开关管开始导通时的起始电流。因为时CCM模式,所以,ip

ydgd118的博客 5万+

纳税服务系统【异常处理、抽取BaseAction】

前言 本博文主要讲解在项目中异常是怎么处理的。一般我们都不会直接把后台异常信息返回给用户,用户是看不懂的。让用户看见一大串的错误代码,这是不合理的。因此我们需要对报错进行处理。 我们在开发的时候是使用层次来进行开发的。因此有三个层次: ① Action层可能出现解析请求参数、返回结果有问题; dao【如果在这里报错了,一般都是比较致命的,我们先不管】 ② Service 层则可能出现...

3y 383

RcisTarget实战:从差异基因到转录因子调控网络的完整分析流程(附代码)

本文详细介绍了RcisTarget工具在转录因子调控网络分析中的完整流程,从差异基因到motif富集分析,再到结果可视化与生物学解读。通过实战代码演示,帮助研究者掌握这一强大的R包应用,揭示基因表达背后的调控机制,特别适用于基因组学和生物信息学研究。

weixin_29214199的博客 228

struts2自定义返回类型

1、自定义返回类,继承StrutsResultSupport类package cn.jieou.struts.resulttype;import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.Str

超级奶爸MJCX的博客 552

【MFiX后处理】MFiX中使用des_usr_var输出颗粒的传热量(2020-11-27更新变更输出变量名方法)

参考之前Yin的那一篇博客 https://www.cnblogs.com/Jay-CFD/p/10621274.html 输出一下颗粒传热量 使用的算例是fluid_bed_dem_2d 打开des scalar tracking 前面都和Yin那篇一样,打开enable user scalar tracking 输入2 因为第一个用来测试Y加速度了 第二个输出传热量 然后在output vtk中勾选好 更改源代码 源代码为des_thermo_newvalues.f 在mfix-GUI自带的ed

beidou111的博客 1533

STM32硬件SPI驱动W5500以太网模块全流程(附避坑指南)

本文详细介绍了STM32硬件SPI驱动W5500以太网模块的全流程,包括硬件架构设计、SPI接口选型、官方驱动移植、网络协议栈配置与优化等关键步骤。通过实战案例和性能对比数据,帮助开发者快速实现稳定高效的网络连接,特别提供了常见问题排查指南和性能调优技巧。

weixin_29194693的博客 268

Struts2 的Result编写

struts2 有很多优势,提供的例子比较简单,那么在实际的项目中,如果每一次请求都在struts。xm中进行配置,那么项目的配置文件麻烦而且也不易管理,现在提供一个简单的方式。自己编写一个result,在action中定义常量url。直接跳转到自己定义的url。 这样就不需要每一个请求就到struts。xml中进行配置了。 struts2的访问过程为:拦截器(interceptor),act

小菜鸟的博客 2486

【2024年华为秋招-12月25日-第三题(300分)- PCB印刷电路板布线】(题目+思路+Java&C++&Python解析+在线测试)

在PCB印刷电路板设计中,器件之间的连线需要避免线路的阻抗值增大、而且赛件之间还有别的器件和别的干扰源,在布线时我们希望受到的干扰尽量小。现将电路板简化成一个M×N的矩阵,每个位置(单元格)的值表示其源干扰度。如果单元格的值为0,表示此位置没有干扰源;如果单元格的值为非0,则表示此位置是干扰源,其值为源干扰度。连线经过干扰源或干扰源附近会增加连线的总干扰度。位置Axy的干扰源的源干扰度为dd01、若连线经过位置Axy,则其总干扰度会增加d;2、若连线经过离位置A。

m0_73659489的博客 344

Struts2 自定义Result

注意:我只要是解决自定义返回Json 和异常处理问题 新建一个类 AjaxResult   继承 StrutsResultSupport 看看代码吧 public class AjaxResult extends StrutsResultSupport { /** * serialVersionUID */ private static fina

z69183787的专栏 3197

MICCAI‘23 | TSegFormer:基于几何引导Transformer的口内扫描3D牙齿分割

光学口内扫描仪(IOS)在数字牙科中广泛应用于提供牙冠和牙龈的详细3D信息。准确的3D牙齿分割对于各种牙科应用至关重要,但现有方法在复杂边界处容易出错,并且在不同患者之间表现不佳。本文提出了TSegFormer,它通过多任务3D Transformer架构捕捉IOS点云中不同牙齿和牙龈之间的局部和全局依赖关系。此外,作者设计了一种基于新颖点曲率的几何引导损失,以端到端方式优化边界,避免了耗时的后处理,从而实现临床适用的分割。

小白学视觉 291

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

扩展struts2的结果集StrutsResultSupport

<br />代码如下:<br />package commons.struts2; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.dispatcher.StrutsResultSupport; import com.opensymphony.xwork2.ActionInvocation; /** * result type for out

ProgrammingRoad 3889

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

全局异常监听并保存---工具类---抽取全局异常类

ExceptionCrashHandler 全局异常类 使用方法 在application中初始化 //设置全局异常捕捉类 ExpectionCrashHandler.getInstance().init(this); 在第一个activity获得异常信息 //获取上次的崩溃信息并上传到服务器 File crashFile = ExpectionCrashHan...

wdd1324的博客 646

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

代码调用服务--请求因 HTTP 状态 401 失败:Access Denied。(downmoon原创)

直接调用服务时没有问题,但在程序中用代码调用web service 时以生以下错误 请求因 HTTP 状态 401 失败:Access Denied。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Net.WebException: 请求因 HTT

邀月周记 5963

网络对接出现请求异常的处理方法

前言 下面文档来源于网络,总姐的比较好,项目中也是这样使用的 1.增加超时时间 假设A系统有个方法methodA,会调用B系统的methodB这个http接口,如果mehodA不追求超快的响应速度,那么你在调用methodB这个http接口时,可以增长超时时间,例如10秒超时。因为经常在某些时刻,由于网络原因或者系统原因,调用method会超时的。 2.使用异步机制 如果...

HealerJean梦想博客 2万+

Nacos跨服务器调用服务报错

利用gateway做springcloud微服务网关路由服务时出现报错情况,发现是和网关不在一个服务器的服务无法使用 Nacos服务注册的IP Nacos注册中心是: https://github.com/alibaba/nacos 各个服务通过Nacos客户端将服务信息注册到Nacos上 当Nacos服务注册的IP默认选择出问题时,可以通过查阅对应的客户端文档,来选择配置不同的网卡或者IP ...

御前提笔小书童 4778
上一篇: 纳税服务系统总结
下一篇: 纳税服务系统【总结】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值