自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 收藏
  • 关注

原创 智能家居小程序

WIFI模块:ESP8266-015。系统板:STM32F103C8T6。立创EDC画板子,然后微立创下单。光照度传感器: BH1750。温湿度传感器:DHT11。

2023-11-16 21:48:05 97

原创 BMS系统项目

(2)项目实现的shell命令解读(RT-Thread)1、通过电压监测是否冲满,通过电压可以监测是否放完电。欠压保护(百分之几得电,快关机了)过压恢复(百分之90多)欠压恢复(就是欠压之上)

2023-11-16 09:11:12 166

原创 STM32-创建项目流程

(2)添加库函数,项目中创建Library文件夹,然后去库文件-->Libraries-->STM32F10x_StdPeriph_Driver-->src文件下所有的文件全部选中,复制到项目中的Library文件夹中;打开库文件--> Libraries --> CMSIS --> CM3 --> DeviceSupport --> ST --> STM32F10x --> startup --> arm (里面全部文件)5、添加工程必要文件(打开刚刚下载的库文件夹)创建文件夹,存放启动文件。

2023-11-02 20:26:44 197

原创 51单片机-点阵屏led

offest作为偏移量,count作为计时。count=10,偏移量加1,就相当于得到下一帧的图案表示。1、使用文字摸提取文件,提取图案的16进制表示数组。进行位选,段清零,这样就不会影响多列同时了。这样就能选择每一列哪个亮了。

2023-10-29 17:14:29 401

原创 51单片机-串口

RI==1表示电脑发送数据了(因为发送会触发中断)然后复位为0。使用SUBF进行发送,TI==0代表结束,结束后需要复位。设置波特率(根据这个代码,去配置urt_Init())参照上面配置下面这个,然后删掉上面这个代码。电脑发送数据给串口,串口又发回给电脑。下载、打开串口,设置波特率和校验位。连续发送(容易有误差,给个延迟)二、直接在串口处操控led。电脑与单片机通过串口交互。

2023-10-28 22:10:47 430

原创 51单片机定时器

key值=1,按一下向一个方向,再按一下,向另一个方向。设置独立按键(这个是为了,控制左移还是右移的标志)cror代表循环右移一位,到边界还会循环。2、下面代表每1秒执行一次P2_0赋值。crol代表循环左移一位。

2023-10-28 21:13:00 94

原创 矩阵按键简单使用

1、写矩阵按键(下面在按这个格式把别的行也写入进去)

2023-10-28 20:44:34 90

原创 模块化编程

1、函数单独写在一个文件中.c,然后声明也写在一个文件中.h,在mian.c中引用。2、安装目录下面的文件夹用<>,在自己文件夹目录下就是""3、创建自己的(先把函数放在c文件,再创建头h文件)

2023-10-28 19:49:51 90

原创 嵌入式-数码管控制

一、数码管显示数字,P2_4, P2_3,P2_2,这三个组合起来代表1-8的二进制表示代表1-8个led。P0代表要显示的数字的16进制表示。比如要显示数据6,那就是0111 1101,那么16进制就是0x7D,所以p0=0x7D。这个图就是表示led灯,二、数码管,动态扫描。

2023-10-28 19:40:52 272

原创 嵌入式项目电灯

1、原理,电灯有个正负极,当正确接入电源正负极就能点亮(如正极5v,负极0v),单两边同时接入正极,就不会亮(两端都是5v),所以通过控制电平,来实现控制led等的亮暗。cpu通过给寄存器写入1,则赋予高电平,写0赋予低电平,即可达到控制目的。进入刚刚的工程文件,但是发现里面是空的,是因为kiel默认不生成文件下载文件,所以需要设置一下。3、控制第一盏灯,让它亮应该为二进制 1111 1110,但是需要转换成16进制。4、打开单片机软件(STC-ISP)重新打开(单片机的开关)这样就不会重复执行函数。

2023-10-28 13:18:16 74

原创 创建一个Keil项目

5、就会得到下面这个,可以在Source Group 1下面编写代码了。3、选择型号(因为没有STC,用下面这个替代,功能差不多)6、右键source Group 1,添加c语言文件。2、选择存放的文件夹,还有设置项目名。7、取名字(第一个应该都叫main)第二个build,建立工程的意思。4、选择不用启动文件。

2023-10-28 12:50:09 102

原创 商品秒杀系统整理

7、在消息队列中,我们处理信息,查数据库(1、如果我们查到数据库库存为空,并且返回库存不足。2、如果处理下单成功,将订单信息缓存并返回订单)8、前端就通过回调getResult()方法,查到订单就返回订单id,如果库存为空就返回-1,0就代表还在排队中。5、使用lua脚本进行秒杀资格判断(将库存和用户下单成功后的订单写入到缓存中,每次进来先用lua脚本进行判断)6、将信息放入消息队列中,然后直接返回0表示排队中,后续客户端轮询查看结果。2、互斥锁解决缓存击穿问题,用缓存空值解决缓存穿透问题。

2023-09-25 15:42:26 549

原创 商品秒杀系统思路

2、又发现问题,一个用户可以下好几单,所以想到用商品id和用户id做个唯一索引,解决了,但是后面发现,我再开同一个商品的秒杀,之前的用户不能抢到了。Spring中事务是通过代理对象去实现的事务的,但是现在这个相当于是用this调用的,所以事务会失效。4、解决用互斥锁解决缓存击穿问题(使用秒杀商品id做一个分布式锁)seckGood:+"GoodId"但是会出现释放错锁的问题(生成有一个uuid,与线程id做个拼接,获取释放锁的时候进行判断)3、优化(使用lua脚本预扣库存,如果有,并加入消息队列里面)

2023-09-25 10:44:18 196

原创 评测管理的业务逻辑

6、循环遍历该问题的选项,然后与5中获取到的对象所选这个题目的选项进行对比,如果一样,把isChoose设置为真(isChoose只在实体类中出现,表中没有的,因为我们只是要返回一个结果集。1、一次性查询所有题库里的问题和答案(将题库获得题库里面所有id的List<id>)5、获取到问题人做该题的细节(通过传入做问卷的id、问题id)答题人每个问题的选项都得查一遍(问题次数,有多少个问题就得查多少次)题库里面的每个问题要查一次选项(有多少问题就得查多少次)2、 把题库分开,然后一个题库一个题库处理(循环)

2023-09-16 01:08:20 119

原创 分布式锁使用

但还是可能会出现问题,因为需要跟redis通信,你获取到redis中的值后,执行判断后,如果恰好别的线程获取到了锁,还是会错删别人的锁(所以查询锁和判断锁应该是原子操作)但是如果执行业务时间过长,锁被自动删了,等业务执行完了,删除的锁可能是别的业务获取到锁后执行的,所以,还要加个判断。1、在微服务项目中,上面的锁方法只能锁住一个单体的,分布式需要使用分布式锁。但是,如果进入判断后,还没执行到过期时间语句就断电,那也会死锁,所以应该使用。可以通过lua脚本解决删除。redis中的setnx。

2023-09-10 19:41:50 146

原创 商城系统优化

但还是可能会出现问题,因为需要跟redis通信,你获取到redis中的值后,执行判断后,如果恰好别的线程获取到了锁,还是会错删别人的锁(所以查询锁和判断锁应该是原子操作)6、给数据加锁解决缓存击穿问题,给查询数据库的语句里面的代码块加锁,进去后再判断一下缓存里面有没有存在,然后就查询,查到后放入缓存中。但是如果执行业务时间过长,锁被自动删了,等业务执行完了,删除的锁可能是别的业务获取到锁后执行的,所以,还要加个判断。2、上面三个中,主要是使用合理的数据库查询语句,减少数据库查询次数,然后使用缓存。

2023-09-10 19:39:25 175

原创 ElasticSearch

二、match查询 (就像mysql中 where account_number = 20),但是他使用的是倒排索引,只要包含内容,就都能检索到,有点像模糊查询,他会按评分进行排序(评分就是匹配度)在索引下更新字段(没法,只能把数据迁移到别的索引 get /老索引/_mapping 就能获取老的索引,然后复制到新的,并适当修改)(4)倒排索引(索引表,就是把句子进行拆分,做成一个索引表,句子中有相关的单词就把句子加入到记录中,最后再进行相关性得分)

2023-09-10 16:53:13 89

原创 git使用

5、配置ssh免密连接(xxx@xxx.com就是码云上注册的邮箱)8、创建好项目后,把一些文件忽略掉(我们只提交我们的代码就行)7、去idea进行项目管理,创建新项目,并由此仓库管理。添加公钥(标题随便自己取,公钥就是刚刚复制的那个)commit and push是提交到码云。3、右键进入git bash进行配置。4、配置用户名,邮箱(码云上的邮箱)2、git官网下载git客户端。9、把需要的文件,加入版本控制。把刚刚复制的地址复制过来。复制到码云里面进行配置。1、在码云上注册账号。

2023-08-31 16:37:27 622

原创 Docker容器

有了docker,可以获取各种软件的镜像,将软件的镜像下载到linux中,基于这个镜像就能够去启动这个容器,这个容器就是这个镜像的完整运行环境,比如mysql、redis、nginx,还能秒级启动他们。容器间也是相互隔离的。

2023-08-31 16:02:54 409

原创 RabbitMQ

binding:exchange和queue之间的虚拟连接,binding中可以包含routing key,Binding信息被保存到exchange中的查询表中,用于message的分发依据。vitual host:当多个不同的用户使用同一个RabbitMQ Server提供服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。2、工作模式 (生产者发送大量消息给队列,来不及处理,所以用多个工作线程来处理)3、发布确认(单个发布确认,批量发布确认、异步发布确认)

2023-08-29 23:55:19 1651

原创 项目部署(前后端分离)

1、前端项目 (打包成dist文件,放到nginx的html目录下面),然后配置nginx。使用之前的shell脚本(然后赋予用户权限),最后运行脚本。

2023-08-06 22:53:56 338

原创 Nginx

过程(访问100:82端口会转发到101:8080,也可以直接通过101:8080访问的)使用下面方法配置,使得可以在任意目录下执行./nginx -s reload。4、具体运用,反向代理。

2023-08-06 22:33:03 178

原创 git开发过程中的使用

1、先创建本地分支,然后修改代码。回到master分支。

2023-08-06 22:09:28 374

原创 读写分离实现sharding-jdbc

查询策略(轮询,指定哪个是主库哪个是从库)二、使用sharding-JDBC实现。2、配置文件(名字要对应)允许bean定义覆盖。

2023-08-06 22:02:00 121

原创 Mysql主从复制

6、从库登录mysql执行下面操作(这个user跟password就是之前配置的,那个master_log_pos值为上面查到那个位置值),然后start slave。2、主库开启二进制日志(binlog),然后重启mysql,systemctl restart mysqld。Mysql主从复制(主要是监听主库的binlog日志,然后去进行相应的操作)4、登录mysql,记录数据值。3、登录数据库执行下面SQL。5、从库配置文件,然后重启。

2023-08-06 21:46:55 125

原创 Redis

Redis是键值对key-value存储,它的value有5种数据类型。当有菜品更新时,可以清理全部菜品缓存或者那个类的菜品缓存。3、使用(这个缓存是基于内存的,当关闭进程后,就没了)1、Spring-cache在这个依赖里面就有。2、配置(redis,及缓存过期时间)2、启动类加注解EnableCache。查询时先查缓存有无,没有的话加入缓存中。1、使用redis缓存登录验证码,二 SpringCache框架。有序集合sorted set。1、value五种数据类型。改造成Redis作为缓存。

2023-08-06 18:53:32 1173

原创 shell脚本自动打包部署

6、还有,要设置静态ip(这个ifcg-ens33不同linux可能不一样,去network-scripts目录下面找)例如 777 第一个7代表文件拥有者的权限(读写执行),第二个7代表同组用户的权限,第三个7代表其它用户的权限。1、查看项目进程,如果项目正在启动,给它kill掉,查两次,双保险。kill -15 pid(这也是杀死进程,比-9更温柔)命令代表清楚之前构建的项目,打包新的,并不做单元测试。2、进入项目的目录,从git中拉取最新版本。4、进入target目录,启动。2、使用Git克隆代码。

2023-08-06 18:12:21 704

原创 Linux常用命令

10、tar命令:该命令用于对文件进行打包,默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压。1、cd命令:这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。5、mv命令:该命令用于移动文件、目录或更名,move之意,它的常用参数如下:-f 如果目标文件已经存在,不会询问而直接覆盖。find / -user user1 搜索属于用户 'user1' 的文件和目录。

2023-08-06 16:42:43 59

原创 从零搭建SpringSecurity +JWT

1、原版给的是 重内存中查找用户信息,我们是要重数据库中查找,所以主要就是要替换这个类(创建一个UserDetailService的实现类,重写loadUserByUsername()方法)(通过用户角色表获取用户角色,获得角色的信息,再通过角色与角色和权限关联表,获得角色关联的权限id,最后从权限表中获得权限信息,得去重)(2到时候替换成动态的就行)(用户表,权限表,角色表(一个角色有一组权限,用角色权限表关联,多对多关系),角色和权限关联的表,用户和角色关联表(也是多对多))

2023-08-06 16:30:35 257

原创 synchronized优化

2023-08-05 17:49:45 131

原创 类文件一些内容

将类的字节码加载到JVM中,并转换为可以被JVM运行的数据结构的过程。

2023-08-04 22:21:47 122

原创 JVM相关知识

无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize方法,第二次GC才能回收被引用对象。2、弱引用(通过SoftReference),如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。2、可达性分析:(根对象是那种不能被当成垃圾回收的对象,看对象有没有被根对象直接或间接引用,若有就不能当成垃圾回收,否则就可以被垃圾回收)

2023-08-04 22:09:15 613

原创 Spring Security

/这个类就是上面那个配置中我们重写的,直接调用就行。* hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问。* hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问。* hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问。* hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问。

2023-05-17 18:21:21 420

原创 JWT登录认证

之后我们发送请求时(根据我们自己的设定),判断用不用携带token,需要携带token的请求,那就在cookie中获取token,后端接收到带token的请求,然后将token进行解析,得到uuid,然后去redis中查找。登录的时候:会先生成一个uuid,然后一般用(自己定义一个前缀名字:uuid)作为key,用户的信息作为value,存入到Redis中。5、服务器收到session_id,找到前期保存的数据,由此得知用户的身份。3、服务器向用户返回一个session_id,写入用户的cookie。

2023-05-15 16:30:46 190

原创 分布式项目热部署流程

热部署

2022-10-29 20:35:32 133

原创 第一个vue-cli程序

1、下载好npm,安装镜像加速器npm install cnpm -g卸载的话,用npm uninstall cnpm -g2、安装vue-cli控制台输入cnpm install vue-cli -g3、创建项目(这个项目放在自己想放的文件夹里面,下面的进文件夹操作就是进入放置的文件夹里面)记得加cd 这个符号才能进入文件。4、初始化并运行首先进入项目 cd myvue然后安装依赖环境 npm install启动项目 n...

2021-10-18 21:16:57 52

原创 Vue自定义事件

<div id="app"> <todo> <todo-title slot="todo-title" v-bind:title1="title"></todo-title> <todo-items slot="todo-items" v-for="(item,index) in todoItems" v-bind:item="item" v-bind:index="index" v-on:remove="re.

2021-10-18 10:58:50 46

原创 Vue组件

<div id="app"><qingjiang v-for="item in items" v-bind:qin="item"></qingjiang></div><!-- 导入Vue.js--><script src=https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js></script><script> //定义一个前端.

2021-10-18 09:48:57 29

原创 Vue if和for使用

if使用实例1<div id="app"> <h1 v-if = "ok">YES</h1> <h1 v-else>NO</h1></div><!-- 导入Vue.js--><script src=https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js></script><script&gt

2021-10-17 10:48:19 122

原创 第一个Vue程序

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><div id="app">{{message}}</div><!-- 导入Vue.js--><script src=https://cd.

2021-10-16 22:41:02 29

空空如也

空空如也

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

TA关注的人

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