自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一半的博客

爱生活,爱学习

  • 博客(107)
  • 资源 (9)
  • 收藏
  • 关注

原创 死磕MybatisPlus系列:Mapper的奇妙之旅

Mybatis通过@MapperScan指定mapper包路径,并据此扫描BeanDefinition,并设置其class为MapperFactoryBean。在实例化时,得到的是factoryBean生成的一个jdk动态代理对象。在使用mapper时,实际是使用SqlSessionTemplate的能力。

2023-11-27 09:38:40 95

原创 死磕Nacos系列:Nacos是如何更新服务信息的?

Nacos是通过定时任务使用HTTP拉数据,和接收服务端通过UDP推送的数据来实现更新服务信息的目的。今天的内容中还涉及到了Nacos的容灾处理,可以通过在磁盘中配置达到开启本地容灾的模式。在获取实例时,就会去本地磁盘中的备份文件中去找服务实例的数据。

2023-11-27 09:10:56 140

原创 死磕Nacos系列:Nacos事件发布订阅模型

Nacos的事件发布是基于观察者模式进行设计的。如果一个处理器需要接收到某个特定事件的通知,那么就要先通过来订阅自己感兴趣的Event,当显示调用时,会通过进行通知到订阅者。

2023-11-25 17:47:10 137

原创 死磕Nacos系列:Nacos在我的SpringCloud项目中做了什么?

今天的文章里面讲解了一个SpringBoot应用是怎样注册到NacosServer中的,以及Nacos管理界面的数据来源。文中涉及到了的知识,这里可以简单提一下,SpringCloudCommon是SpringCloud的一系列标准,其抽象了服务注册与发现、负载均衡器、熔断等模型,只是按照这个标准具体的一个实现,如就是另一套实现。在整个Nacos的体系中,还有很多技术是待深入的,比如中各个组件具体的实现方式,的实现方式,服务信息的持久化、保证数据一致性的策略等等,有兴趣的小伙伴可以持续关注我的后续文章。

2023-11-25 12:27:42 174

原创 死磕Spring系列:SpringAOP源码解析

在SpringAOP中,有很多专业术语,已经了解的小伙伴可以略过,不了解的朋友就需要注意看一下啦,不然会很懵的哟。Aspect(切面)跨多个类的关注点的模块化,与垂直调用的业务树不同,以横切的方式存在。Join point(连接点)程序执行过程的一个点,总是代表一个方法执行。Advice (通知)在特定连接点采取的行动,有Around、Before、After类型的Advice。Pointcut(切入点)匹配连接点的断言,Advice与切入点表达式相关联,并在切入点匹配的任何连接点处运行。切入点表达式匹配的

2022-06-17 11:12:26 594 1

原创 死磕Spring系列:BeanDefinition注册流程

在Spring项目中,为什么我们仅仅只需要在类上定义一个@Component之类的注解,就能让Spring去管理和使用这个类了呢?聪明的小伙伴肯定很快就想到了,肯定是在启动项目的时候,框架去判断类上面有没有特定的注解,然后通过反射去创建对象的。Spring就是以这样的思路来进行Bean管理的,但是Spring在其中考虑的更细致,比如这个bean在以后使用的时候是新创建,还是使用最开始创建的对象,还是在每个请求或者每个session作用域中使用同一个或者多个这个类的实例,又比如这个类是否依赖于其他类实例,在

2022-04-19 14:09:21 985

原创 死磕Spring系列:Bean实例化原理

1. BeanDefinition大家都知道,在Spring IOC启动时,会扫描类的信息,将相关信息封装为BeanDefinition存入到beanDefinitionMap中,后续用其中的描述信息来生成bean。那我们现在就来对怎样Spring是怎样去实例化一个bean做一个说明。2. getBean首先从AbstractBeanFactory类入手,因为它是IOC容器的顶层实现类,基本上都是用其中的getBean去获取bean的。public Object getBean(String na

2022-04-14 16:53:33 608

原创 死磕Spring系列:MVC源码分析

为了方便利用使用的思维进行理解,我们可以先从程序调用入口出发,先对调用层面进行说明,再对程序框架本身处理进行深入。简而言之就是先说明一个请求进入mvc逻辑需要经过哪些处理步骤(1~7节),再说明处理步骤中mvc是怎样提供参数支持的(8~10节)。1. ServletServlet是一个处理http请求的标准类,它处于javax.servlet.http包,属于java标准库的扩展部分。其中主要有init、service、destroy方法,作用分别为初始化时调用,接收到请求调用,销毁时调用。Servl

2022-02-23 22:39:00 813

原创 死磕Spring系列:@Autowired工作原理

1. 前言本文需要有对SpringBean加载流程的知识基础,如果需要在温习一遍的,可以先阅读博文《死磕Spring系列:从源码了解SpringBean生命周期》。2. @Autowired@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUN.

2022-02-18 10:53:58 776 2

原创 死磕Spring系列:从源码理解SpringBean生命周期

Spring替我们管理了对象的创建、引用及销毁,极大的简化了开发者的操作,但是,这一系列便利操作背后究竟是怎样实现的呢?我们来一探究竟。1. 调用时序图2. 源码分析2.1 SpringApplication2.1.1 run运行启动类,调用SpringApplication类的run方法:public class DemoApplication { public static void main(String[] args) { SpringApplicat

2022-02-18 09:55:32 452

原创 Session的作用及原理

文章目录1. 定义2. 和Cookie比较3. 图解4. 源码解析(Java)5. 总结1. 定义Session在计算机中,尤其是网络应用中,被称为“会话控制”。Session对象可以存储用户在程序中的一些数据,用户在系统中不同的web页面之间进行跳转时,存储在Session中的数据不会丢失。当用户请求来自web页面时,如果该用户还没有会话,web服务器就会创建一个新的Session对象。当会话过期或者被放弃后,服务器将终止该会话。2. 和Cookie比较Session和Cookie都可以保存用

2022-01-07 14:51:58 8617 1

原创 图解四大IO模型与原理

io模型、io原理

2022-01-07 10:43:59 2096

原创 死磕Spring系列:Spring事件(Event)传播源码剖析

1. 关于事件(Event)通知什么是事件event即事件。每一个动作,每一步操作,都可以称之为事件。事件通知机制的作用可以将相互耦合的代码解耦,保持功能的单一职责原则。举个栗子:注册用户时,需要给用户发送邮箱验证及短信通知。最粗暴的方法就是将邮箱逻辑和短信逻辑内嵌到注册方法中,进行方法调用,如果后续对邮箱和短信逻辑有另外的操作,需要去对原有注册方法进行显示处理。这样子实现功能和代码结构没什么太大的问题,也比较简单,但是不太利于扩展,对于某些需要扩展性和松耦合的场景不太友好。在这样的场

2021-11-11 17:18:01 1145

原创 死磕Spring系列:ConfigurationClassPostProcessor源码解析

1. 源码解析ConfigurationClassPostProcessor在SpringBoot启动流程中的刷新上下文中被执行,作为BeanDefinitionRegistry的后置处理器主要用来扫描加载类到Spring容器中。ConfigurationClassPostProcessor作为BeanDefinitionRegistry后置处理器调用的方法: public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry

2021-10-26 16:44:25 228

原创 死磕Spring系列:BeanFactoryPostProcessors源码解析

1. 流程图解2. 源码解读 public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // 保存已经处理过的Bean Name Set<String> processedBeans = n

2021-10-25 16:31:46 287

原创 死磕Spring系列:SpringBoot2.4.5源码解析

本文基于SpringBoot2.4.5。1. 启动过程流程图2. 源码解析我们从一个SpringBoot的启动类自顶向下分析,常规的启动类是这样的(按照约定将此类放置在项目顶层包):package cn.javayuli;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.auto.

2021-10-25 16:28:33 467

原创 离线分析:Flume+Kafka+HBase+Hadoop通话数据统计

项目背景通信运营商每时每刻会产生大量的通信数据,例如通话记录,短信记录,彩信记录,第三方服务资费等等繁多信息。数据量如此巨大,除了要满足用户的实时查询和展示之外,还需要定时定期的对已有数据进行离线的分析处理。例如,当日话单,月度话单,季度话单,年度话单,通话详情,通话记录等等+。我们以此为背景,寻找一个切入点,学习其中的方法论。当前我们的需求是:统计每天、每月以及每年的每个人的通话次数及时长。项目架构说明:1、用户通过时,通过应用服务生成主叫、被叫、通话时间、通话时长等日志信息,日志信息打印到日

2021-05-24 14:56:03 4104 5

原创 任务调度器Azakaban3.80.1详细教程

Azkaban简介Azkaban是一个分布式工作流管理器,被LinkedIn用来解决Hadoop的作业依赖性问题。我们从ETL作业到数据分析产品中也有许多工作需要按照顺序运行。使用场景在大数据业务处理场景中,经常有这样的分析场景:任务A:将收集到的数据通过一系列的规则进行清洗,然后存入Hive表a中。任务B:将Hive中已存在的b表和c表进行关联得到表d。任务C:将A任务得到的表a与B任务得到的表d进行关联得到分析的结果表e。任务D:最后将Hive中得到的表e通过sqoop导入到关系型数据库

2021-04-30 14:40:47 1374

原创 实时分析:Flume+Kafka+SparkStreaming商品评分排行榜

写在前面接上一篇《Flume+Kafka数据采集与清洗》。本文主要介绍用流计算SparkStreaming对数据进行实时处理。流计算概念实时获取来自不同数据源的海量数据,经过实时 分析处理,获得有价值的信息流计算秉承一个基本理念,即数据的价值随着时间的流逝而降低, 如用户点击流。因此,当事件出现时就应该立即进行处理,而不是缓 存起来进行批量处理。为了及时处理流数据,就需要一个低延迟、可 扩展、高可靠的处理引擎对于一个流计算系统来说,它应达到如下需求:高性能海量式实时性分布

2021-04-29 10:43:28 882

原创 Flume+Kafka数据采集与清洗

项目说明实现功能模拟实时推荐系统中,数据实时采集与数据预处理,并用Kafka进行数据实时消费功能。实现场景用户对商品进行评分,后台实时对其进行获取与分析,并经过计算后,生成实时推荐结果。项目架构图主要工具说明FlumeFlume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。当前Flume

2021-04-26 15:25:52 3184

原创 Java版Spark离线统计分析实战

写在前面本文系统环境:在windows中安装VMware,VMware中装CentOS7.9.2009系统为。本文中需要用到的大数据组件有Hadoop、Spark及MongoDB数据库。均在CentOS中安装。本文中运行的程序是在windows中的Idea编辑器中进行编写,且为用Java编写,非Scala。版本说明Hadoop 2.10.1Spark 3.1.1MongoDB 3.4.3JDK 1.8功能概述本文设计两类信息,一类是产品信息,另一类是评分信息。产品产品id标

2021-04-23 17:28:01 909

原创 Storm0.9.6安装教程

分布式实时流计算框架Storm广泛应用于实时日志分析、个性化推荐、实时监控等应用场景中。本教程介绍了如何在单机上安装、运行Storm。环境说明组件版本CentOS 7.9.2009JDK 1.8Storm 0.9.6Zookeeper 3.6.3Pyhton 2.7CentOS 7.9.2009中自带python2.7,所以我们在安装Storm之前还需要安装JDK和Zookeeper。文中所有压缩包都是下载与解压到hadoop用户的家目录(/home/hadoop)中。JDK.

2021-04-19 14:43:07 316

原创 Spark3.1.1入门

写在前面说明Spark可以独立安装试使用,也可以和Hadoop一起安装使用。本文为配合Hadoop使用,这样就可以让Spark使用HDFS存取数据。组件版本CentOS 7.9.2009Hadoop 2.10.1JDK 1.8Spark 3.1.1相关组件安装下面贴出上述组件安装博客,方便有需要的读者。VMware安装Centos7并联网使用分布式处理框架Hadoop的安装与使用本例中,我们不再赘述其他组件的安装。在开始安装Spark前,我们使用安装Had

2021-04-16 13:56:09 1298

原创 MapReduce程序在Idea中的开发与调试

一、环境说明系统:Win10Hadoop版本:2.10.1JDK:1.8二、环境准备1、下载hadoop下载链接hadoop 2.10.1。下载后用解压到本地。2、下载winutils下载链接winutils,下载完成后解压到本地,然后复制hadoop对应版本或就近版本的文件夹中的hadoop.dll与winutils.exe文件到hadoop的bin目录中去。3、配置环境变量新建环境变量HADOOP_HOME,值为hadoop文件夹的位置添加变量到PATH4、最好需要重启

2021-04-12 14:30:44 1584 2

原创 SpringCloud整合Seata1.4.0

版本说明本例于windows基于Nacos配置注册、MybatisPlus、Hikari数据源,数据库为Mysql,示例代码为Seata的AT模式。案例代码GitHub地址spring-cloud-demo具体版本:seata 1.4.0SpringBoot 2.3.6.RELEASESpringCloud Hoxton.SR9SpringCloudAlibaba 2.2.3.RELEASEMybatisPlus 3.3.2下载资源从Seata Release下载目

2021-01-30 19:45:05 2787 5

原创 SpringCloudAlibaba之Seata分布式事务

Seata 是什么?Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。AT 模式前提基于支持本地 ACID 事务的关系型数据库。Java 应用,通过 JDBC 访问数据库。整体机制两阶段提交协议的演变:一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志

2021-01-30 19:43:45 414 3

原创 SpringCloudGateway初探

简述SpringCloud全家桶中有个很重要的组件就是网关,在1.X版本中都是采用zuul网关,在2.X版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替带zuul——SpringCloud Gateway 。换言之,gateway就是原zuul1.X版 的替代。Gateway是在spring生态系统上构建的api网关服务,基于Spring5,SpringBoot2和Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对api进行路由,以提供一些

2021-01-30 19:41:44 571 1

原创 SpringCloudAlibaba之Sentinel流控熔断

Sentinel 的使用可以分为两个部分:核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。控制台(Dashboard):控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。1. 引入 Sentinel 依赖<dependency> <groupId>com.alibaba.cloud</groupId>

2021-01-05 18:39:20 756

原创 SpringCloudAlibaba之Sentinel介绍

Sentinel 是什么随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。Sentinel 的历史2012 年,Sentinel 诞生,主要功能为入口流量控制。2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践

2021-01-05 18:38:43 697

原创 SpringCloudAlibaba之Nacos配置Mysql数据库

Surport Mysql在0.7版本之前Nacos是不支持Mysql数据库的,是使用的本地的derby数据库。这样虽然方便,不用进行额外的配置,但是不能很好的观察到数据的基本情况,也就是不好可视化。在0.7及之后,Nacos支持外部Mysql数据库存储数据,这可以在nacos release中找到公示。Config Mysql本文以Nacos1.3.2为例,首先在nacos release下载1.3.2的压缩包,下载解压后找到/conf/nacos-mysql.sql在数据库新建一个数据库,并导

2021-01-05 18:35:57 1814

原创 SpringCloudAlibaba之Nacos配置与注册

初始化项目编辑器:IDEA系列源代码GitHub地址spring-cloud-demo创建父项目File->New->Project父项目引入依赖注意添加<packaging>pom</packaging><?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/

2021-01-05 18:35:10 867

原创 SpringCloudAlibaba之NacosServer

Nacos Server1.版本选择可以在Nacos的Nacos release中找到每个版本发行的日志,当前推荐的稳定版本1.3.1。2.环境配置Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。64 bit JDK 1.8+;下载 & 配置。Maven 3.2.x+;下载 &

2021-01-05 18:34:17 770

原创 基于Hexo快速搭建个人博客网站

网站示例:与李的个人博客一、搭建GithubPages1、在GitHub上创建一个名为"yourname.github.io"的仓库如我的GitHub账户名称为hanguilin,那么我就需要创建一个名为hanguilin.github.io的仓库2、进入仓库,进入Settings找到GitHub Pages第一部分是个人主页访问地址,初始化应该为http://yourname.github.io。第二部分是表示网站根目录/与gh-pages分支进行关联。第三部分是选择GitHub自.

2020-12-26 16:27:29 444 1

原创 SpringCloudAlibaba之Nacos初探

什么是 Nacos概览欢迎来到 Nacos 的世界!Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。什么是 Nacos?服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:K

2020-12-26 16:19:26 351

原创 ELK分布式日志解决方案

一、简介ELK,包含三个产品,Elasticsearch、Logstash、Kibana。在整个方案中,他们起到的作用如下:应用服务生产日志,通过Logger产生日志并输出。Logstash收集日志,通过http接收应用服务产生的日志。Elasticsearch为日志提供全文检索功能。kibana为Elasticsearch提供图形化界面。二、安装过程环境本文使用docker-compose启动elk,所以需要先安装好docker与docker-compose。教程分

2020-09-28 17:43:32 11468 2

原创 docker-compose配置gitlab与nginx使用https协议进行代码管理

本文介绍的是在通过编写docker-compose.yml文件启动gitlab服务,并使用https协议进行代码的加密传输。环境:阿里云centos7.3服务器;docker 18.03.1-ce;gitlab-ce-zh。本服务器绑定了域名code.example.com。相关文章链接:《还不会安装docker?这里帮你搞定》、《如何安装docker-compose》。阿里云的https申请需要在阿里云控制台进行申请,然后可以下载配置nginx的秘钥。最终可以得到两个文件,一个是***.pe.

2020-09-15 14:16:04 2784 1

原创 如何安装docker-compose

下载离线包网址:https://github.com/docker/compose/releases 建议找到下载链接后使用迅雷新建下载,这样能解决GitHub下载慢的问题。 然后将二进制文件上传到/usr/local/bin目录。 使用mv命令重命名:$ mv /usr/local/bin/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose 再授予可执行权限:$ chmod +x /usr/local/bin/docke.

2020-09-15 13:43:38 2106

原创 Idea携带证书连接远程docker

说明:本文与《docker remote api一键TSL加密》具有一定的关联性,下文中引用到的内容都会被单独标注出来。先决条件:docker开启了远程接口功能$ vim /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd \ --tlsverify \ --tlscacert=/root/tls/pem/ca.pem \ --tlscert=/root/tls/pem

2020-09-14 14:50:00 2745

原创 从源码角度理解spring.factories

本文中SpringBoot版本为2.3.2.RELEASE在阅读SpringBoot相关源码时,经常会看到resocures/META-INF文件夹下的spring.factories文件,里面写了自动配置(AutoConfiguration)相关的类名。因此产生了一个疑问:“已经给类打上了@Configuration,为什么还要写spring.factories这个文件?”想要弄清楚这个问题,得从@SpringBootApplication这个启动类上的注解开始。查看@SpringBootA.

2020-09-12 10:36:29 1853

原创 消息队列使用场景

一、异步处理在一些场景中,为了让用户得到更快的体验,往往会使用一些异步调用的手段使得响应时间更快。举一个大家都很熟悉的例子:用户注册时,将用户信息写入数据库后,还要给用户发送注册邮件与注册短信。流程图:按照上图的设计模式,用户的到响应的时间为t1+t2+t3。思考一下,其实发送邮件和短信与下一步程序处理没有逻辑关系。所以用户完全不需要等待他们执行完才得到响应。这时可以考虑将t2与t3这段逻辑异步处理,这样用户就只需要等待t1时间就能快速得到响应。异步处理可以用异步线程,也可以用消息队列。但是

2020-09-11 15:54:32 1571

demo-cloud.rar

《从零到一搭建一个SpringCloud2.0项目》案例代码,适合SpringCloud初学者,内含SpringCloud项目基本结构与引用包

2020-07-21

SpringDataJPA实例

《你真的了解Jpa吗?》案例代码,内有SpringBootJPA的入门例子,包括增删改查一级实体关联关系处理。

2020-07-19

threadlocal.rar

《ThreadLocal究竟是个啥?》案例代码,讲述了ThreadLocal的概念使用,解答了ThreadLocal在父子线程中通信问题。

2020-07-18

博客《分布式数据库HBase实践指南》案例代码

博客《分布式数据库HBase实践指南》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。

2020-07-01

《你想了解的分布式文件系统HDFS,看这一篇就够了》案例代码

博客《你想了解的分布式文件系统HDFS,看这一篇就够了》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。

2020-06-14

理解Spring AOP实现与思想 案例代码

博客《理解Spring AOP实现与思想》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。

2020-06-06

SpringBoot+Shiro+JPA+LayUI的后台管理系统

本系统是一个用SpringBoot做后台开发框架,Shiro做权限管理框架,Spring Data Jpa 做持久层框架,Layui、Layui mini做为前端框架的前后端分离的项目。 即拿即用,上手即会,可以方便你快速的开发一套属于自己的系统。

2019-12-27

tomcat+redis+nginx实现session共享所需jar包

tomcat+redis+nginx实现session共享所需jar包,包含commons-pool2-2.4.2.jar、jedis-2.8.0.jar、tomcat-redis-session-manager-2.0.0.jar

2019-11-28

jquery和css3右侧圆点单页滚动垂直固定侧边栏导航

jquery和css3右侧圆点单页滚动垂直固定侧边栏导航,精美模板

2019-03-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除