自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 资源 (3)
  • 收藏
  • 关注

原创 接口请求报ConstraintDeclarationException异常

当 AdvertiserCompanySdkService 接口的 batchUpdate 方法没有验证注解,但实现类 AdvertiserCompanySdkServiceImpl 的对应方法有 @Valid @NotNull 注解时,就会抛出 ConstraintDeclarationException。在 AdvertiserCompanySdkService 接口的所有方法参数上添加了 @Valid @NotNull(message = “Request cannot be null”) 注解。

2025-11-12 11:18:43 201

原创 高可用与高性能数据库配置实践分析(pgSql && clickhouse)

ClickHouse 连接池可共用 HikariCP,保持统一监控接口。分析型查询建议采用只读事务,以提高调度效率。对大规模查询可启用异步查询或 HTTP streaming。模块 角色 优势 风险控制PostgreSQL 主事务库 强一致性、高安全 控制连接池、监控慢查询ClickHouse 报表分析库 高吞吐、列式存储 防止频繁写入、小事务操作HikariCP 连接池组件 稳定、可观测、低延迟 合理配置超时与泄露检测。

2025-11-12 09:40:08 1018

原创 李沐深度学习笔记D3-基础的优化方法

求梯度的过程其实就是求导的过程,而我们的深度学习框架中集成了帮我们自动求导的函数,所以我们经常不需要关心具体的求导逻辑,只需要使用就可以了。为了控制成本,我们会进行小批量随机计算梯度,并用梯度下降的方向进行模型的优化批量的大小和学习率的设置要适度,后续会具体学习如何设置合适的批量大小和学习率。

2025-11-11 18:32:53 182

原创 李沐深度学习笔记D3-线性回归

神经网络来源于神经科学举例两个真实的神经元之间的通信,首先一个负责感知的神经元,它的神经末梢感知不同神经信号或者元素,将其输入到神经元中心进行计算,并将计算的结果进行输出,通过连接推送给下一个神经元,在连接中也会有一些判断和识别,比如达到某种阈值才能通过传输;这是传统的神经科学,人们通过神经科学的发展,也逐步想到能否我们自己造一个人工的神经元,通过对不同元素进行不同权重的计算,获取到我们想要的结果,这就是神经网络的诞生原因。

2025-11-11 17:31:08 315

原创 李沐深度学习笔记D2-矩阵计算

首先我用gpt5查了梯度的含义,梯度在这里可以指代为一个函数或者曲线上升最快的方向,比如一个曲线在上升,利用高中的知识,x轴偏移量非常小的情况下,y轴偏移量除以x轴偏移量应该可以用来当作导数也就是上升的趋势,那么梯度就是正好和上升的趋势的指向的向量成90度角分布的那个向量,也就是可以代表上升最快的那个趋势向量,如果想要延缓上升的趋势,那么我们就可以用梯度向量的正相反的趋势向量去发展这个函数,这就是梯度下降,可以有效的延缓上升的趋势。如上图,如果y是一个标量,u也是一个标量,x是一个向量。

2025-11-06 21:28:52 984

原创 物化视图和普通视图的对比和使用场景

对比项 普通视图(View) 物化视图(Materialized View)定义 逻辑层的“虚拟表”,保存的是查询语句 物理层的“缓存表”,保存的是查询结果是否存储数据 ❌ 不存储数据 ✅ 存储数据(结果集被落地)数据更新方式 查询时实时从原表取数据 可配置为自动或手动刷新性能 实时、但慢(每次都执行原查询) 读快(预计算结果),但有延迟存储空间 几乎不占 占用存储(因为保存了数据)一致性 实时一致 延迟一致(取决于刷新策略)

2025-11-05 09:27:29 1220

原创 clickhouse和pgSql跨库查询方案对比

💡 底层原理:ClickHouse 通过 PostgreSQL 引擎或 postgresql() 函数,在查询时建立 TCP 连接,实时从 PG 读取数据并参与查询计算。它不是复制数据,而是“实时拉取 + 按需处理”。方案 是否实时 是否持久化 适用场景PostgreSQL ENGINE ✅ ❌ 实时跨库联查postgresql() 函数 ✅ ❌ 临时查询Dictionary 定期刷新 ✅ 小表维度缓存定期同步 ❌(准实时) ✅ 大表分析场景。

2025-11-05 09:00:33 1157

原创 李沐深度学习笔记D1-数据操作

将文件或者数据预处理为特征向量,类似数据字段平铺比如:表格中的数据转为特征向量转换为多维数组。

2025-11-04 21:27:11 380

原创 李沐深度学习笔记D1-什么是深度学习

举例说明:图片分类、图片识别、图片滤镜、人脸识别、人脸照片合成、文字生成图片、文字生成(对话问询)、无人驾驶(计算机视觉将前方的物体识别、道路识别并规划行车路线)3-计算每个广告的点击率*用户点击广告平台的收益,按照这个进行排序,排名高的排在前面。1-会先根据输入的内容模糊查询所有关联的广告(通过文案模糊搜索、分类匹配等)数据科学家负责将用户对广告的展现和点击训练成数据模型。数据模型计算出更推荐的广告给领域专家/用户。再根据专家/用户的选择进一步训练模型。2-深度模型分析每个广告的点击率。

2025-11-04 14:05:54 311

原创 李沐深度学习笔记D1-环境和笔记

它既包含一个 Python 解释器,也能 创建、管理多个不同版本的 Python 环境。等等等等跟着教程来,我有python环境了所以不再赘述,有问题可以直接和技术支持交流。Dive into Deep Learning 知名深度学习教材和代码示例。Miniconda 是一个带有 Python 的环境管理工具。教材 https://zh.d2l.ai/

2025-11-04 10:29:50 254

原创 flink学习与如何在springboot项目中使用flink

flink:Apache Flink 一种流式计算框架,高吞吐低延迟的数据处理方案原理:把所有数据视为流,由事件驱动,每次事件到达触发计算与传统批处理的区别:Hadoop/Spark batch 固定数据集处理任务,任务所有逻辑执行完成一次提交主要使用场景:高实时性业务(监控告警、风控、推荐、广告投放、实时数仓)在项目中集成flink-示例:动态统计5min内的点击数(强实时性统计,差一秒可能数据变更都非常大)首先在pom中添加依赖 - 举例在kafka信息流中计算。

2025-10-31 11:40:29 747

原创 from中烟科技&&翼支付 面试题2

wait()方法必须在synchronized代码块中,否则会抛出异常,调用wait方法后,会释放掉对象锁,使其他线程能获取到该对象的对象锁,一直到使用notify()唤醒线程;一般是用线程池,方便管理。线程间的通信方式:多个线程共享同一份资源,同时使用synchronized来保证互斥,使用wait()释放锁,让其他线程获取锁和资源,等待其他线程使用完之后,通过notify()或者notifyAll()唤醒当前线程。hashMap是无序的,因为数据是根据哈希值确定的位置,不是根据集合下标的顺序存储的;

2025-08-26 18:59:09 394

原创 from中烟科技&&翼支付 面试题1

我们订单提单支付的基本流程,是用户点击支付后,会首选弹出京东收银台,收银台底层对接的支付服务(微信、各类型银行卡、白条、E卡),选择支付方式,点击支付,订单状态更新为支付中,再调用支付服务进行支付,支付完成更新台账信息,订单中心接收对账完成消息后更新订单状态为待打印/待出库等后续状态。我做了很多功能,拿订单中心模块来讲,分为两部分,一部分是C端订单中心,主要功能是在用户购物车结算模块之后的订单流程,正向包括订单列表、订单详情、订单搜索、订单支付、确认收货、门店自提等功能,逆向包括取消订单、申请售后等功能;

2025-08-26 18:09:43 1026

原创 牛客面经2 京东社招-002

容器中将已创建但还未初始化的中间态对象存储到二级换存中,当对象初始化完成,将完成的对象存储到一级缓存中,三级缓存则存储一些接口类、工厂类和扩展点,在创建B对象的时候就可以使用三级缓存中的引用,找到二级缓存中未初始化完成的A,先完成B的创建,再完成A的初始化,实际上三级缓存的作用就是将还未初始化完成的对象存储并暴露出来使用。我用到过的是 required_new,这种一般用作像日志打印这种,不管外部有没有事务,我都希望日志打印出来,就在内部方法的事务上配置上这种传播机制,其实就是内部的独立事务。

2025-08-23 18:31:56 781

原创 牛客面经2 京东社招-001

es的索引使用的就是倒排索引,es在存储数据时,会将数据通过分词器分成多个分词,然后将每个分词生成对应的索引,索引里存储了这个分词出现在哪个文档、出现的次数、出现的位置,这样我们就能通过关键字迅速查找倒对应的索引,再从索引找到对应的文档和文档中关键词出现的位置,找到对应的数据。功能上网关主要是用来进行流量治理的,堆接口做统一的鉴权、限流、熔断等操作,一般连接的是外部的服务或者前端的app,而注册中心主要进行服务的治理,存储和路由服务的地址和参数,两者功能不一样,墙和融合会导致代码臃肿和耦合;

2025-08-23 16:51:44 332

原创 牛客面经1 滴滴社招-002

我们一般用的都是异步同步数据的方法,监听binlog数据库变更日志,异步更新数据到es,这种对数据库性能影响较小,虽然有一定的数据延迟,通常也不会很长,一般都在1s内。es在数据存储的时候会将数据分词,比如 i live in Beijing,分词成 i live beijing这三个分词,存储的时候会将这三个分词所在的文档的地址、在文档中出现次数和在文档中出现的位置存储为倒排列表,将倒排列表的集合存储为倒排文件,查询的时候只需要通过关键词匹配到对应的索引,就能找到关键词出现的所有文档及文档中数据的位置。

2025-08-22 17:13:29 591

原创 牛客面经1 滴滴社招-001

我们上线现在使用的公司自研的部署编排的流水线平台,具体流程是将待上线的分支合并到master,之后进行上线审批,审批后摘负载,摘流量,摘对外提供接口服务,日志观察服务器无流量和任务后,灰度上线,先上线一台服务器,测试灰度验证没问题后分批上线,服务器上线后挂负载、打开流量开关,上线对外接口服务。调用量和并发量,一般高并发的模块比如营销活动服务、商品服务、订单服务,因为和普通服务对容器性能的要求不同,拆成单独服务进行单独配置,也可以进行不同的数据存储方式,比如单独进行es或者大数据表存储;

2025-08-21 15:59:53 701

原创 面试题储备-MQ篇 4-Kafka、RocketMq、RabbitMq之间的优劣

问:你觉得Kafka、RocketMq、RabbitMq孰优孰劣?下班了回家打游戏明天再说。

2025-08-19 20:27:28 175

原创 面试题储备-MQ篇 3-说说你对Kafka的理解

在卡夫卡中,生产者将消息推送给broker后,会等待broker返回一个ack的值去判断是消息是否已经存到broker里,broker接收到消息时,为了保证数据的高可用,在所有的主节点和从节点上的副本都同步完成之后才会返回ack的值,这时候卡夫卡会将同步完成的副本放在ISR可靠副本集合中,同步未完成的副本放在OSR不可靠副本集合中,当主节点不可用时,将可靠集合ISR中的某个从节点晋升为主节点,从而保证晋升的节点数据都是完整的,这就是卡夫卡的副本同步机制。问:请讲讲Kafka是如何保证消息的顺序消费的。

2025-08-19 20:22:52 544 1

原创 面试题储备-MQ篇 2-说说你对RocketMQ的理解

和rabbitMq一样,生产者接收broker返回结果,失败或者异常重试;broker端将消息存入磁盘,并进行主从同步,同步完成再给生产者返回保存成功;消费者端,在mq处理完成后手动提交返回消费完成。和rabbitMq消息积压差不多,多线程消费or异步or改批量处理or消息转发后分别处理。问:RocketMq消费消息是推模式还是拉模式?问: RocketMq是如何进行消息的存储的?问:RocketMq消息积压问题如何解决?问: RocketMq如何保证消息不丢失?

2025-08-19 15:16:30 289

原创 面试题储备-MQ篇 1-说说你对RabbitMQ的理解

生产者发送消息后,会等待mq服务确认消息已经被交换机投递到了绑定的队列,如果该交换机没有绑定队列,或者在broker中出现消息丢失,也会返回没有投递成功的消息,让生产者重新发送消息。和生产者的消息重试机制差不多,消费者在消费成功后给broker返回消费成功,broker再删除消息;如果消费者出现异常或者宕机,消息就会一直存在队列中,造成消息积压。我知道一般的消息丢失场景,有可能是网络波动导致发送和拉取消息的时候消息丢失;会将消息存储到磁盘中,避免服务器宕机导致的消息丢失。对上面几种情况,rabbitMq。

2025-08-19 11:07:49 414

原创 Java面试题储备15: 请谈谈你对AQS的理解

嗯,我理解的AQS并不在实际工作中能用到,它是线程同步工具类的父类,像锁、countdownlatch等都是基于AQS实现的,它为这些子类提供了一些工具类和模版方法。

2025-08-18 20:11:36 106

原创 Java面试题储备14: 使用aop实现全局日志打印

Around(value = “checkAlarmAnnotation()”) - 环绕通知。切入点,后面复制需要切入的包的路径,比如此时就是要拦截所有包a下的数据请求。") - 打印接口入参。”) - 打印接口出参。

2025-08-18 19:56:11 261

原创 Java基础八股复习4 谈谈自己对于 Spring IoC 的了解

2025-08-18 19:28:10 143

原创 Java基础八股复习3 jvm-垃圾回收与栈溢出

标记整理法,将堆内存划分为多个区域(2048),标记最需要进行垃圾回收的区域执行,将多个eden区的对象复制存放在新区域,这个区域称为suvivor区,再将原来的几个eden区对象清空。jvm虚拟机栈中占用栈内存较大的是局部变量表,也就是说如果方法中大量定义局部变量,或者出现循环嵌套调用方法时,每个方法都会创建一个栈帧,这种情况可能将栈内存打满。2-如果堆内存过小,容易引发oom,触发fullGc,需要合理设置堆内存,尤其是新生代内存如果过小,就会频繁触发老年代垃圾回收,造成系统卡顿。

2025-08-18 18:25:26 415

原创 Java基础八股复习3 jvm-内存结构

如果代码中有异常,从异常表中获取 (起始指令地址-存的是try/catch里异常体第一行代码的指令地址、结束指令地址-存的是try/catch里异常体最后一行代码的指令地址、跳转指令地址-存的是异常处理catch里第一行代码的指令地址)判断如果有动态链接(其实就是方法调用),会根据链接找到方法执行的字节码命令的地址,用来使下一次执行跳转到对应的方法(修改程序计数器中下一行指令地址为动态链接指向的方法的字节码指令的地址)执行完方法后,从方法出口里获取调用该方法的下一条指令的地址,从方法中出来执行下一条指令。

2025-08-18 17:41:18 374

原创 Java基础八股复习2 线程

线程在创建后首先进入 NEW(新建)状态,调用 start() 方法后进入 READY(就绪)状态,等待 CPU 时间片分配;方法锁/代码块锁,一般用在方法或者代码块上,原理是通过jvm的monitor监视器监视每个对象是否被使用,被使用则会阻塞线程,同步代码块执行完时自动释放,不会有死锁的情况;嗯,线程死锁一般是因为在执行过程中某个资源被占用或者被锁住无法获取,导致任务无法进行,一般是需要在执行任务前,先把所需要的资源全部获取到,再执行任务;1)new Thread() , 刚被创建,还未执行任务。

2025-08-18 16:12:54 186

原创 Java基础八股复习1 集合

当达到1时代表集合已满,此时哈希冲突已经加剧导致查询慢,需要在满前提前扩容,但是如果设置太小,可能会导致频繁扩容内存浪费,所以0.75其实是一个时间和空间的中间值,具体怎么得出的应该是算出来的最佳平衡大小吧。嗯,hashMap是一种基于哈希表的key-value键值对结构,底层是数组+链表+红黑树,存储时先计算key的哈希值,判断不存在相同key,直接存入键值对,已存在相同key,以链表/红黑树形式存储。一种自平衡的二叉树,可以通过旋转的方式,保障树结构的平衡,避免极端二叉树变成类似链表的存在。

2025-08-18 15:00:48 262

原创 Java面试题储备13: 你了解springboot底层源码吗?

1)举例使用springboot连接mybatis时,springboot需要读取autoConfigure包里关于mybatis的自动配置类,但是配置类有很多,不可能在启动类上加非常多的import注解,这时候就会直接读取jar包下的properties配置文件,里面会有不同技术的配置key和对应的配置类名称列表,读取到mybatis的配置类集合后,通过数组返回,使用一个方法就能获得加载的对应所有配置类(也会有一些去重、排除逻辑)在启动的时候,将配置类中的bean创建。springboot启动的过程。

2025-08-13 14:58:37 463

原创 Java面试题储备12: 索引的B+树结构了解吗

由于是树状结构,查询数据的时候就可以通过父节点筛选数据,根据树的高度几次IO完成数据查询,相比全表扫描减少了IO数量,提高了查询效率;相比普通的二叉树,由于B+树是多叉树,树的高度更低,IO次数也更少。嗯,mysql的索引就用的B+树索引,特点就是可以提交查询速度,B+树结构上是一个多叉树,数据存在叶子节点上,叶子节点相互连接形成双向链表;数据存在叶子节点上的双向链表,进行范围查询时只需要顺序遍历链表就可以。

2025-08-13 10:26:51 167

原创 Java面试题储备12: 索引失效的场景

联合索引-违反最左前缀原则,比如有一个联合索引 a,b,c 如果查询是筛选条件b写在a前,就会导致联合索引失效,想要解决,要么给b单独加上索引,要么在sql的where里按照联合索引的顺序把a的判断放在b前;筛选的字段和索引字段的数据类型不一致,比如 select id from user_record where union_id = ‘1’ 如果 union_id是tinyint类型,但是查询的是字符串,mysql就会对查询的值做类型转换,导致无法用索引的原始值匹配,索引就会失效。

2025-08-13 10:09:18 226

原创 Java面试题储备11: mysql优化全面讲一下,及你遇到的对应业务场景

对于某些不需要实时处理的数据,比如我们本地存的用户行为信息表,只需要T+1更新,但是要导出一个大的数据报表,其中涉及到很多表关联查询,这时es就不能支持了,可以使用clickhouse,clickhouse是列式存储的数据库,支持多表关联查询能够保证较好的性能。如果单表的数据量过大,一般我们的标准是单表数据量超过千万,就要考虑分表,一般通过唯一标识的哈希值取模分表数确定存在哪张表里,如果有明确的唯一键一般使用唯一键的哈希值,比如用户id、订单id;有很多很细的点,嗯,我想想。

2025-08-12 17:50:01 181

原创 Java面试题储备10: 压测关注哪些指标

除了接口性能还需要关注缓存、数据库、应用的内存使用率,如果出现飙升,需要观察是哪个接口引起的飙升,是因为慢sql导致的还是多线程导致的,做对应的处理,某些风险较高的模块要做好降级预案,不能因为一个模块的请求影响整体接口性能。一个是qps每秒请求数,压测脚本会周期设置不同的qps请求压测的接口,然后观察接口的tp99、tp999,也就是将响应时间从小到大排列,99%、99.9%的位置命中的那个接口响应时间大小。这两个指标需要一起看,qps美妙请求数升高,tp99也会随之升高。

2025-08-12 17:12:53 198

原创 java面试题9:讲一下spring的循环依赖问题原理

如果对象A里有一个属性是对象B,对象B里有一个属性是对象A,那么spring在初始化对象A时,要去内存里找是否存在对象B,发现不存在,于是取去创建对象B,由于对象B里又有属性A,又去内存里找对象A,但此时对象A还没初始化找不到,又需要初始化对象A,最终形成了死循环。创建A后,初始化A,需要获取属性B,获取不到,暂时将未初始化的A存到缓存中;初始化B时,通过三级缓存中的引用,获取到未初始化完成的A,将B初始化,再将A初始化,这里主要就是将创建但未完成初始化的对象暴露出来并使用。

2025-08-12 17:02:42 104

原创 java面试题储备8:J ava当中异常有了解吗,你在项目当中如何应用,处理简单的try catch异常捕获等返回你还了解什么,多级异常

一般代码中没有使用多级异常,一般直接try/catch ,统一捕获exception,如果需要用到多级异常,我想应该通过应用分层来处理,比如sql请求锁异常,单独处理并告警;sql操作异常/数据库数据异常,看是否需要做回滚或者重试;如果是service层业务逻辑异常,catch住后要定义对应的异常码返回给请求服务。

2025-08-12 16:48:29 116

原创 java面试题储备7: 关于线程池的拒绝策略,请举例说明,你在项目中怎样使用拒绝策略的

拒绝策略用过的就两种,一种是callerRunsApolicy,这种是如果线程池满了,新请求的任务会交给普通线程执行,这样可能会导致性能下降,但起码还是可以用的,我们项目里基本都是用的这个策略;还有一种是discardPolicy,超出线程池最大线程数,直接抛弃新任务,如果数据可恢复能使用这个策略,但是我们项目里是没有用的。

2025-08-12 15:53:02 105

原创 java面试题储备6: 讲一下线程池、执行流程,你在项目当中的配置

如果高并发场景且核心线程一直占用,任务队列也打满之后,就会创建非核心线程,这些非核心线程和核心线程最大的区别就是这些是临时线程,空闲且达到存活时间keepAliveTime后会被销毁。线程池的执行流程就是当一个任务提交时,在线程池里会先判断线程数是不是已经打到核心线程数的上限,如果还有空闲的核心位置,会创建一个核心线程执行任务。当线程数量达到线程池最大线程数后,线程池已经满负荷工作了,不能再支持额外的任务处理,就会执行任务拒绝策略。等核心线程执行完任务,再按照任务队列顺序执行等待的任务。

2025-08-12 15:20:45 152

原创 java面试题储备5: 举一个你在项目当中遇到的最困难的问题

后来的时候数据库sql巡检,发现结果表数据也超过了千万,这时候索引和表结构优化都不能产生什么作用了,于是做了分表,因为业务运营在营销后台对这部分数据的导出和查询是根据运营分部分别处理的,每个省份是一个分部,这是不会变更的,与业务沟通后,通过问卷发放时间,按照分部id的hash值取模进行分表,一共分38张表,每张表的数据下降到几十万,查询和导出的时候也只需要做单表查询。通过慢sql监控,发现性能出现问题,开始着手优化索引,对高频查询的关键词加上联合索引,并删除不合理的索引;

2025-08-12 14:52:58 212

原创 java面试题储备4: 谈谈对es的理解

解决:首先首页的订单列表不会出现深分页的情况,数据量较小不会出现这种情况;我知道我们系统唯一出现过类似问题的地方是首页推荐商品池,这个商品池数据取的是主站统一的推荐商品es接口,数据量上千万,主页采用左右滑动的形式,每页50条,滑动几十次后出现加载卡顿的情况,后来了解到可能是深分页的问题,该用了feed流来解决,feed流其实我们也是调用的中台的接口,大体的实现就是会有一个scroIId游标,原理是会将数据存一个快照,然后分页之后通过游标id去定位下一页的数据,就不会出现加载慢和内存损耗的情况;

2025-08-12 13:51:09 602 1

原创 java面试题储备3: 介绍一下你的项目

3)我作为订单域主研发,完成了xx项目订单中心从0到1的构建,先后完成了订单中心下沉、多业务线订单重构、订单消息中心构建,并支持了订单相关系统-会员中心、任务中心、nps订单调研问卷系统、餐饮点餐系统的交付。4)主要技术 Springboot+mysql+es+ck+redis+react(c端)+vue(b端)1)C端主要生成订单后,提单-支付-出库-自提/配送-订单完成-售后的全流程开发。2)消息中心主要负责监听订单的提单、拆单、支付、出库、完成、售后等消息。

2025-08-12 12:14:24 225

学术报告模板.rar

自己买的PPT模板,学术报告类型PPT模板,课程设计拿了优秀的模板,客官看一看嘛,只要1积分,你买不了吃亏,你买不了上当,只要一积分,我绝对不是为了凑字数!

2020-05-27

随时更新-小白实习生的Java学习笔记.rar

随时更新-小白实习生的Java学习笔记.rar

2020-06-03

SsmShop.zip

大学毕业的毕业设计,实习期间一边学一边写的,有些简陋,很多逻辑需要补,但是对ssm框架初学者很友好,可以自己试着查漏补缺。绝对能运行(运行不了毕不了业),所有工程文件齐全,只要1积分哟!环境:idea+JDK8+tomcat8+maven3.3.6+mysql5.7

2020-05-27

空空如也

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

TA关注的人

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