广告
广告
广告
前言更新系统需要下载很多相关依赖,如果在国内,我建议是先换源,换成国内源再更新,如果是vps主机,应该就不用考虑这个事情了,不知道换源可以看我之前的文章。教程首先更新软件包索引:sudo apt update然后升级已安装的软件包:sudo apt upgrade如果你想更加果断,比如你是新装的系统,不需要考虑包之前的依赖啥的,可以直接全面升级:sudo apt full-upgrade这种方式也适合有时候的内核更新。完事后我们清理下无用的安装包:sudo apt autoremove一般情况下不需要重启系统,如果你不放心可以重启一下:reboot查看系统版本完事后重新连接ssh,我们可...
查询一个表的所有字段SELECT * FROM user;查询了user表的所有字段。指定字段查询SELECT id,email FROM user;别名SELECT id,email AS emails FROM user;它会将email字段名改成emails展示。查询条件-包含查询email中含有@符号的数据:SELECT * FROM user WHERE email LIKE "%@%";查询email中含有@符号并且id大于2的数据:SELECT * FROM user WHERE email LIKE "%@%" AND id>...
先进入数据库。创建表CREATE TABLE user ( id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, nickname VARCHAR(30) NULL, gender TINYINT NOT NULL DEFAULT 0, email VARCHAR(100) NOT NULL );查看表结构DESC user;给表添加数据INSERT INTO user SET email = "13xxx@qq.com",gender = 1;另一种添加方式,适合多条数据:INSERT INTO user (...
创建数据库CREATE DATABASE test CHARSET utf8mb4;查看所有数据库show DATABASES;进入指定数据库use 数据库名;查看创建的数据库信息SHOW CREATE DATABASE `ease-change-backend`;得到:CREATE DATABASE `ease-change-backend` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */数据库名可以用`来包...
前言应公司业务需求,最近在写一个谷歌插件,我本来想手动build后将dist目录打包成zip手动Releases一下,但leader说这样太浪费时间了,让我用github的Actions来做,我也是头一回接触这个,两眼一抹黑,花了点时间了解后,成功实现了该功能,可以理解为actions就是预先定义的操作步骤,将多个步骤组合成一个workflows工作流,每次通过触发条件触发这个工作流,有点类似CI/CD的感觉。教程创建workflows首先我们需要在项目根目录创建文件夹:.github └─ workflows创建一个.github目录,在该目录下再创建一个workflows目录,之...
前言一直很头疼axios的失败重试插件axios-retry会重复调用axios自定义的响应错误拦截器,而我们常常会在这个拦截器中编写一个用于弹出错误消息的弹窗,这就导致了一个问题:如果我们失败会重试3次,那么全部都失败的话就会触发4次响应错误拦截器,然后就会导致触发4次错误消息的弹窗,非常蛋疼。为此常常需要考虑怎么避免重复触发的问题,常见的一些做法比如通过自定义的拦截器接受的error对象上的config属性,添加一个计数器来处理,如果计数器大于等于3的话就可以触发消息弹窗。本来axios-retry插件本身就会在config上注入一个计数的属性和总次数,但是也没法用,实际测试中发现,...
前言在使用 Prisma 的 seed 功能时,我遇到了一个非常棘手的问题:默认情况下,ts-node 会将其运行的脚本视为一个独立的文件进行转换,这导致无法识别较新的 JavaScript API 或路径别名。这在一些复杂场景中特别麻烦,因为我们往往需要复用项目中的工具函数,而由于文件层级的原因,往往不得不使用大量的 ../../../ 路径。更糟糕的是,如果 A 文件引入 B 文件,而 B 文件又无法使用路径别名,这种链式问题使得项目结构变得更加复杂且难以维护。因此,我开始思考一下如何能够简化这一过程,并复用已有的 TypeScript 配置。教程[hide]首先我们先看下我的运行命...
前言有时候因为我们误操作导致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...
最近评论