首页
关于
Search
1
AdGuardHome 安装及部署教程
34,732 阅读
2
搭建基于telegram的无限网盘
9,039 阅读
3
最新Cloudflare免费自选IP教程(非Partner)
8,201 阅读
4
Oracle开放全部端口并关闭防火墙
7,782 阅读
5
关于微软Azure学生白嫖指南
7,726 阅读
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
登录
Search
标签搜索
docker
张至顺
金刚长寿功
PT
qBittorrent
onedrive
telegram
图床
青龙
内网穿透
一键
签到框架
目录列表
onedrive第三方
直链解析
searx
自建搜索引擎
python3
centos7
Transmission
myedunote
累计撰写
83
篇文章
累计收到
1
条评论
首页
栏目
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
页面
关于
搜索到
67
篇与
技术搬砖
的结果
2024-03-12
OVH Cloud 服务器配置 IPV6 地址
前言前段时间黑五的时候入手了一款年付17.88美元的OVH服务器,最近才发现后台分配了IPV6地址,但机器上默认并没有配置上IPV6连接,原来需要自己手动配置,这里就记录下如何给OVH的机器配置IPV6连接;开始在 OVH 的后台可以看到分配的 IPV6 地址及网关; 然后用 SSH 工具连接上服务器后开始配置;方法一方法一为临时配置,重启后失效 用root用户依次运行以下命令:ip addr add IPV6地址/64 dev ens3 ip -6 route add IPV6网关 dev ens3 ip -6 route add default via IPV6网关 dev ens3注意:将命令中的IPV6地址和IPV6网关替换成你自己后台分配的地址及网关方法二此方法配置后重启不会失效,永久有效,不支持Ubuntu18.04 编辑/etc/network/interfaces文件vi /etc/network/interfaces将以下代码添加到文件中iface ens3 inet6 static address IPV6地址 netmask 64 gateway IPV6网关 autoconf 0注意:将命令中的IPV6地址和IPV6网关替换成你自己后台分配的地址及网关 添加完成后保存退出,然后重启网络配置使其生效即可/etc/init.d/networking restart测试IPV6 测试命令ping6 ipv6.google.com # 或者 ping6 ipv6.baidu.com # 测试结果 root@sunpma:~# ping6 ipv6.google.com PING ipv6.google.com(lga25s62-in-x0e.1e100.net) 56 data bytes 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=2 ttl=48 time=6.82 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=3 ttl=48 time=6.81 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=4 ttl=48 time=6.72 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=5 ttl=48 time=6.78 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=6 ttl=48 time=6.80 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=7 ttl=48 time=6.72 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=8 ttl=48 time=6.78 ms 64 bytes from lga25s62-in-x0e.1e100.net: icmp_seq=9 ttl=48 time=6.86 ms一键脚本测试: *
2024年03月12日
30 阅读
0 评论
0 点赞
2024-03-12
Frps 内网穿透的常见快速部署方式
一个内网穿透服务端,下面整理常见的快速部署方式及其推荐程度一键脚本部署(⭐⭐⭐)Install(安装)Giteewget https://gitee.com/mvscode/frps-onekey/raw/master/install-frps.sh -O ./install-frps.sh chmod 700 ./install-frps.sh ./install-frps.sh installGithubwget https://raw.githubusercontent.com/mvscode/frps-onekey/master/install-frps.sh -O ./install-frps.sh chmod 700 ./install-frps.sh ./install-frps.sh installUninstall(卸载)./install-frps.sh uninstallUpdate(更新)./install-frps.sh updateServer management(服务管理器)Usage: /etc/init.d/frps {start|stop|restart|status|config|version}1Panel 应用商店一键部署(⭐⭐)宝塔应用商店部署(⭐)开源地址Frps 一键安装脚本 & 管理脚本
2024年03月12日
38 阅读
0 评论
0 点赞
2024-03-12
telegraph 和 cloudflare pages 部署免费图床
注意Cloudflare Function 免费版每日限制 100,000 个请求,如果需求大可以选择付费订阅方案由于图片文件实际存储于 Telegraph,Telegraph 限制上传的图片大小最大为 5MB图片加载使用了 cloudflare cdn 网络,在中国大陆访问会有概率受限,可以尝试进行 ip 优选毕竟白嫖,还是够用就好,避免滥用开启图片审查后,因为审查需要时间,首次的图片加载将会变得缓慢,之后的图片加载由于存在缓存,并不会受到影响准备一个正常连接互联网的环境一个 cloudflare 账号一个 GitHub 账号一个域名(也可用 pages 自带的)部署登入 GitHub 并且 fork 该仓库到自己账号备用打开 Cloudflare Dashboard,进入 Pages 管理页面,选择创建项目,选择连接到 Git 提供程序并选择刚刚 fork 的项目,确定根据自身情况修改内容后即可(其实就是起一个你自己喜欢的名字,默认的也行),其他部分不需要操作,然后保存并部署,稍等即可自定义该图床是支持自定义设置的,我们可以进行设置进行绑定域名操作,这一步从 custom domains 即可快速绑定已经解析到 cf 的域名想要开启图片管理功能,依次点击设置->函数->KV 命名空间绑定->编辑绑定->变量名称填写:img_url KV 命名空间 选择你提前创建好的 KV 储存空间,开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面,我这里的 KV 名称就叫 img_url,因此这样填写,请在使用时将其替换为自己的 KV 名字。开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面。(不会创建 KV?请看这篇教程)后台可以添加登陆验证,前往后台依次点击设置->环境变量->为生产环境定义变量->编辑变量 添加如下表格所示的变量即可开启登录验证BASIC_USER <后台管理页面登录用户名称> BASIC_PASS <后台管理页面登录用户密码>也可以使用 cloudflare access 进行统一登陆,但是需要注意的是需要保护路径包括 / admin 以及 /api/manage/*关于 cloudflare access 我可能将来也会出一期博客精讲,毕竟真的超级好用开启图片审查,可以前往 https://moderatecontent.com 输入邮箱申请一个图片审查的 api 把申请到的 api 填在刚才提到的环境变量中,添加一个变量名称为ModerateContentApiKey,值为你刚刚第一步获得的 API key还有白名单(不经过审查),黑名单(不予以显示),统计和搜索功能在后台可用最后,在完成这些设置后一定一定要记得重新部署哦!!!只有 web 前端不方便?没关系,我们可以搭配 picgo 进行食用我们需要用到 GitHub - yuki-xin/picgo-plugin-web-uploader 这个插件,可以自行在 C:UsersXXXAppDataRoamingpicgo 输入命令安装,记得重启软件npm install picgo-plugin-web-uploader或者在程序中搜索 web 就可以看到(反正这样我是安装不上)按照如图进行配置然后保存应用即可
2024年03月12日
62 阅读
0 评论
0 点赞
2023-12-03
Linux挂载硬盘并自启动
一、查看当前已经分配磁盘的空间情况df -hroot@******# df -h Filesystem Size Used Avail Use% Mounted on udev 126G 0 126G 0% /dev tmpfs 26G 35M 26G 1% /run tmpfs 126G 0 126G 0% /dev/shm /dev/sdb1 454G 31G 401G 8% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 126G 0 126G 0% /sys/fs/cgroup tmpfs 26G 28K 26G 1% /run/user/117 tmpfs 26G 28K 26G 1% /run/user/1000发现新加的硬盘并没有挂载上来, 其中,系统默认磁盘是在/dev/sdb1上二、查看当前磁盘的大小fdisk -lroot@****# fdisk -l Disk /dev/sda: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdb: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe8caedc1 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 968802303 968800256 462G 83 Linux /dev/sdb2 968804350 976771071 7966722 3.8G 5 Extended /dev/sdb5 968804352 976771071 7966720 3.8G 82 Linux swap / Solaris其中/dev/sda磁盘发现并未使用三、对该磁盘进行分区并格式化fdisk /dev/sda1、通过提示,command,输入m2、根据提示,输入n,新增一个分区这里的 /dev/sda 是步骤(1)中 查询出来的硬盘识别文件地址。如果你在步骤(1)中要格式化的硬盘存在于其他地址请相应改变。在提示信息引导下,我选择(n) “add a new partition” 将硬盘划分为一个新分区。然后选择(e) “extended” 作为扩展分区。因为我整个硬盘只作为一个分区,所以接下来的Partition number,我默认(1)。指定柱面直接默认回车,接下来其他操作也默认回车即可,如果自己有需求自行按照说明选择。最后再输出(p)确认下自己创建的分区表信息是否正确。确认无误后(w)保存。*如果成功,系统会提示“The partition table has been altered” 分区表已更改完毕 。*3、再次查看磁盘分区情况,已经有一个/dev/sda1的磁盘fdisk -l4、对磁盘进行格式化,使用ext4格式,该操作耗时几分钟,耐心等待结束;mkfs -t ext4 /dev/sda1四、挂载新硬盘到文件目录1、新建文件夹我将其保存在本地用户目录下新建文件夹中。创建文件夹命令样例为:mkdir <文件夹路径>2 、挂载硬盘到目录mount /dev/sda1 <文件夹路径>但是发现文件夹权限不足,因此赋予其和其他普通文件夹相同权限:chmod 777 <文件夹路径>权限如有需求相应调整,777是最高权限,然后进入文件夹新硬盘已经可以正常操作使用。五、开机自动挂载1、查看硬盘UUID:blkid这里/dev/vda1的UUID为468f89f6-32b7-432f-bd98-34d6fd8ad375,文件系统类型为ext42、向/etc/fstab写入文件系统的信息echo UUID=468f89f6-32b7-432f-bd98-34d6fd8ad375 <挂载文件夹路径> ext4 defaults 0 0 >> /etc/fstab3、查看新分区信息cat /etc/fstab最后reboot重启,验证开机是否自动挂载
2023年12月03日
58 阅读
0 评论
0 点赞
2023-11-28
搭建一个自己的IP信息工具箱
这是一个完全开源的 IP 信息查看器,可以查询本机 IP、查询任意 IP、查询国内外网站可用性等。这是我第一次用 Vue.js 练手的项目。如果你看着 https://ip.skk.moe 眼馋,那就用这个程序搭建一个属于自己的吧。主要功能看自己的 IP:从多个 IPv4 和 IPv6 来源检测显示本机的 IP看 IP 信息:显示所有 IP 的相关信息,包括国家、地区、ASN、地理位置等可用性检测:检测一些网站的可用性:Google, Github, Youtube, 网易, 百度等WebRTC 检测:查看使用 WebRTC 连接时使用的 IPDNS 泄露检测:查看 DNS 出口信息,以便查看在 VPN/代理的情况下,是否存在 DNS 泄露隐私的风险暗黑模式:根据系统设置自动切换暗黑/白天模式,也可以手动切换简约模式:为移动版提供的专门模式,缩短页面长度,快速查看最重要的信息查任意 IP 信息:可以通过小工具查询任意 IP 的信息根据可用性检测结果,返回目前是否可以访问全世界网络的提示搭建教程建立站点 我这里用的是宝塔面板,其他面板或者裸 nginx 自行添加即可。填写你的域名,并且做好解析和 SSL 证书。注意这里 PHP 版本选择纯静态即可,因为此项目是一个 Vue.JS 纯前端项目,不涉及 PHP。2.上传源代码源代码下载地址: https://github.com/jason5ng32/MyIP远程 URL 直链: https://github.com/jason5ng32/MyIP/archive/refs/heads/main.zip进入到网站根目录,删除掉宝塔自动创建的文件后下载代码包。我的服务器是有宝塔面板,所以我这里直接使用 远程下载 功能。3.解压代码,安装步骤即完成。非常简单,开箱即用。4.访问你的解析域名地址 查看预览效果。优化调整对接 Bing Map也可以选择使用对接 Google Map 是永久免费的,但是 Google Maps 因为长城的缘故也无法国内使用。所以我选择去申请一个 Bing Maps 的 API,也是免费的,但是一年只能发起 12 万次请求,个人公益使用完全够用。如果想做更大的请求的话,去使用 Google Map 或者国内的 API 吧~a.进入到 Bing Maps 官网,使用 Microsoft 登录,但是注意 Bing 是单独的部门,还是要注册的。b.注册登录之后来到 My Keys 选项卡。 c.填写信息创建一个 key。d.复制 Key 并且添加到 app.js 中。e.现在我们就可以在主界面中看到地图了。2、IP数据显示错误这应该是一个小 Bug,原作者的编写平台可能是 MacOS,这是一个 emoji 表情,但是在 Windows 平台上会显示一个小方块。解决办法也很简单,在 index.html 中搜索 IP 数据。将
2023年11月28日
212 阅读
0 评论
0 点赞
2023-11-26
Debian一键换源
一键切换国内源网站教程:网站:https://linuxmirrors.cn/开源:开源:https://github.com/SuperManito/LinuxMirrorsbash <(curl -sSL https://linuxmirrors.cn/main.sh)海外使用:bash <(curl -sSL https://linuxmirrors.cn/main.sh) --abroad 一键安装Docker:bash <(curl -sSL https://linuxmirrors.cn/docker.sh)一键切换官方源cp -r /etc/apt/sources.list /etc/apt/sources.list.bak;echo -e "deb http://deb.debian.org/debian buster main\ndeb-src http://deb.debian.org/debian buster main\ndeb http://security.debian.org/debian-security buster/updates main\ndeb-src http://security.debian.org/debian-security buster/updates main" > /etc/apt/sources.list;cat /etc/apt/sources.list;apt-get update;如果出现问题:1、Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'apt-get --allow-releaseinfo-change update2、GPG error: http://deb.debian.org/debian buster-backports InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131E: The repository 'http://deb.debian.org/debian buster-backports InRelease' is not signed.说明仓库没有签名,缺PUBKEY,按以下方法解决apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUB_KEY1> <PUB_KEY2>……比如上面那个就可以这样:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E1313、添加PUBKEY时提示,gpg: failed to start the dirmngr `'/usr/bin/dirmngr'`: No such file or directory我们只需要在系统上安装dirmngr包apt install dirmngr --install-recommends -y4、如果出现E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation 那你还需要先装个gnupgapt-get install gnupg -y
2023年11月26日
43 阅读
0 评论
0 点赞
2023-11-24
OpenVZ、LXC实现类似dd重装换系统
OpenVZ/LXC作为容器技术是不支持dd重装的,但是可以实现类似dd重装换系统的效果特点支持OpenVZ和LXC虚拟化技术支持Debian/CentOS/Alpine等多种系统的相互转换(及原地tp原理对于容器而言,其内核共享宿主机内核,自身打包了操作系统,应用和函数库等所有依赖。原理上只要替换对应的数据就可以替换系统,只不过要注意操作顺序,避免依赖关系冲突注意会抹除数据,因此如果有重要数据自行备份支持openvz 7,不支持openvz 6仅支持openvz和lxc等容器虚拟化技术,不支持kvm等虚拟机技术使用wget -qO OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutation.sh && chmod u+x OsMutation.sh && ./OsMutation.sh或者curl -so OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutation.sh && chmod u+x OsMutation.sh && ./OsMutation.sh对于磁盘空间小于1GB的VPSwget -qO OsMutation.sh https://raw.githubusercontent.com/LloydAsp/OsMutation/main/OsMutationTight.sh && chmod u+x OsMutation.sh && ./OsMutation.sh参考文章:https://www.nodeseek.com/post-5159-1开源项目:https://github.com/LloydAsp/OsMutation
2023年11月24日
57 阅读
0 评论
1 点赞
2023-11-23
Podman容器管理搭建教程
什么是 Podmanpodman 是一个用于处理容器的开源 Linux 工具,是一个无守护进程容器引擎,用于在 Linux 系统上开发,管理和运行 Open Container Initiative(OCI)容器。它可以用于管理任何由兼容开放容器倡议的容器引擎(如 Docker)创建的 Linux 容器,Podman 提供了一个与 Docker 兼容的命令行前端,可以简单地为docker命令取别名为podman即可使用,所以说如果你会Docker的话可以轻松上手Podman。Podman 实现了除了 Docker Swarm 的相关指令外几乎所有的 Docker 命令,你可以用他实现除了 Docker Swarm 相关之外的所有 Docker 操作,并且他还是一个“无守护进程容器引擎”,这就意味着你可以脱离 Docker daemon, 不需要执行 systemctl start docker 了安装启动CentOS 8已经内置Podman,CentOS 7下需要自行安装。CentOS 7可以使用yum命令安装Podman;yum -y install podman安装成功后使用如下命令启动podman服务。systemctl start podmanpodman的镜像源机制引入了一个注册表的机制, 要将镜像源在文件/etc/containers/registries.conf中注册后才能使用国内直接用 podman pull 拉取镜像会很慢,所以需要配置国内镜像源来加速访问1.获取阿里的镜像源地址你只需要登录阿里云的容器 Hub 服务 https://cr.console.aliyun.com 的控制台,使用你的支付宝 帐号,第一次登录时,需要设置一个独立的密码,左侧的加速器帮助页面就会显示为你独立分配的加速地址。2.修改Podman的注册表配置文件vim /etc/containers/registries.conf修改内容unqualified-search-registries = ["docker.io"]增加内容[[registry]] prefix = "docker.io" insecure = false blocked = false location = "d1234.mirror.aliyuncs.com" [[registry.mirror]] location = "hub-mirror.c.163.com" [[registry.mirror]] location = "registry.docker-cn.com"3、重启podmansystemctl restart podman常用命令podman images查看正在运行的容器列表podman ps podman ps -a //所有容器可删除正在运行容器podman rm -f id安装 cockpit更新软件源apt update apt upgrade默认情况下,Cockpit 软件包在 Debian 11 默认存储库中可用。现在我们运行以下命令将 Cockpit 安装到您的 Debian 系统:apt install cockpityum -y install cockpit cockpit-podman cockpit-dashboard cockpit-storaged cockpit-packagekit安装 cockpit 及其依赖项后,使用以下systemctl命令启动其服务:systemctl start cockpit systemctl enable cockpit systemctl status cockpit成功安装后,打开 Web 浏览器并使用 URL 访问 Cockpit Web 界面。您应该会看到 Cockpit 登录页面:http://your-server-ip-address:9090我们将被要求输入登录详细信息,以便将它们输入到仪表板中。在这里,用户名和密码与我们用于登录 Linux 服务器的登录详细信息相同。
2023年11月23日
130 阅读
0 评论
0 点赞
2023-11-22
自建Sub-Store订阅管理转换教程
Github Peng-YM大佬的Sub-Store提供了几乎全平台的代理转换,Loon、Surge等可以安装其提供的模块直接使用,本教程是将Sub-Store搭建为网站,更方便clash等使用一、前期准备域名,托管到 cloudflare(其它地方也行,但是 CF 相对比较方便)证书,免费证书三个月,自动续订即可服务器vps,配置高点,不要太低服务器需要安装好nginx,建议小白安装好宝塔面板,部署好基本环境二、部署过程1、域名设置在 cloudflare 的域名 DNS 记录里面添加两个 A 记录,一个是 substore.domain.com, 一个是 subapi.domain.com (实际 A 记录的名字随意,只要你能区分就行)见下图例子:备注:后面的代理黄云勾不勾随意,如果你用其它第三方 ssl 证书可以不勾,如果用 CF 的证书就勾上。2、克隆项目名称地址前端 Sub-Store-Front-Endhttps://github.com/sub-store-org/Sub-Store-Front-End.git后端 Sub-Store/backendhttps://github.com/sub-store-org/Sub-Store.git使用 git clone + 地址的方式克隆3、安装 node和pnpm环境,pm2管理器①下载和安装 fnm(Node.js 版本管理器)curl -fsSL https://fnm.vercel.app/install | bash看上一步的提示复制粘贴 不要抄下面的②根据上一步提示执行命令:看上一步的提示复制粘贴 不要抄下面的③安装 node.jsfnm install v16.13.2④安装 PNPM 软件包管理器curl -fsSL https://get.pnpm.io/install.sh | sh -看上一步的提示复制粘贴 不要抄下面的⑤根据上一步提示执行命令:看上一步的提示复制粘贴 不要抄下面的⑥安装 pnpmnpm i pnpm -g⑦安装pm2项目管理器进入宝塔面板软件商店安装pm2项目管理器4、前端修改编译①修改后端接口地址宝塔自带文件管理器打开项目根目录 Sub-Store-Front-End文件夹下的.env.production文件,将文件里线上环境接口地址改为自己准备的域名,比如https://subapi.domain.com/token,token尽量复杂,下面Nginx配置需要用到,本文这里填https://subapi.domain.com/UV3yVmNYreAhkVgP②添加登录页面由于是要部署到服务器上,即为公开的,所以还需要一个登陆页面,阻止任何人访问在项目根目录下的src/views下新建Login.vue文件Login.vue代码如下:<template> <div class='wrapper'> <div>欢迎使用</div> <nut-form :model-value='formData' ref='ruleForm'> <nut-form-item label='用户名' prop='name' required :rules="[{ required: true, message: '请填写用户名' }]"> <input class='nut-input-text' @blur="customBlurValidate('name')" v-model='formData.name' placeholder='请输入用户名' type='text' /> </nut-form-item> <nut-form-item label='密码' prop='pwd' required :rules="[ { required: true, message: '请填写密码' }, // { validator: customValidator, message: '必须输入数字' }, // { regex: /^(\d{1,2}|1\d{2}|200000000)$/, message: '必须输入0-200000000区间' } ]"> <input class='nut-input-text' v-model='formData.pwd' placeholder='请输入密码' type='text' /> </nut-form-item> <nut-cell> <nut-button type='primary' size='small' style='margin-right: 10px' @click='submit'>登录</nut-button> <nut-button size='small' @click='reset'>重置</nut-button> </nut-cell> </nut-form> </div> </template> <script lang='ts'> import { Notify, Toast } from '@nutui/nutui'; import { ref, reactive } from 'vue'; import { useRouter } from 'vue-router'; export default { setup() { const router = useRouter(); const formData = reactive({ name: '', pwd: '', }); const validate = (item: any) => { console.log(item); }; const ruleForm = ref<any>(null); const submit = () => { ruleForm.value.validate().then(({ valid, errors }: any) => { if (valid) { console.log('success', formData); if (formData.name == 'name') { if (formData.pwd == 'password') { Notify.success('登录成功,欢迎回来!',{ duration: 1000 }); Toast.loading('', { cover: false // 透明罩 }); sessionStorage.setItem('token', 'token') // 临时存储,关闭标签后就清除 setTimeout(() => { router.push({path: '/sub'}); // router.replace('/sub') Toast.hide(); }, 1200); } else { Notify.danger('密码错误!'); } } else { Notify.warn('用户不存在!'); } } else { console.log('error submit!!', errors); } }); }; const reset = () => { ruleForm.value.reset(); }; // 失去焦点校验 const customBlurValidate = (prop: string) => { ruleForm.value.validate(prop).then(({ valid, errors }: any) => { if (valid) { console.log('success', formData); } else { console.log('error submit!!', errors); } }); }; // 函数校验 const customValidator = (val: string) => /^\d+$/.test(val); // Promise 异步校验 const asyncValidator = (val: string) => { return new Promise((resolve) => { Toast.loading('模拟异步验证中...'); setTimeout(() => { Toast.hide(); resolve(/^400(-?)[0-9]{7}$|^1\d{10}$|^0[0-9]{2,3}-[0-9]{7,8}$/.test(val)); }, 1000); }); }; return { ruleForm, formData, validate, customValidator, asyncValidator, customBlurValidate, submit, reset }; }, }; </script> <style lang='scss' scoped> .wrapper { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; h3 { padding-bottom: 24px; } } </style>修改代码中的用户名、密码、token示例:if (formData.name == 'zqzess') { if (formData.pwd == 'zqzess') { Notify.success('登录成功,欢迎回来!',{ duration: 1000 }); Toast.loading('', { cover: false // 透明罩 }); sessionStorage.setItem('token', 'code') // 临时存储,关闭标签后就清除此处sessionStorage.setItem('token', 'code')定义的token为code,一定要记住,后面路由会用到此处formData.name == 'zqzess'定义的zqzess即为用户名此处formData.pwd == 'zqzess'定义的zqzess即为密码这种明文写在代码里面账号密码其实也不安全,仅作为一个简单的认证,以后有机会再改写需要后端认证的登陆③修改路由接下来需要把登陆页面添加至路由里面,并加入拦截,没有token的需要跳转登陆页项目根目录,/src/router/index.ts,添加:import Login from '@/views/Login.vue';接着修改根路由,将如下代码修改为图片上的,就是将第一个path: '/'改为path: '/sub'接着添加登陆路由,在path: '/:pathMatch(.*)'代码后面添加{ path: '/:pathMatch(.*)', component: NotFound, meta: { title: 'notFound', needTabBar: false, needNavBack: true, }, }, { path: '/', component: Login, meta: { title: 'login', needTabBar: false, needNavBack: false, }, }在本页最后一行export default router;上面添加路由拦截此处if (token === null || token === '' || token !== 'code') {的code即为上面登陆页填写的tokenrouter.beforeEach((to, from, next) => { // let token = window.localStorage.getItem('token') // let type = window.localStorage.getItem('type') if (to.path === '/' || to.path === '/login' || to.path === '/error') { // console.log("允许直接访问") next(); } else { // let token = window.localStorage.getItem('token') // 长期存储 let token = window.sessionStorage.getItem('token') // 临时存储,关闭标签后就清除 // console.log("需要token") if (token === null || token === '' || token !== 'code') { // console.log("无token,跳转登录") next('/'); } else { // console.log("有token") next(); } } }); export default router;接着修改根目录,/src/views/SubEditor.vue,由于代码较多,可以直接搜索router.replace,会跳转到相应代码把router.replace('/')改为router.replace('/sub')④登陆页的命名与翻译根目录/src/locales/en.ts可以使用搜索notFound: '404 Not Found',,再此行下面添加login: 'Login',根目录/src/locales/zh.ts搜索notFound: '地址未找到',,再此行下面添加login: '登录',至此已经全部结束,接下来就是打包发布并部署服务器⑤前端打包在前端 Sub-Store-Front-End文件夹下执行,安装依赖pnpm install在前端 Sub-Store-Front-End文件夹下执行,执行打包命令pnpm build打包好后,根目录会多出dist文件夹,此文件夹就是打包好的网站文件,也是我们需要发布服务器的5、部署后端进入后端项目里的backend文件夹,进入开源后端项目最新Releases下载执行文件cd /root/Sub-Store/backend wget https://github.com/sub-store-org/Sub-Store/releases/download/2.14.99/sub-store.min.js之后,执行pnpm i完成后再执行:pm2 start sub-store.min.js完成后继续执行:pm2 save如果成功,至此后端已经成功启动pm2常用命令pm2 list pm2 log <name> pm2 stop id pm2 delete id6、配置网站宝塔面板添加站点,并配置好证书将之前打包好的dist文件夹里面的所有文件剪切到substore.domain.com站点根目录,不要复制整体dist文件夹,而是里面的单个文件subapi.domain.com域名配置反代,进入站点设置location /UV3yVmNYreAhkVgP/{ //API-token 也要根据需要修改,尽量复杂 proxy_pass http://127.0.0.1:3000/; }三、使用教程进入网站https://substore.domain.com,输入之前设置的用户名和密码进入我的——后端设置如果后端是之前设置的线上环境地址,就不用管了,可以直接转换节点了如果不是,需要手动添加新后端并保存好,名称随意,链接填刚刚反代的地址,https://subapi.domain.com/UV3yVmNYreAhkVgP参考文章:https://www.whitemoon.top/posts/e36e6bfe.htmlhttps://www.evan888.top/1974/
2023年11月22日
1,453 阅读
0 评论
0 点赞
2023-11-20
Joe主题添加文章侧边栏目录
环境说明:Typecho:正式版 V1.1-17.10.30-releaseJoe:V7.7.1一、安装插件Github 仓库链接:plugins/MenuTree at master · typecho-fans/plugins · GitHub下载链接:https://github.com/typecho-fans/plugins/releases/download/plugins-M_to_R/MenuTree.zip二、插件使用2.1、启用插件将下载好的插件放在 usr/plugins/ 目录中,确保文件夹名为 MenuTree;激活插件,设置内可勾选“嵌入模式”与“独立模式”:“嵌入模式”勾选时,编辑文章用按钮插入或手写 < !-- index-menu -->(插入按钮功能貌似是无效的,还有注意,别照抄这个标签,我在标签的 ! 前面加了一个空格,不然它就会被解析成目录了) 标签发布即可显示目录树;“独立模式”勾选时,修改模板文件如 post.php 中写入 <?php $this->treeMenu(); ?> 也可显示。需要注意的是,在文章中渲染出来的目录默认是没有任何样式的,所以需要我们自定义样式。为了使目录显示为侧边栏,并且样式与 Joe 本来的侧边栏风格保持一致,这里使用“独立模式”,并用相应的 CSS 与 JS 文件来定义其样式。2.2、CSS文件将以下 CSS 代码保存至文件中,文件名为 menutree.css,文件放到主题目录的 assets/css 文件夹下。.menutree { position:sticky; top:60px; width:15%; margin:15px 15px 15px 0px; /* 溢出内容添加滚动条 */ overflow-y:auto; overflow-x:auto; background: var(--background); } /** 父元素<ul>与其中的子元素<li> **/ .index-menu-item { margin: 10px 0px; } .index-menu-list { margin: 5px 0px 5px 10px; } /** 所有<a>标签 **/ .index-menu-link{ color: var(--main); transition:all 0.2s ease-in-out 0s; padding:5px 0px; } .index-menu-link:hover { color: var(--theme); text-shadow: var(--text-shadow); font-weight:500; background-color:#efefef; } /* 锚点跳转定位 */ .menu-target-fix { display: block; position: relative; /* 偏移量 */ top:-100px; } /* 在宽度小于1000px的设备上隐藏短划线,以使目录的标题正常显示 */ @media screen and (max-width:1000px) { .joe_aside__item-title > .line { display:none; } } /* 在宽度小于800px的设备上隐藏目录侧边栏 */ @media screen and (max-width:800px) { .menutree{ display:none; } }2.3、JS文件将以下 JS 代码保存至文件中,文件名为 menutree.js,文件放到主题目录的 assets/js 文件夹下。/* 获取渲染好的目录的高度 */ menuHeight = document.getElementsByClassName("index-menu")[0].offsetHeight; /* 获取容器高度 */ containHeight = document.getElementsByClassName("joe_aside__item-contain")[0].offsetHeight; /* 获取容器 title 的高度 */ titleHeight = document.getElementsByClassName("joe_aside__item-title")[0].offsetHeight; /* 获取整个目录侧边栏对象 */ aside = document.getElementsByClassName("menutree")[0]; // 定义一个函数来修改目录的显示长度,从而使侧边栏能自适应目录的高度,避免出现大片空白部分 function changeMenuHeight(){ /* 调整容器高度 */ aside.style.height = titleHeight + containHeight + "px"; } // 如果目录的高度小于500px,调用函数将目录修改为实际高度,反之则将侧边栏的高度固定为500px if(menuHeight < 500){ changeMenuHeight(); } else { aside.style.height = "500px"; }2.4、修改 post.php 文件建议修改之前先备份 post.php 文件,如果修改失败可以随时还原回来。总共需要修改两个地方:导入 CSS 文件在文件前面的导入 CSS 文件:<!-- 导入目录的css文件 --> <link rel="stylesheet" href="<?php $this->options->themeUrl('assets/css/menutree.css'); ?>"> 2.添加目录代码 然后在 <div class="joe_container"> 与 div class="joe_main joe_post"> 之间添加如下代码:<!-- 文章目录代码 --> <section class="joe_aside__item menutree"> <div class="joe_aside__item-title"> <svg t="1642997936013" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2169" width="128" height="128"><path d="M838.3 895.9H197.9c-53.9 0-97.7-43.8-97.7-97.7V236.7c0-53.9 43.8-97.7 97.7-97.7h640.3c53.9 0 97.7 43.8 97.7 97.7v561.4c0.1 53.9-43.7 97.8-97.6 97.8zM197.9 203.8c-18.1 0-32.9 14.8-32.9 32.9v561.4c0 18.1 14.8 32.9 32.9 32.9h640.3c18.1 0 32.9-14.8 32.9-32.9V236.7c0-18.1-14.8-32.9-32.9-32.9H197.9z" fill="#666666" p-id="2170"></path><path d="M695.1 455.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 578.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 701.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM379.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5zM657.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5z" fill="#666666" p-id="2171"></path></svg> <span class="text">目录</span> <span class="line"></span> </div> <div class="joe_aside__item-contain"> <?php $this->treeMenu(); ?> </div> </section> <!-- 导入的js文件,必须在这里导入,否则不生效 --> <script src="<?php $this->options->themeUrl('assets/js/menutree.js'); ?>"></script>保存,刷新文章页面即可看到左边的侧边栏目录。以上的样式代码经过一定时间的使用,可以完美契合 Joe 主题,并且加入了部分响应式布局的代码,在移动设备上目录会自动隐藏,不会影响内容阅读。当然,如果是非 Joe 主题,样式可能需要重新设计。
2023年11月20日
28 阅读
0 评论
0 点赞
1
2
...
7