常用配置及命令V1.0

常用配置及命令V1.0

docker 安装ElasticSearch|Kibana

# 下载elasticsearch镜像文件
docker pull elasticsearch:7.4.2
# 下载kibana镜像文件
docker pull kibana:7.4.2

#创建需要挂载的文件夹
# 里面放配置文件所需的文件夹
mkdir -p /mydata/elasticsearch/config
# 里面放es的数据所需的文件夹
mkdir -p /mydata/elasticsearch/data
# 里面放es的插件所需的文件夹
mkdir -p /mydata/elasticsearch/plugins

echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml

# 启动容器的命令
docker run --name elasticsearch -p 9200:9200 -p 9300:9300  --privileged=true \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

#将这个目录下的所有文件授权为777
chmod -R 777 /mydata/elasticsearch/

# 重启docker
systemctl restart docker
docker start elasticsearch

# 启动kibana
docker run --name kibana --privileged=true \
-e ELASTICSEARCH_HOSTS=http://192.168.126.20:9200 -p 5601:5601 \
-d kibana:7.4.2

# ik分词器安装 1、下载压缩包
cd /mydata/elasticsearch/plugins/
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
# 2、解压
unzip elasticsearch-analysis-ik-7.4.2.zip -d ik7.4.2
# 4、删除
rm -rf ./*.zip
# 5、修改权限
chmod -R 777 ik7.4.2/
#重启6、es
docker restart elasticsearch


# 进入容器内部
docker exec -it containerID /bin/bash

Oracle命令

drop user emp cascade;

docker 安装nacos

## 安装nacos使用docker 安装最新版
docker pull nacos/nacos-server

## 创建文件/opt/nacos/init.d/custom.properties并复制如下内容
management.endpoints.web.exposure.include=*

## 启动
docker run -d -p 8848:8848 -e MODE=standalone -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /opt/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server

##创建数据库 nacos再添加sql

redis中的常用命令

####################String(kv键值对)########################
# 设置kv键值对 
set hello word

# 获得kv键值对
get hello

# 删除kv键值对
del hello

#####################list(链表)#######################
# 给定值推入列表右端
rpush list-key item

# 获取列表上的所有值
lrange list-key 0 -1

# 获取列表上给定位置的单个元素
lindex list-key 1

# 从列表左端弹出一个值,并返回被弹出的值
lpop list-key

#####################set(无序表)#######################
# 将给定元素添加到集合
sadd set-key item

# 返回集合包含的所有元素
smembers set-key

# 如果给定的元素存在于集合中,那么移除这个元素
srem set-key item1

#####################(散列表)#######################
# 在散列里面关联起给定的键值对
hset hash-key sub-key1 value1

# 获取散列键的值
hget hash-key sub-key1

# 获取所有的散列键值对
hgetall hash-key

# 如果给定的键在散列表里,删除给定的键值对
hdel hash-key sub-key1

#####################(有序集合)#######################
# 将一个带有给定分值的成员添加到有序集合里面
zadd zset-key 728 member

# 根据元素在有序列表中所处的位置,从有序集合里获取多个元素
zrange zset-key 0 -1 withscores

# 获取给定分值范围内的所有元素
zrangebyscore zset-key 0 800 withscores

# 如果给定成员存在于有序集合,那么移除这个成员
zrem zset-key member1

nginx常用命令

# 使用nginx操作命令的前提,进入nginx的目录
# /usr/local/nginx/sbin

# 查看版本号
./nginx -v

# 启动nginx
./nginx

# 关闭nginx
./nginx -s stop

# 重新加载nginx
./nginx -s reload

nginx的配置文件

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。
#这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #日志自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页面
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

docker常用命令

# 启动docker
sudo systemctl start docker
# 开机自启
sudo systemctl enable docker

# 检查当前所有的镜像
sudo docker images

# 查看正在运行中的容器
docker ps

# 配置阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://r8aan01b.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

# 镜像下载mysql5.7
docker pull mysql:5.7

# docker 启动mysql
# -v 目录挂载
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

# mysql重启
systemctl restart mysqld.service 
# mysql启动
systemctl start mysqld.service 
# mysql停止
systemctl stop mysqld.service

# 安装redis
docker pull redis
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf

docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

# redis进入控制台
docker exec -it redis redis-cli

git命令

git config --global user.name "amongdec"
git config --global user.mail "xidongdongvv@sina.com"
ssh-keygen -t rsa -C "xidongdongvv@sina.com"
cat ~/.ssh/id_rsa.pub

服务远程调用open-feign

1、引入openfeign

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、编写一个接口来调用远程服务

/**
 * 远程调用优惠券服务的接口
 */
@FeignClient("valkyrie-coupon")
public interface CouponFeignService {

    @RequestMapping("/valkyriecoupon/coupon/feign")
    public R memberCoupon();
}

3、开启feign的远程调用功能

@EnableFeignClients(basePackages = "com.xiao.valkyriemember.feign")

Nacos作为配置中心

1、引入依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、编写bootstrap.properties

## 应用名称
spring.application.name=valktrie-coupon
## 连接的nacos服务器的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

3、在配置中心添加一个配置,名为当前应用名+.properties

4、动态获取配置

@RefreshScope//动态获取并刷新配置
@Value("${配置名}")

注意(配置中心和当前配置文件都配置相同的项,那么优先使用配置中心的配置)

常用网站

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 跨域问题详解网站

轮子代码,netty搭建服务器,自定义高性能

package com.montnets.mwgate.server;

import com.montnets.mwgate.common.GlobalParams;
import com.montnets.mwgate.smsutil.ConfigManager;
import com.montnets.mwgate.smsutil.SmsSendConn;

public class ServerApplication {

    static SmsSendConn smsSendConn = null;


    public static void main(String[] args) throws Exception {
        HttpServer server = new HttpServer(8888);// 8088为启动端口
        //启动服务器之前,配置全局参数
        setGlobal();

        server.start();
    }

    /**
     * 设置全局参数
     */
    public static void setGlobal() {
        // 创建全局参数
        GlobalParams globalParams = new GlobalParams();
        // 设置请求路径
        globalParams.setRequestPath("/sms/v2/std/");
        // 设置是否需要日志 1:需要日志;0:不需要日志
        globalParams.setNeedLog(1);
        // 设置响应超时时间(30即为30秒)
        globalParams.setResponseTimeout(30);
        // 设置http连接池数
        globalParams.setPoolNumber(5);
        // 设置全局参数
        ConfigManager.setGlobalParams(globalParams);
        // 是否保持长连接
        boolean isKeepAlive = true;
        // 实例化短信处理对象
        smsSendConn = new SmsSendConn(isKeepAlive);

    }
}
package com.montnets.mwgate.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;

public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        ChannelPipeline pipeline = channel.pipeline();
        pipeline.addLast(new HttpServerCodec());// http 编解码
        pipeline.addLast("httpAggregator", new HttpObjectAggregator(512 * 1024)); // http 消息聚合器                                                                     512*1024为接收的最大contentlength
        pipeline.addLast(new HttpRequestHandler());// 请求处理器
    }
}
public class HttpServer {
    int port;

    public HttpServer(int port) {
        this.port = port;
    }

    public void start() throws Exception {
        ServerBootstrap bootstrap = new ServerBootstrap();
        EventLoopGroup boss = new NioEventLoopGroup();
        EventLoopGroup work = new NioEventLoopGroup();
        bootstrap.group(boss, work)
                .handler(new LoggingHandler(LogLevel.DEBUG))
                .channel(NioServerSocketChannel.class)
                .childHandler(new HttpServerInitializer());

        ChannelFuture f = bootstrap.bind(new InetSocketAddress(port)).sync();
        System.out.println(" server start up on port : " + port);
        f.channel().closeFuture().sync();

    }

}
package com.montnets.mwgate.server;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFutureListener;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;

import static io.netty.handler.codec.http.HttpUtil.is100ContinueExpected;

/**
 * 用于处理netty服务器的http请求
 */
public class HttpRequestHandler extends SimpleChannelInboundHandler<FullHttpRequest> {

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception {
        //100 Continue
        if (is100ContinueExpected(req)) {
            ctx.write(new DefaultFullHttpResponse(
                    HttpVersion.HTTP_1_1,
                    HttpResponseStatus.CONTINUE));
        }
        // 获取请求的uri
        String reqUri = req.uri();

        //获取请求的方式
        HttpMethod reqMethod = req.method();

        //获取请求的参数
        String reqMsg = getRequestParam(req);

        //设置返回的参数
        String reponseMsg = "";

        //========================主要逻辑处理部分==================================
        if( HttpMethod.POST == reqMethod){
            //是Post方式
            if(reqUri == null || reqUri.length() == 0){
                //请求uri为空 ,返回信息
                reponseMsg = Result.wrap(Result.STATE_ERROR , "请求的uri为空,请重试");

            }else{
                //根据uri,执行指定方法
                reponseMsg = distributeByUri(reqUri , reqMsg);
            }

        }else{
            //不是Post方式
            reponseMsg = Result.wrap(Result.STATE_ERROR , "请求方式错误,请用POST请求");
        }
        //========================================================================


        // 创建http响应
        FullHttpResponse response = new DefaultFullHttpResponse(
                HttpVersion.HTTP_1_1,
                HttpResponseStatus.OK,
                Unpooled.copiedBuffer(reponseMsg, CharsetUtil.UTF_8));
        // 设置头信息
        response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8");
        //response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
        // 将html write到客户端
        ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
    }

    /**
     * 获得Http请求传递过来的参数 json格式的
     * @param req 一个完整的Http请求
     * @return 返回转换出来的json字符串
     */
    private String getRequestParam(FullHttpRequest req){
        ByteBuf byteBuf = req.content();
        int length = byteBuf.readableBytes();
        byte[] array = new byte[length];
        byteBuf.getBytes(byteBuf.readerIndex(), array);
        return new String(array);
    }

    /**
     * 根据uri 和请求的参数,确定执行的业务方法
     * @return 返回执行结果,用字符串表示
     */
    private String distributeByUri(String uri , String reqmsg){

        String reponseMsg = "";

        if("/setAccountInfo".equals(uri)){
            //请求的是设置用户账号信息功能
            reponseMsg = SmsBiz.setAccountInfo(reqmsg);

        }else if("/removeAccount".equals(uri)){
            //请求移除账号功能
            reponseMsg = SmsBiz.removeAccount(reqmsg);

        }else if("/singleSend".equals(uri)){
            //请求单发接口
            reponseMsg = SmsBiz.singleSend(ServerApplication.smsSendConn , reqmsg);

        }else if("/batchSend".equals(uri)){
            //请求群发接口
            reponseMsg = SmsBiz.batchSend(ServerApplication.smsSendConn , reqmsg);

        }else if("/multiSend".equals(uri)){
            //请求自定义发送接口
            reponseMsg = SmsBiz.multiSend(ServerApplication.smsSendConn , reqmsg);

        }else if("/getRemains".equals(uri)){
            //请求查询剩余金额或条数接口
            reponseMsg = SmsBiz.getRemains(ServerApplication.smsSendConn , reqmsg);
        }else if("/getBalance".equals(uri)){
            //没有该请求
            reponseMsg = SmsBiz.getBalance(ServerApplication.smsSendConn , reqmsg);
        }

        return reponseMsg;
    }
}

Controller异常的统一处理

@Slf4j
//异常最终会从Controller抛出,我们就拦截Controller抛出的异常进行统一处理
@RestControllerAdvice(basePackages = "com.xiao.valkyrieproduct.controller")
public class AllExceptionHandler {

    //异常类型拦截
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handlerException(MethodArgumentNotValidException e){
        log.error("数据校验出现问题{},异常类型{}",e.getMessage(),e.getClass());
        final BindingResult bindingResult = e.getBindingResult();

        Map<String , String> error = new HashMap<String , String>();
        bindingResult.getFieldErrors().forEach((fieldError)->{
            error.put(fieldError.getField() , fieldError.getDefaultMessage());
        });
        return R.error(400,"数据校验出现问题").put("errordata" , error);
    }

    //其他异常
    @ExceptionHandler(value = Exception.class)
    public R handler(Exception e){
        return R.error();
    }
}

SpringCloud gateway 断言配置文件

spring:
  cloud:
    gateway:
      routes:
      - id: third_route
        uri: lb://valkyrie-third-party
        predicates:
          - Path=/api/third/**
        filters:
          - RewritePath=/api/third/(?<segment>.*),/$\{segment}

      - id: product_route
        uri: lb://valkyrie-product
        predicates:
          - Path=/api/valkyrieproduct/**
        filters:
          - RewritePath=/api/(?<segment>.*),/$\{segment}

      - id: member_route
        uri: lb://valkyrie-member
        predicates:
          - Path=/api/member/**
        filters:
          - RewritePath=/api/(?<segment>.*),/$\{segment}

      - id: admin_route
        uri: lb://renren-fast
        predicates:
          - Path=/api/**
        filters:
          - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}


配置文件大全

父模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xiao</groupId>
    <artifactId>valkyrie</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>valkyrie</name>
    <description>瓦尔基里聚合</description>
    <packaging>pom</packaging>

    <modules>
        <module>valkyire-order</module>
        <module>valkyrie-coupon</module>
        <module>valkyrie-member</module>
        <module>valkyrie-ware</module>
        <module>valkyrie-product</module>
        <module>renren-fast</module>
        <module>renren-generator</module>
        <module>valkyrie-common</module>
    </modules>

</project>

common模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>valkyrie</artifactId>
        <groupId>com.xiao</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>valkyrie-common</artifactId>

    <dependencies>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.12</version>
        </dependency>

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <!-- nacos作为注册中心的依赖 --> 
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
		
        <!-- nacos作为配置中心的依赖 -->  
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- jsr303校验框架 --> 
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.7.Final</version>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

实际应用模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xiao</groupId>
    <artifactId>valkyrie-product</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>valkyrie-product</name>
    <description>瓦尔基里商品模块</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR5</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <artifactId>valkyrie-common</artifactId>
            <groupId>com.xiao</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值