自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

山楂小王的博客

21 The best PF of all time 22 多一点计划 47 少一点操劳》》》https://github.com/wj89757

  • 博客(66)
  • 资源 (2)
  • 收藏
  • 关注

原创 xxl-job的搭建以及部署

0. 什么是xxl-jobXXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。1. 文档地址1. xxl-job开发文档2.xxl-job社区交流1. 配置xxl-job-admin1. 修改application.properties主要修改下面几个配置server.port=8017server.servlet.context-path=/newjobspring.datasource

2020-07-26 20:59:18 5529

原创 Java锁比较全的入门整理

一、锁的7大分类需要首先指出的是,这些多种多样的分类,是评价一个事物的多种标准,比如评价一个城市,标准有人口多少、经济发达与否、城市面积大小等。而一个城市可能同时占据多个标准,以北京而言,人口多,经济发达,同时城市面积还很大。同理,对于 Java 中的锁而言,一把锁也有可能同时占有多个标准,符合多种分类,比如 ReentrantLock 既是可中断锁,又是可重入锁。根据分类标准我们把锁分为以下 7 大类别,分别是:偏向锁/轻量级锁/重量级锁;可重入锁/非可重入锁;共享锁/独占锁;公平锁/非公

2020-07-26 20:57:48 484

原创 2W字长文吐血整理 Docker&云原生

Docker 和 云原生一、概念介绍1.1 DockerDocker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker历史软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来比如你编写了一个Web应用,本地调试没有问题,想发给你的朋友看看或者部署到远程服务

2022-03-10 20:06:04 2376

原创 聊聊接口幂等性

一、什么是幂等性幂等性是系统服务对外一种承诺,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。二、接口幂等性对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性。维基百科上的定义:幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。**在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。**幂等

2020-10-19 23:28:27 461

原创 这可能是Redis比较全的知识整理

Redis和zookeeper做分布式锁的区别,redis为什么适合做分布式锁,它又存在什么问题todoRedis如何实现mq的功能todoRedis实现的消息队列功能和mq有什么区别todoredis单线程为什么执行速度这么快?(1):纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快(2):单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考

2020-10-19 23:24:48 205

原创 这可能是Solr比较全的知识整理

Solr介绍Solr是建立在Apache Lucene ™之上的流行,快速,开放源代码的企业搜索平台。Solr具有高度的可靠性,可伸缩性和容错性,可提供分布式索引,复制和负载平衡查询,自动故障转移和恢复,集中式配置等。Solr为许多世界上最大的互联网站点提供搜索和导航功能。文档Solr官网Solr8.3官方文档Solr W3Cschool官方文档用法SolrJSolrJ是一个API,它使用Java(或任何基于JVM的语言)编写的应用程序可以轻松地与Solr交谈。SolrJ隐藏了许多连接到So

2020-10-19 23:23:11 4455

原创 这可能是MyBatis比较全的知识整理

MyBatis编程步骤是什么样的创建SqlSessionFactory通过SqlSessionFactory创建SqlSession通过sqlsession执行数据库操作调用session.commit()提交事务调用session.close()关闭会话Mybatis原理sqlsessionFactoryBuilder生成sqlsessionFactory(单例)工厂模式生成sqlsession执行sql以及控制事务Mybatis通过动态代理使Mapper(sql映射器)接口能运行

2020-10-19 23:14:53 133

原创 Java面试软技能相关问题

怎么保证服务高可用冗余 + 故障转移MySQL主从架构服务超时机制平时怎么学习制定自己的成长计划,给自己人生定一个方向,达成这个方向我需要做哪些事情每年制定自己的todo list,今年我对自己的要求是(1.了解JVM和一个框架系统的学习和掌握源码,2.要产出博客,定时总结)然后制定学习计划,计划每天按照进度学习渠道:看正确的书,选一些传播度和影响力比较好的书;看视频学习,去了解用法;看github一些用法积累和总结:在平台去发布自己根据看书总结的文章,印象笔记总结最近在学习的一

2020-10-19 23:12:51 270 1

原创 这可能是Java并发比较全的知识整理

如何优雅的创建线程池Excutor会产生OOM异常,FixedThreadPool和SingleThreadExecutor => 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而引起OOM异常CachedThreadPool => 允许创建的线程数为Integer.MAX_VALUE,可能会创建大量的线程,从而引起OOM异常ScheduledExecutorServicenew ThreadFactoryBuilder()ThreadPoo

2020-10-19 23:09:11 111

原创 这可能是Java容器比较全的知识整理

LinkedHashMap底层数据结构?能够实现LRU吗?LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。重新了newNode构建自己的节点对象。put方法中LinkedHashMap重写了afterNodeInsertion和afterNodeAccess方法。public class LRUCache<K,V> extends LinkedHashMap<K,

2020-10-19 23:07:45 106

原创 这可能是MySQL比较全的知识整理

MySQL索引什么是索引高效获取数据的数据结构,相当于书的目录,使用B+树结构,索引是存储在磁盘文件中的(可能单独的索引文件中,也可能和数据一起存储在数据文件中)索引的分类单列索引普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。唯一索引:索引列中的值必须是唯一的,但是允许为空值。主键索引:是一种特殊的唯一索引,不允许有空值组合索引在表中的多个字段组合上创建的一个索引组合索引的使用,需要遵循最左前缀原

2020-10-19 23:05:30 268 2

原创 这可能是JVM比较全的知识整理

Java内存结构线程私有的:程序计数器(当前线程所执行的字节码的行号指示器)虚拟机栈(每次方法调用的数据都是通过栈传递的。局部变量表/对象引用/实例方法)本地方法栈(有一个native关键字修饰,而且不存在方法体,这种用native修饰的方法就是本地方法)线程共享的堆(栈管运行,堆管存储,堆是垃圾收集器管理的主要区域)方法区(存放类的元数据信息,常量和静态变量)直接内存(非运行数据区的一部分)Java内存模型概念Java内存模型(Java Memory

2020-10-19 23:02:04 278 1

原创 这可能是Spring比较全的知识整理-2

Spring的Bean怎么动态加载使用 BeanDefinitionBuilder注册bean(BeanDefinitionBuilder.rootBeanDefinition),添加属性&注册bean,beanFactory.registerBeanDefinition(“testBean”, b1.getBeanDefinition());使用 BeanFactoryPostProcessor注册bean。BeanFactoryPostProcessor允许自定义BeanDefinitio

2020-09-19 23:26:37 146

原创 这可能是Java基础比较全的知识整理

动态代理和静态代理静态代理定义一个接口及其实现类;创建一个代理类同样实现这个接口将目标对象注注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。动态代理JDK 动态代理在 Java 动态代理机制中 InvocationHandler 接口和 Proxy 类是核心。Proxy类中使用频率最高的方法是:newProxyInstance()` ,这个方法主要用来生成一个代理对.

2020-09-19 23:09:41 112

原创 这可能是分布式比较全的知识整理

分布式事务基于MQ的可靠事务消息消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤MQ删除消息生产者发送一个半消息broker接收到消息并持久化后响应ACK执行本地事务,本地事务

2020-09-19 21:59:37 209

原创 这可能是Dubbo比较全的知识整理

一、Dubbo的provider和consumer都配置timeout在Provider上尽量多配置Consumer端属性,原因如下:作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的配置的覆盖规则:方法

2020-09-13 22:33:08 243

原创 这可能是Spring比较全的知识整理

Spring的Bean怎么动态加载使用 BeanDefinitionBuilder注册bean(BeanDefinitionBuilder.rootBeanDefinition),添加属性&注册bean,beanFactory.registerBeanDefinition(“testBean”, b1.getBeanDefinition());使用 BeanFactoryPostProcessor注册bean。BeanFactoryPostProcessor允许自定义BeanDefinitio

2020-09-13 22:22:17 99

原创 YApi结合xxl-job自动化测试

一、YApi介绍YApi旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,包括提供了一系列可视化接口管理,还有自动化测试1.1 自动化测试的场景及缺点传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的。YApi 为了解决这个问题,开发了可视化接口自动化测试功能,只需要配置每个接口的入参和对 RESPONSE 断言,即可实现对接口的自动化测试。而且大部分接口支持Swagger导入或者从Idea

2020-08-06 22:13:33 759

原创 MyBatis如何解析mapper和Spring中@MapperScan原理

我们在启动项目的时候,spring就会帮我们实例化好bean,那我们使用mybatis-spring的时候,编 写的maper是怎么交给spring容器的呢?这就是今天要探讨的问题。一、MyBatis1.1 MyBatis简介MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Ol.

2020-08-03 22:03:03 1053

原创 Redis从入门到深入-高级数据类型(21)

1. Bitmaps1.1 Bitmaps类型的基础操作获取指定key对应偏移量上的bit值getbit key offset设置指定key对应偏移量上的bit值, value 只能是1或 0setbit key offset value1.2 Bitmaps类型的扩展操作业务场景-电影网站统计每天某一部电影是否被点播统计每天有多少部电影被点播统计每周/月/年有多少部电影被点播统计年度哪部电影没有被点播业务分析1.3 Bitmaps类型的扩展操作

2020-08-03 22:01:36 120

原创 Redis从入门到深入-布隆过滤器(20)

1. 布隆过滤器前言不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,在面试中面试官问到怎么避免缓存穿透,你的第一反应可能就是布隆过滤器,缓存穿透=布隆过滤器成了标配,但具体什么是布隆过滤器,怎么使用布隆过滤器不是很清楚,那今天我们就来把他说清楚,讲明白。。1.1 缓存穿透大家看下这幅图,用户可能进行了一次条件错误的查询,这时候redis是不存在的,按照常规流程就是去数据库找了,可是这是一次错误的条件查询,数据库当然也不会存在,也不会往redis里面写值,返回给用户一个空,这样的操作一次

2020-07-29 23:36:47 225

原创 Redis从入门到深入-服务端配置(19)

1. 服务端设定设置服务器以守护线程的方式运行daemonize yes|no绑定主机地址bind 127.0.0.1设置服务端口号port 6379设置数据库数量databases 162. 日志配置设置服务器以指定日志记录级别loglevel debug|verbose|notice|warning日志记录文件名logfile 端口号.log注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,降低写日志io的频度3

2020-07-29 23:35:41 121

原创 Redis从入门到深入-删除策略(18)

1. 删除策略1.1 过期数据redis中的数据特征redis是一种内存级数据库, 所有数据均存放在内存中, 内存中的数据可以通过TTL指令获取其状态XX:具有时效性的数据-1:永久有效的数据-2:已经过期的数据或被删除的数据或未定义的数据过期的数据真的删除了吗?1.2 数据删除策略1.定时删除2.惰性删除3.定期删除1.3 时效性数据的存储结构1.4 数据删除策略的目标在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降, 甚

2020-07-29 23:34:59 148

原创 Redis从入门到深入-锁(17)

1. 锁1.1 基于特定条件的事务执行业务场景天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系列的操作,牵扯到多个连续操作,如何保障不会重复操作?业务分析多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作在操作之前锁定要操作的数据,一旦发生变化,终止当前操作解决方案对key添加监视锁, 在执行exec前如果key发生了变化, 终止事务执行watch key1 [key2.....]

2020-07-29 23:34:15 125

原创 Redis从入门到深入-Redis-事务(16)

1. 事务简介1.1 什么是事务redis执行指令过程中, 多条连续执行的指令被干扰, 打断, 插队redis事务就是一个命令执行的队列, 将一系列预定义命令包装成一个整体(一个队列) 。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。一个队列中,一次性、顺序性、排他性的执行一系列命令1.2 事务的基本操作-开启开启事务multi作用设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中1.3 事务的基本操作-关闭执行事务exec作用设

2020-07-29 23:33:40 124

原创 Redis从入门到深入-Redis持久化-RDB&AOF(15)

1. RDB与AOF区别1.1 RDB与AOF的选择之惑对数据非常敏感, 建议使用默认的AOF持久化方案AOF持久化策略使用everysecond,每秒钟fsync一次。该策略redis仍可以保持很好的处理性能,当出现问题时,最多丢失0-1秒内的数据。注意:由于AOF文件存储体积较大, 且恢复速度较慢数据呈现阶段有效性, 建议使用RDB持久化方案数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的,且恢复速度较快,阶段点数据恢复通常采用RDB方案注意:利用RDB实

2020-07-29 23:31:15 133

原创 Redis从入门到深入-Redis持久化-AOF(14)

1. RDB的弊端弊端存储数据量较大,效率较低基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低大数据量下的IO性能较低基于fork创建子进程, 内存产生额外消耗宕机带来的数据丢失风险解决思路不写全数据,仅记录部分数据改记录数据为记录操作过程对所有操作均进行记录,排除丢失数据的风险2. AOF概念AOF(append only file) 持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中命令,达到恢复数据的目的。与RDB相比可

2020-07-29 23:30:59 124

原创 Redis从入门到深入-Redis持久化-RDB(13)

1. 持久化简介1.1 什么是持久化利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。1.2 为什么要进行持久化防止数据的意外丢失,确保数据安全性1.3 持久化过程保存什么将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程2. RDB-启动save2.1 谁,什么时间,干什么事情谁:redis操作者(用户)什么时间:即时(随时进行)

2020-07-29 23:29:19 139

原创 Redis从入门到深入-Java操作Redis(12)

1. Jedis1.1 Jedis简介Java语言连接redis服务JedisSpringData RedisLettuceC、C++、C#、Erlang…1.2 HelloWord(Jedis版)连接redisJedis jedis = new Jedis(“localhost”, 6379);操作redisjedis.set("name","test");jedis.get("name");关闭redis连接jedis.close();1.3

2020-07-29 23:29:00 156

原创 Redis从入门到深入-Key通用操作(11)

1. key通用操作1.1 key特征key是一个字符串, 通过key获取red is中保存的数据1.2 key应该设计哪些操作?对于key自身状态的相关操作, 例如:删除, 判定存在, 获取类型等对于key有效性控制相关操作, 例如:有效期设定, 判定是否有效, 有效状态的切换等对于key快速查询操作, 例如:按指定策略查询key1.3 key基本操作删除指定keydel key获取key是否存在exists key获取key的类型type key

2020-07-29 23:26:39 141

原创 Redis从入门到深入-Redis数据类型实践案例(10)

1. 数据类型实践案例1.1 业务场景人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用1.2 解决方案设计计数器, 记录调用次数, 用于控制业务执行次数。以用户id作为key,使用次数作为value在调用前获取次数,判断是否超过限定次数不超过次数的情况下,每次调用计数+1业务调用失败,计数-1为计数器设置生命周期为指定

2020-07-28 09:06:04 151

原创 Redis从入门到深入-sorted_set实现实时订阅推送(09)

1. 问题分析有一个功能叫做领劵的订阅推送。什么是领劵的订阅推送?就是用户订阅了该劵的推送,在可领取前的一分钟就要把提醒信息推送到用户的app中。本来这个订阅功能应该是消息中心那边做的,但他们说这个短时间内做不了。所以让我这个负责优惠劵的做了-.-!。具体方案就是到具体的推送时间点了,coupon系统调用消息中心的推送接口,把信息推送出去。下面我们分析一下这个功能的业务情景。公司目前注册用户6000W+,是哪家就不要打听了。。。比如有一张无门槛的优惠劵下单立减20元,那么抢这张劵的人就会比较多,我们保守

2020-07-28 09:04:09 193 1

原创 Redis从入门到深入-Sorted_set的value(08)

1. sorted_set 类型新的存储需求,数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式需要的存储结构:新的存储模型,可以保存可排序的数据sorted_set类型:在set的存储结构基础上添加可排序字段2. sorted_set 类型数据的基本操作2.1 操作添加数据zadd <key> <score1> <member1> [score2 member2]获取全部数据zrange <key>

2020-07-28 09:03:49 145

原创 Redis从入门到深入-Set的value(07)

1.set类型1.1 set类型来源新的存储需求:存储大量的数据,在查询方面提供更高的效率需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询set类型:与hash存储结构完全相同,仅存储健,不存储值(nil),并且值是不允许重复的1.2 set类型数据的基本操作添加数据sadd <key> <member1> [member2]...获取全部数据smembers <key>删除数据srem <key>

2020-07-28 09:02:35 388

原创 Redis从入门到深入-List的value(06)

1. list类型1.1 List类型数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序list类型:保存多个数据,底层使用双向链表存储结构实现1.2 list类型数据基本操作添加/修改数据lpush <key> <value1> [value2]...rpush <key> <value1> [value2]...获取数据lrange &lt

2020-07-28 09:01:57 206

原创 Redis从入门到深入-Hash的value(05)

2. hash类型2.1 存储的困惑对象类数据的存储如果具有较频繁的更新需求操作会显得笨重2.2 hash类型新的存储需求,对一系列的存储的数据进行编组,方便管理,典型应用存储对象信息需要的存储结构:一个存储空间保存多个键值对数据hash存储结构优化如果field数量比较少,存储结构优化为类数组结构如果field数量比较多,存储结构使用HashMap结构2.3 hash类型数据的基本操作添加/修改数据hset <key> <field&g

2020-07-28 09:01:36 360

原创 Redis从入门到深入-Redis的字符串具体实现(04)

1. Redis的字符串实现Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能,可以看出Redis为了高性能也是煞费苦心。Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS1.1 SDS 代码结构Redis的字符串也会遵守C语言的字符串的实现规则,即最后一个字符为空字符。然而这个空字符不会被计算在len里头。struct sdshdr{ // 记录已使用长度 int l

2020-07-28 08:59:50 101

原创 Redis从入门到深入-String的value(03)

1. string类型1.1 redis数据存储类型redis本身是一个Map,其中所有的数据都是采用key:value的形式存储数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串1.2 string类型存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型存储数据的格式:一个存储空间保存一个数据存储内容:通常使用字符串,如果字符串以整数形式展示,可以作为数字操作使用1.3 基本操作添加/修改数据set key value

2020-07-28 08:59:26 311

原创 Redis从入门到深入-Redis的安装(02)

1. 基于Linux环境安装Redis1.1 基于Cent OS7安装Redis下载安装包wget http://download.redis.io/release/redis-?.?.?.tar.gz解压tar -xvf 文件名.tar.gz编译make安装make install1.2 Redis服务启动默认配置启动redis-serverredis-server --port 6379redis-server --port 6380指定配置文件启动redis

2020-07-28 08:56:06 71

原创 Redis从入门到深入-简介(01)

1. Redis1. 概念Redis(REmote DIctionary Server)是用C语言开发的一个开源的高性能键值对(key-value)数据库简单来说redis就是一个数据库,不过与传统数据库不同的是 redis的数据是存在内存中的,所以读写速度非常快,因此 redis被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis提供了多种数据类型来支持不同的业务场景。除此之外,redis支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。2. 特征数据间没有必然

2020-07-28 08:55:10 85

无人值守的自动化测试的实践之路.pdf

2020阿里巴巴研发效能峰会-无人值守的自动化测试的实践之路,如何更好的进行自动化测试,阿里巴巴自动化测试的探索道路

2020-07-26

网上订票系统

自己做的网上订票系统~有详细的数据库介绍 和关于做法

2015-06-17

空空如也

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

TA关注的人

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