- 博客(38)
- 收藏
- 关注
原创 JsonWeb token(JWT)跨域认证
服务端,生成专属SessionID;登录成功后,把SessionID通过发给浏览器保存。SessionIDSessionID:若服务器采用集群存储,用户每次访问的服务器端可能都不同,可能上次访问的session存储在服务器A,这次访问服务器B,数据难以同步则是将信息存储在本地浏览器中,每次访问服务器会读取本地浏览器的token。简单理解:token相当于工牌,门卫看到就放行。session是门卫认识你就放行,但换了门卫就不行了为了防止用户本地篡改信息,JWT提供了签名三部分用拼接。
2026-04-23 21:35:04
429
原创 Vue学习七:MockJs前端数据模拟
Mock.js = 前端假数据生成器 + 接口拦截器,让前端不用等后端。相当于后端的apipost//引入mockjs//使用mockjs模拟数据"ret":0,"data":"mtime": "@datetime",//随机生成日期时间"score|1-800": 1,//随机生成1-800的数字"rank|1-100": 1,//随机生成1-100的数字"stars|1-5": 1,//随机生成1-5的数字"nickname": "@cname",//随机生成中文名字// 生成图片。
2026-04-19 19:22:04
344
原创 vue学习六:状态管理VueX
通过increment()方法来修改state的数据,在methods中先定义increment的方法逻辑,this自动引入对应state,commit来传输名为increment的方法名,从而自动调用方法。当state变化时,计算属性会自动同步变化的属性,此时的自定义方法count中需要添加this来指向组件实例。异步操作常作用于从服务器端获取数据,由于网络限制,数据下载到用户端需要时间,在这期间所执行的从服务器获取资源的操作称为异步操作,因为无法完成同步操作让用户停留在卡顿的网页无法执行任何操作。
2026-04-16 17:39:16
423
原创 vue学习五:前端路由VueRouter
全程逻辑:App.vue被挂载后,浏览器显示routerlink组件中点击名为todemo1的链接名后通过/demo1的路由规则链接跳转至DemoOne.vue的组件,然后被打包至App.vue的routerview占位符,然后再通过export导出。在Demo3Chird组件中,可利用{{ $route.params.id }}来读取demo3的子组件的动态索引,索引名“id”与route路由规则中的“:id”应保持一致。然后在index.js中添加动态属性,“:”即表示动态绑定后面的子组件索引。
2026-04-14 22:33:26
411
原创 vue学习四:Axios网络请求
但数据应为浏览器网络传输,从数据库中得到数据,而非提前在前端中写死数据。后方,或者利用params来存储多个参数,处理结果会返回给function中的参数中,成功返回给response,失败给error。在浏览器中也可以查询到状态,由前端的response返回体返回如下数据,其中data则装在后端的查询返回值,对应转化为json类型。在view的部分中,对应的prop作为索引来连接view model的每一行数据部分,label是显示的表格列头的文字。过程中自动触发的函数,用来在特定时机执行代码。
2026-04-11 14:38:02
376
原创 Vue学习三:element-plus组件和FontAwesome图标组件
在传输项目时,由于node_modules包体量巨大,所以在传输时一般不会将此包打包,只需要保留package.json。然后在拿到该文件后,在终端中输入⬇️命令vscode便会自动根据依赖开始安装对应的node_modules文件。然后直接把对应的标签复制粘贴在自己需要的地方即可(template标签层中)安装好依赖后,在main.js引入包以及全局定义element组件。想要在项目中导入图标可以使用font这个第三方库,先在cmd中安装。然后在main.js中引入并创建全局声明组件。
2026-03-30 23:36:50
102
原创 Vue学习二:组件化开发
一般的自建组件写在components文件包内,此处自建一个叫hello的组件,然后在script标签中引入组件,再在template中使用hello标签。基于工程化的开发,创建项目不再在vscode等平台上创建html的形式,而是在项目目录导航栏中利用cmd命令来创建。NPM是一个NodeJS包管理和分发工具,简单来说类似于java学习中的maven,可以帮助管理前端的依赖包。其总控界面在App.vue中显示,img展示图片,helloworld组件编写默认网页内容。选择自己的版本,这里选择3.x。
2026-03-30 17:31:55
65
原创 vue学习一:vue框架快速入手
vue提供了MVVM(Model-View-ViewModel)的设计模式,对比传统的mvc(Model-View-Controller)模式,model与view互不相通,view通过viewModel自动让modle生成逻辑,然后自动传递view。避免了大型项目中controller的臃肿。div标签中用于定义函数以及中间变量,后面的script标签定义组件,在组件中续写变量值和将组件内容挂载到dom中。
2026-03-23 17:28:56
70
原创 Springboot学习六:MybatisPlus的多表查询以及分页查询
然后通过plus的内置查询语句将page对象数据读取,还可以添加queryWrapper条件查询,将返回的结果集给IPage类对象ipage,mybatis会自动整理结果包括总页数,总条数,当前条数据。中添加orders字段,加上对应getter,setter,toString方法,后续用于通过User来查询Order表(此处由于orders字段并不在User表中存在,所以利用TableField注解标识此字段不存在,来告诉mybatisplus的查询语句避开此字段,否则汇报错。先在配置类添加配置文件。
2026-03-18 21:48:14
454
原创 Springboot学习五:MybatisPlus的快速上手
此时的代码是可以正常运行的,但若不想看到爆红,则需要在Mapper接口添加@Mapper注解,显式的标记为spring组件,或者在@Autowired后添加为@Autowired(required = false),告诉IDE这个bean不需要在编译时存在。,此处期望使用UserMapper接口中的find方法,则需要引入一个UserMapper的对象,然后再通过@AutoWired注解将UserMapper的实例化对象为userMapper这个空对象自动注入属性。,匹配数据库内字段。
2026-03-16 23:40:27
411
原创 springboot学习四:RESTful风格+swagger
(注意检查application.properties中是否有‘ #spring.mvc.static-path-pattern=/images/** ’此行修改静态文件路径的代码,这会一同修改swagger的访问路径,若有则会冲突)什么样的方法做什么样的事)和幂等性(服务器中资源的第一次请求和第n次请求返回的效果是相同的)@GetMapping注解中id作为动态值,需要加上{ }符号,{}的值应与下面方法名中的变量名相同。传统的设计方法中,对于增删改查数据往往在导航栏中有动词的参入。
2026-03-14 20:04:27
277
原创 Springboot学习三:文件上传以及拦截器
一行,由于浏览器传输文件应上传至web服务器本地,利用request.getServletContext()获取请求,然后用getRealPath("/upload")获取文件真实路径下的“upload”路径。如果想要访问路径不是默认的根目录/文件名称,可在application配置文件中修改访问路径,默认值是=/**,现修改为=/images/**。拦截器在使用前需要在类中进行注册才能使用,一般单独列一个config类来注册和声明拦截规则。一般静态文件都存放在static目录下,例如图片,视频,音频等。
2026-03-12 00:14:49
170
原创 springboot学习二:controller的意义与使用
4.若导航栏传递的参数名与方法中引用的参数名不匹配,例如在导航栏中输入nickname,但在方法执行中写为name,可在@RequestParam中写上需要匹配的参数名,把required赋值为false意味不论是否在导航栏中存在nickname传递数据,代码都正常执行。(默认required为true,若导航栏中没有value中的值出现,则会报错)。简单的说,mvc模式中,m(modle)用于存储数据,c(controller)用于数据的传递,v(view)用于显示数据。匹配单个字符(字母)。
2026-03-02 20:44:45
571
原创 springboot学习一:环境配置及其热部署与基本入手
在项目pom.xml文件中写入上图依赖,optionnal=true表示依赖只针对该项目生效,其他项目引入该项目依赖生成的jar包不会有devtools的热部署功能。作为本机执行,在http协议后应为localhost本机的域名,以及tomcat的默认端口8080,路径为hello。预创建java版本为8的稳定版本,在服务器为start.spring.io时是不被允许的,需将url改为。执行程序后,控制台会输出tomcat的启动端口,若占用,可在配置文件中修改端口为8081等等。
2026-02-12 22:53:32
84
原创 哈希 暴力 前缀和
注意语法,list用()来定义内部结构,取值时用[ ]。不同的类型不能用+连接,比如列表类型和int类型,if,range都是需要()的。
2025-04-10 12:56:01
179
原创 sort函数的补充内容
表达式的语法结构要记得,n和m要确认是int类型,先赋值a列表1到n的数据,再利用lambda函数将特定表达式的sort来排序a列表,然后输出。注意排序并不会改变列表的数值,而是根据函数的判定来决定列表元素的顺序,并不会让列表中原来的数据发生更改。补充:取余要保留符号,数值正常计算。很直白的题目要求,利用sort函数将给出的对应的1到n的数据进行特定的数位和排序即可。注意构建函数的格式是固定格式,init以及it,it记得有return返回值。a通常作为一个表达式,来一一对b的迭代的对象进行算法运算。
2025-04-01 16:53:06
286
原创 python的sort()函数解决最短油井问题(入门难度)
【2025蓝桥杯备战(Python 基础,算法入门)4-2 排序函数】https://www.bilibili.com/video/BV16mFyeUEim?3,绝对值的函数是abs(),由于坐标有可能是负数,此处记得累加时要取绝对值。看到题目,通俗点就是求最优管道与各个位置的油井的最小长度和。2,中位数的下标需要是一个整数,用"//"来取整。可以确认x坐标是不需要的,我们只需要y轴坐标。
2025-02-04 20:14:48
228
原创 Python语法快速精简入门
注释:# 单行注释""" 以及 ''' 是多行注释变量:变量无需设定类型,直接赋值即可;变量开头不能以数字开头,只能由数字,_,字母构成变量分为四种基本类型,分别是列表,集合,元组,字典;简单语句:print(变量)print(“语句”)print(f"hello{a}")#表示输出固定格式,并且其中a为一个变量python默认输出一段句子后会转行,若想要不转行,可在输出一个语句后增加特定语句:print("hello",end="")
2025-02-03 21:34:16
813
原创 java音乐最简单基础
AudioInputStream 则是一个音频类 ,利用后续方法将is转化为音频形式 ,存入ais。PlaySound.class.getClassLoader()是此名为PlaySound的类(package)中的一个自带的类加载器,用于将此文件打包起来给到对象is;先利用Clip类,来表示一段音频片段,利用AudioSystem.getClip()方法来获取音频,传输给bgm这个对象。然后利用Clip类的对象bgm,来执行open操作,用于打开文件。然后start开始执行。
2024-12-21 23:21:12
232
原创 dfs经典例题——迷宫问题(利用二维数组优化方向判断)
思路:首先关于方向问题,我们可以设定一个默认方向,比如先默认向右,触底向下,然后再是向左向上。初始量:地图数组(注意map不要作为变量名,因为有对应内置函数),判断数组,步数,数据数组(我这里采用了自增数组vector);由于每个方向都需要单独写出执行过程,我们可以思考将四个方向合并一起达到节省代码量。可以利用两个数组来表示x与y的方向,然后每次循环从右下左上开始循环搜索路径。ans存储的单位是一个pair,每个pair包含了两个数据,递归过程中需要判断下一步是否是障碍物,以及是否被走过。
2024-11-25 20:25:08
264
原创 深度优先搜索——全排列(重点)n皇后问题【模版】
现第一次从1开始执行dfs搜索,一一放入盒子并标记flag,到头之后,开始回溯到上一次最后一次放牌的时候,将3从三号盒子拿回,因为每次循环的结束条件是第三号盒子被放入,所以此时会将循环递归dfs函数的参数到第二号盒子被放入之前,此时因为上一次递归是在二号放入2号牌,所以此次跳过2(因为原先2号牌放入的那次循环已经结束了),开始往后将3号牌放入此时的二号盒子中,再继续,便将手中的留有的2号牌放入三号盒子。列:lie【10】:若lie【x】为0,则说明此列无棋子,可下放棋子。例如:算出 3 的全排列。
2024-11-19 21:04:41
519
1
原创 并查集具体例题使用详解(力扣200岛屿数量)
因为当依次遍历查找元素的时候,查找的顺序是始终向右以及向下的,既这个元素无论如何都会被判断一次是否为1,便不需要再向右或下判断是否同为1,当遍历到这个数时,向上或向左判断就足够确认是否在同一个集合内了,即使不向右判断,下一次遍历也会跑到右边的元素身上,然后再向左向上判断是否为同为1(向下同理);而利用并查集的方法,可以设每一个1是一个单独的集合,然后从第一行第一列依次往m行n列向四周寻找,当邻接元素为1时,则合并为同一个集合,遇到零则终止该行或列,最后再统计场上剩余的集合数量,便得到岛屿数量;
2024-08-08 21:59:45
487
原创 并查集的详解与使用模版(洛谷3367)
3,多个元素之间,连接的方向其实无所谓,1->3,3->3自己,需要将2加入到集合中,此时3->2和2->3都可以,但总归上,会让各个集合的根相连,2这个集合中只有他本身,所以他就是自己的集合的根,所以2不能与1相连,只能与1,3集合中的根3相连接,至于方向,会使集合中的根不同,一般是让多元素的集合的根连向下一个单独的元素;对于多个集合之间合并为一个大的集合,相当于森林合并成一棵树,为了追求各个集合的元素被根所访问的时间平均最短,一般会让元素少的集合的根连向元素多的集合的根,尽量让整个树变得"又矮又胖";
2024-08-07 17:01:32
351
原创 (自记)sort的使用
include <algorithm> // 引入<algorithm>头文件以使用std::sort。// 假设有一个整数数组heights和一个指向数组首元素的指针id。// 使用std::sort对heights数组进行降序排序。// 输出排序后的数组。
2024-08-06 17:46:51
296
原创 双指针解决返回所有和为 0 且不重复的三元组(力扣15-三数之和)
来判断并修改j和k两个相向指针,可以快速的达到跳过重复元素的效果;1,对于第一位变量i遍历的时候,可以考虑此变量若与前一此遍历所对应的数据相同,可以将此变量++,既跳过此次循环,因为题目说不包含重复的三元组;),首先先sort将数据有序化,先利用循环来框定一个数,再对剩下的俩数利用头尾指针相向遍历,然后记录符合的数据,重复的就跳过;2,对于后两个相向变量,可以将执行过程的条件设定为(头j
2024-08-02 16:27:50
477
原创 双指针求数组中两数之和是否为目的值(力扣167两数之和II)
对于所要求的target值,不妨在数组的两边加上相向指针,若头指针和尾指针之和大于target,则可以尝试让数值之和更小,既让尾指针向前移一位,因为不论是当前尾指针的值与任何数相加都一定会大于target(因为头指针是全数组最小的值),既可以永远排除掉当前的尾指针的值,再进行首位值想加,与target判断,若小了就将头指针向后移一位,重复上述过程,直到首尾之和等于target,然后返回头尾指针对应的id;在此代码中关于输出的结果,因为题目默认数组的初始值从1id开始取,所以记得在结果处加一.
2024-08-01 15:56:28
206
原创 数组简化双向链表实际应用【模版】(洛谷1160队列安排)
双链表的删除操作则是将第i位元素(待删元素)的左方元素的右指针连接第i+1位元素,将第i+1位元素的左指针连接第i-1位元素,然后再将第i位元素的左右指针指向空值,既从链表中删去了第i位元素,参考代码很好理解,不多做赘述.4,双链表的删除操作则是将第i位元素(待删元素)的左方元素的右指针连接第i+1位元素,将第i+1位元素的左指针连接第i-1位元素,然后再将第i位元素的左右指针指向空值,既从链表中删去了第i位元素;),然后再将左右元素的对应右左指针分别连接在i身上,彻底完成插入操作.
2024-07-31 16:45:32
1438
原创 数组简化实现单链表【模版】(洛谷3631单向链表)
替代方式:利用三个数组来实现,其一是用来存储第i位的数据的数据数组e[N],以及存储第i位的下一位数据的下标的下标数组next[N],最后是数据x所对应的下标的追溯数组id[N];然后利用idx变量名来表示存储的数据的个数;由于关建行都做了详细的解释,这里就不多做赘述了;
2024-07-30 15:47:16
462
原创 循环队列的具体使用[模版](洛谷1996-约瑟夫问题)
q.empty()用来 判断队列为空,既输出完了所有数据,而不是front==tail,这会导致队列中还存在一个数据。2,注意初定义数据时i取1,不然在赋值的时候会出现偏差;4,k来决定报数的人是多少,从一开始,直到m值出现;这行代码是关键,用来实现循环队列;
2024-07-30 00:23:13
376
原创 单调队列【模版】(洛谷1886滑动窗口)
2,出队则是针对窗口动态变化的情况,当i-q.front()>=k时,因为q.front()对应的是在此窗口中最大的值,不论是前面的还是后面的都比它小,所以在此窗口中,最大值前面的所有值都没有机会来作为最大值被输出,所以可以直接默认窗口内的最大值充当窗口的最左位,所以当i-窗口中最大值的下标大于等于窗口的容纳数量时,窗口最左值(也是单调队列中的最左值)就会被踢出队列,来容纳新的数据,并在新的窗口中寻找最大值来充当窗口的左边界(也就是单调队列的下一位);一般采用双头引用,c++中的deque函数最为合适。
2024-07-29 22:11:41
797
原创 单调栈的基本例题解决思路(洛谷2866)
默认每位数据id为1,既题中的个体数本身,然后该数据压碎了多少位,表示他可以看到的牛头个数,(当然不能包括自己),所以我利用w来存储他所压碎的数位,然后在此位入栈后将w赋值给他的id,来记录他所能看到的牛头,便于下一位更高的牛可以快速在此单调栈中获得自己所能看到的牛头。四,值得注意的是,每次我会利用qq来判断是否有压碎的情况出现,既出现高牛看到矮牛,因为此时单调栈中会有数值的减少,既top指针会--,只有这样我才能统计可以看到的牛头数,避免不必要的时长浪费,统计完后记得将qq重新赋值为0方便下一次判断。
2024-07-26 17:49:56
514
原创 单调栈解决向右取第一个最高位(洛谷2947)
二,(核心思路)关于单调栈,先依次从临时栈中依次往单调栈填入数据,若填入的数据比前一位小,保留数据和ID(位置),若比前一位大,则压碎(删除)前一位的数据,直到前一位数据比本身要大,并且前面被压碎的数据对应的输出位置是该较大数据的ID,重复此步骤,直到单调栈无新数据加入,留在单调栈中的数据所输出ID便为0;四,值得注意的是,在while中赋值的时候,先把out数组填入答案,再top--,直接快速删除单调栈前一位较小值,并且out的索引是单调栈的对应位的id,等于的是该循环中i的值,既第几位;
2024-07-25 22:16:17
279
原创 双栈实现基本计算器(力扣-224)
若判断不为括号,再判断是否为数字字符,若是数字,则通过进位依次“-‘0’”来将数字字符转为整型,并压入栈中,返回数位时记得将迭代的变量-1,以保证不会漏掉数位(记不得也可以不加,但不排除会遇到特殊情况);若既不是括号也不是数字,则只可能为加减号,判断此符号前一位是否还是符号,若是,则加上0防止出现错误计算,遇到符号后便开始计算,从两栈提取数据开始运算,一样的不要忘记将前括号弹出;1,其中计算的过程我使用的是令临时变量来获取两栈对应位的数据,再通过判断加减,算得数据后压入数据栈;(+,-,(,)均属于符号)
2024-07-24 11:46:15
482
原创 利用c++自带函数以及c手搓实现栈及其简单功能(洛谷B3614)
1 首先最重要的,关于栈的内存分配,使用unsigned long long类型,可以存的大数据,其次此定义务必放在main函数外作为全局声明,若放在main或其他函数中作为局部声明会导致内存溢出,导致程序运行崩溃(表示就是这个“特性”导致本码喽多花了1个小时反复研究【崩溃.jpg】)2 值得注意的是,关于top=0的初定义,务必放在第一次关于T的循环层,不要贪图方便把什么变量都放在函数开头一起来定义(这又是另一个悲伤的故事了)但是使用Switch本码喽过不了,不知道有没有懂行的大佬指正一下(膜拜)
2024-07-23 22:52:22
285
原创 两个数值链表逐位相加并处理进位(力扣面试150—两数相加)
本函数中,利用sum来计算两链表各个对应数位之间的数值和,val表示该位的相加结果,carry表示是否进位,进位是1,没有则为0,(进位不可能大于1);关键代码,在此for循环中,先定义sum和val,然后设结束条件为两原链表全为空,然后对两链表依次判断是否为空,不为空就指向下一位;if条件若头链表为NULL,既链表相加的初始阶段,构建头结点,赋值该位,并将下一位做好初始化,最后将目前节点放在头结点上;头结点不为空后,开始设定目前节点的下一位节点,用来延续节点,继续赋值,设立下下位,更新目前节点位置;
2024-07-22 10:50:46
1415
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅