广告
广告
广告
前言有时候因为我们误操作导致openClash核心啊或者其他发生了问题,没法恢复了,以前的土办法就是重新安装系统,再来一遍,最近不想再折腾了,想着能不能手动卸载再安装一下呢?但是路由系统本身没有提供卸载可视化按钮,于是我们只能通过命令的形式卸载了。手动卸载先ssh连接路由,这一步就不多说了,连完之后我们输入命令:opkg list-installed | grep openclash这是用于筛选查询,查询openclash的包名,因为我们卸载需要完整包名。一般会返回如下:luci-app-openclash - 0.46.014-beta如果你想查看所有已安装的包,然后自己找,去掉gre...
前言最近pve换了一块新固态,用于替换原来的机械硬盘,换固态第一个原因是主机搬来搬去,机械盘怕到时候有损伤,那数据就没了,第二是我用来看视频的话,机械的读取确实是一个瓶颈,当然也有可能是因为程序垃圾导致读取卡顿,毕竟我没有装nas这种系统来使用。在更换之前我考虑到数据的迁移,由于pve格式化后的磁盘格式为ext4,这个格式在linux和mac系统中是可以通用的,但是windows本身是没有对它的官方支持,所以当我把磁盘拆下来用移动硬盘盒插电脑时,文件资源管理器中是不是出现对应盘符的。为此我考虑了一下几种数据迁移的方式:pve通过smb局域网共享磁盘;windows本身通过wsl2进行挂载...
前言最近使用mysql的时候都是用的一个便携版,打开命令界面就能用了,也不用安装什么依赖,也不需要安装服务,比较方便。但是有时候需要局域网共享一下mysql,为此水个文章记录一下。注意本教程不适用大部分便携版,可能只适用我这种版本的,大家可以参考一下。教程首先我们需要在mysql的配置文件:my.ini添加如下内容:[mysqld] bind-address=0.0.0.0表示mysql启动时要使用ip地址。然后由于便携版的mysql没法直接通过终端进入到命令界面,我们使用Navicat Premium Lite 17这个软件来进入mysql的命令界面。Navicat先本地连接mysql...
前言随着项目的复杂度,有时候会用到cherry-pick的情况,但是cherry-pick如果应对太多的commit操作上也会不方便,假如我们有一个dev分支,一个功能分支A,现在功能A上有10个commit提交,都是针对这一个功能的,我们需要将其合并到dev分支。传统的merge合并会将A分支的10个commit提交都合并到dev上,导致commit树变得繁琐。为此我们需要把这10次commit改成一个commit提交。教程首先我们先切到dev分支:git checkout develop然后通过--squash命令来压缩commitgit merge --squash aa就是被合并...
前言我们创建了很多分支,但是有一天一些旧的无用的分支已经在远程仓库删除了,但是我们本地对应的分支信息还在,我们需要将其和远程仓库同步。教程首先是远程分支同步处理:git fetch --all --prune获取所有远程仓库的最新提交,并删除本地仓库中不再存在的远程跟踪分支。但是我们只能删除远程的分支,事实上git会在本地创建一个本地的分支,分支名的区别:远程分支是origin/xxx,本地是xxx,通过这个命令我们只是删除了origin/xxx,本地的分支还在。如果分支不多,可以自己手动一个个删除。如果分支多,或者很频繁处理这个事情,我们可以创建一个bash脚本来处理这个事情。创建文件...
前言最近在发版的时候遇到一个头疼的问题,就是develop开发分支上的一个功能暂时还不能上线,但是其他的功能提交需要上线,此时平时常用的merge合并就不太行了。为此老大提了一个新的合并方式:git cherry-pick,这个我之前都没有使用过,它的作用就是可以提取其他分支的指定commit进行合并,这样就可以跳过不能上线的功能提交了。教程没有图,在b站视频上偷了一张图来用。可以看到我们有两列分支,左边的12357就是主分支,右边的468就是开发的新功能,但是6这个提交不能进行合并,我们需要提取4和8合并到主分支。在cherry-pick之前我们需要将分支切换到main分支,因为最终代...
前言最近在使用Nuxt3开发官网的时候,需要有一些地址跳转,但是跳转的地址是绝对路径,比如我官网是/a的域名路径,但是需要从官网跳转到/b路径的时候,nuxt就会报错。在控制台会报警告:No match found for location with path "/b"在通过generate命令打包的时候还会报错: Error: [404] Page not found: /b导致我们打包失败,实际上这个路径在生产环境是存在的,只是在本地开发的时候不存在。不管我们使用A元素还是NuxtLink标签,配置的target="_blank"也没有用,该报...
前言安装的时候总是碰到windows的PowerShell总是没有配置文件,一般谁会去记创建配置的命令啊,为此写个文章记录一下。教程安装Starship先去github下载Starship的msi安装包。github地址:Starship找到starship-x86_64-pc-windows-msvc.msi这个安装包下载。下载完毕后安装即可。创建PowerShell配置文件安装完毕后我们配置一下PowerShell。首先看看配置文件有没有,输入命令:notepad $PROFILE如果打开的不是Microsoft.PowerShell_profile.ps1文件就是没有,我们手动创建...
前言最近写微信相关的功能,要求用户必须关注公众号才能使用功能,所以我们要有一个办法去判断是否关注了公众号,查了下,网上好多乱七八糟的教程,全都没说到点子上,当然也有可能是历史原因,微信的api年年改。教程[hide]获取用户信息判断是否关注实际上现在用于用户是否判断关注公众号,微信官方有提供一个接口,接口会返回一个subscribe字段,用于告知该用户是否关注。官方文档:获取用户基本信息(UnionID机制)GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lan...
前言这是个很奇妙的事情,后端在配置SSL证书的时候出现了一些问题,导致在mac系统上可以正常https访问,但是在其他系统就不行了,因为ssl证书校验不通过,导致请求直接 500错误。本来让后端重新配个正确的证书就行了,但是为了赶时间测试,我这边也得做一个处理,就是虽然请求的是https的api,但是必须关闭ssl验证。这就很奇妙了,从来没有干过,为此写个文章,方便以后查询。教程axios请求配置axios请求它有两个配置属性,分辨对应http和https,我们只需要从node的模块http和https中引入Agent ,然后new出它的实例,同时传入关闭ssl验证的属性即可。impor...
前言最近在写后端的时候,需要与其他后端服务进行沟通调用,为此就涉及到了信任的问题,对方如何知道我的请求是可信的,总不能随便一个人的请求它就要进行反馈,所以就用到了OAuth2中的Client Credentials 客户端模式来实现认证,通过一个指定的api请求获取到token,然后之后的其它api通信都通过携带这个token来实现认证。其实就和前端的token校验是模式是一样的,但是唯一不同的就是我怎么去发送一个Client Credentials规范的请求来获取token。OAuth2 有哪些模式?为了了解Client Credentials 模式,就不得不了解下OAuth2了。OA...
前言为什么要生成一个统一的入口文件,其实也是为了简化引入,在Nestjs中我们会根据业务产生很多的DTO和Entity文件,还有一些公共的封装,比如封装的拦截器、过滤器、管道等;这些东西为了方便管理,我们都会存放在不同的目录下。比如我个人常用的:common/guards这是一个自定义守卫的目录,但是不同的守卫它会有自己的一些文件,这是我就会做二次划分:common/guards/jwt-auth common/guards/content-type common/guards/index.ts我会将不同的守卫单独再用一个文件夹存放,然后在同级的情况下使用一个index.ts文件来做...
前言因为后端用java写的项目用到了swagger来生成文档,用起来真的一言难尽,但是为了快速开发,很多时候并没有太多时间来单独写一份api文档,更别说长期更新维护了。所以用代码来生成文档,好像就成了一种需求。刚好有机会我能全栈负责一个项目,当然要搞起来啊,虽然不用,但是这不就是成为项目经验的一种了。开搞。安装依赖并封装启动相关代码pnpm i @nestjs/swagger安装后我们先去环境变量文件新增几个配置项,用于开发和生产环境使用。# 是否启用swagger SWAGGER_ENABLED=true # swagger 标题 SWAGGER_TITLE="API 文档&...
前言最近在Nestjs项目中使用了swagger来帮助生成api文档,但是当我在返回的类上使用了泛型来传递类型约束的时候,swagger就报错了。我先声明了一个父类用于复用分页属性:// pagination.entity.ts export interface PaginationEntityData<T> { current_page: number; page_size: number; total: number; list: T[]; } export class PaginationEntity<T> { /...
前言项目全线使用vue3的时候,自然使用的是配套更加契合的vite打包工具,于是自然而然会用到很多新的语法,比如这两年开始普及的可选链语法,这个语法都已经纳入声呐的代码规范中了,但是vite自身打包的时候,并不会做过多的兼容处理。默认情况vite的兼容目标是支持原生ES模块,原生ESM动态导入和import.meta的浏览器,官方预设的兼容目标如下:es2020edge 88firefox 78chrome 87safari 14而我们的可选链正是es2020版本才有的,所以vite在打包后不会做任何兼容处理,这就导致了一些浏览器版本低一点的设备,打开网站就会出现白屏的情况。显然这么新的...
前言先说原因,由于国内是禁止访问一些站点的情况下(国情如此),导致vscode无法访问到对应的api请求服务,所以导致一直启动不起来,得到的错误基本上都是:warn Error connecting to relay, will retry: error connecting to tunnel: websocket error: IO error: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 (os error 10060)即便我们使用clash做代理处理,但是由于这是终端的请求,普通的代理方式已经不管用了,而通过一些命令处理,比如:CMDset https...
前言最近才发现,nuxt3项目打包后会产生两份css内容,一份是内联样式,一份是css文件样式,最终是css文件样式覆盖了内联,但是这两份样式是一模一样的,而且都是vue组件才会有这种情况,让人不得不怀疑是不是打包出现问题了。事实上也并非如此,这是nuxt3的一个特性,且仅在使用vite的时候才会有,这个特性就是inlineStyles内联样式,这样html可以很快的渲染出东西,大概是这样一个意思。如果你不需要,或者部分组件不需要,可以通过配置进行修改。教程[hide]我们找到nuxt.config.ts文件,配置如下内容:export default defineNuxtConfig(...
前言以前使用PostCSS做css兼容性处理,常常就是使用autoprefixer做个浏览器前缀处理就完事了,但是实际上如果真要实现所谓的兼容性处理,css甚至还需要做转换处理,类似于js的async...await的语法转换处理。autoprefixer只是自动添加浏览器前缀,而本次使用的postcss-preset-env除了自动添加浏览器前缀,并且会根据目标浏览器自动转换成兼容的格式,包含许多其他 CSS 提案的 polyfill。举个例子::root { --main-color: #06c; } body { color: var(--main-color);...
前言最近在写新的项目,其中遇到一个问题,我的登录页和注册页相关的页面,他们的布局是相同的,所以理所当然的封装了一个layout组件,然后每个页面自己import引入它并使用,这么看其实没有问题。但是当我给layout增加了一个持久的动画的时候,切换页面由于组件会重新渲染,这就导致动画又重新开始了,显得整体非常突兀。于是不得不将layout组件提升到route-view路由视图的外层,然后又要考虑其他layout布局也要生效,于是就有了仿nuxt的动态布局的需求。我希望在路由的meta配上一个layout属性,然后通过这个属性指定对应的布局组件。[hide]代码注意事项首先不能直接从rou...
先确保能访问外网输入ping命令测试:ping -c 4 www.baidu.com意思是ping 4次指定网址,这里是ping的百度。然后返回如果有响应值就是可以的,例如:PING www.baidu.com (183.240.98.161): 56 data bytes 64 bytes from 183.240.98.161: seq=0 ttl=49 time=32.139 ms 64 bytes from 183.240.98.161: seq=1 ttl=49 time=32.683 ms 64 bytes from 183.240.98.161: seq=2 ttl=49 ...
前言这个是无意间看到b站的一个视频,发现挺好的,css实现本身还不吃太高的配置,视频链接如下:【Sass实现星空效果【渡一教育】】教程中使用了scss的除法运算法,但是这个用法在新版本中已经弃用了,现在推荐使用math语法,如果你的scss版本是新版本的,比如1.77.1,使用这种方式会报错。教程配置Math语法支持在vite的scss中配置如下;// vite.config.ts export default defineConfig({ css: { preprocessorOptions: { scss: { additionalData:...
前言当我们访问一些需要登录才能访问的页面,通过路由守卫我们会被重定向到登录页,同时会在链接参数里携带一个redirect字段,表示登录完成后跳转到redirect的路由。单独考虑这个问题,我们只需要在登录页处理这个问题就行了,但是随着业务的变化,有时候不一定只在登录页使用,这个重定向的功能可以在多处使用。总不能在每个要用到重定向的地方加if判断是否存在redirect字段吧。为此我封装了一个专门处理重定向的hooks:useRedirect.ts代码[hide]// useRedirect.ts import type { RouteLocationRaw } from "vu...
前言当我们使用Object.keys获取某个对象的key数组的时候,ts推导出来的类型是string[],当我们再通过forEach去遍历这个key数组时,由于string类型与对象具体的key不一致,导致报错:素隐式具有 "any" 类型,因为类型为 "string" 的表达式不能用于索引类型。我感觉ts这里的推导能力太差了,明明已经把具体的对象传递给他了,结果它直接返回一个string[]类型来一劳永逸,导致后续通过string类型去拿对象的value,就导致类型不匹配了。解决办法以前的我会这样写:const kindMap = { balance: 1, gpu: 2 };...
最近评论