首页
关于
Search
1
AdGuardHome 安装及部署教程
45,726 阅读
2
关于微软Azure学生白嫖指南
11,611 阅读
3
Oracle开放全部端口并关闭防火墙
11,356 阅读
4
搭建基于telegram的无限网盘
11,081 阅读
5
最新Cloudflare免费自选IP教程(非Partner)
9,965 阅读
默认分类
技术搬砖
教学设计
故事奇谈
生活琐事
错题分析
精品软件
登录
找到
119
篇与
admin
相关的结果
- 第 5 页
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 的项目,确定 image.png图片 根据自身情况修改内容后即可(其实就是起一个你自己喜欢的名字,默认的也行),其他部分不需要操作,然后保存并部署,稍等即可 自定义 该图床是支持自定义设置的,我们可以进行设置 进行绑定域名操作,这一步从 custom domains 即可快速绑定已经解析到 cf 的域名 image.png图片 想要开启图片管理功能,依次点击设置->函数->KV 命名空间绑定->编辑绑定->变量名称填写:img_url KV 命名空间 选择你提前创建好的 KV 储存空间,开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面,我这里的 KV 名称就叫 img_url,因此这样填写,请在使用时将其替换为自己的 KV 名字。开启后访问 http(s):// 你的域名 / admin 即可打开后台管理页面。(不会创建 KV?请看这篇教程) image.png图片 image.png图片 后台可以添加登陆验证,前往后台依次点击设置->环境变量->为生产环境定义变量->编辑变量 添加如下表格所示的变量即可开启登录验证 BASIC_USER <后台管理页面登录用户名称> BASIC_PASS <后台管理页面登录用户密码>image.png图片 也可以使用 cloudflare access 进行统一登陆,但是需要注意的是需要保护路径包括 / admin 以及 /api/manage/* 关于 cloudflare access 我可能将来也会出一期博客精讲,毕竟真的超级好用 image.png图片 开启图片审查,可以前往 https://moderatecontent.com 输入邮箱申请一个图片审查的 api 把申请到的 api 填在刚才提到的环境变量中,添加一个变量名称为ModerateContentApiKey,值为你刚刚第一步获得的 API key image.png图片 还有白名单(不经过审查),黑名单(不予以显示),统计和搜索功能在后台可用 最后,在完成这些设置后一定一定要记得重新部署哦!!! 只有 web 前端不方便?没关系,我们可以搭配 picgo 进行食用 我们需要用到 GitHub - yuki-xin/picgo-plugin-web-uploader 这个插件,可以自行在 C:\Users\XXX\AppData\Roaming\picgo 输入命令安装,记得重启软件 npm install picgo-plugin-web-uploader或者在程序中搜索 web 就可以看到(反正这样我是安装不上) image.png图片 按照如图进行配置然后保存应用即可 image.png图片
技术搬砖
# 图床
# telegraph
# picgo
admin
1年前
0
376
0
2023-12-29
DailyHot今日热榜部署教程
DailyHot 今日热榜:聚合了多个平台的热搜,一页尽知天下事,推荐部署!项目均来自于imsyy大佬,后端项目:DailyHotApi,前端项目:DailyHot image-20231229102444696图片 img图片 一、准备工作 1、一台VPS,安装了基本环境,本教程以宝塔面板为例 2、如果打算前后端分离,需要准备两个二级域名,本教程后端域名:hot-api.bbit.fun,前端域名:hot.bbit.fun 二、后端API部署 1、源码部署 clone项目 cd /www/wwwroot git clone https://github.com/imsyy/DailyHotApi.gitTips:服务端口以及允许的域名可在根目录下的.evn文件内修改 image-20231229110249169图片 安装Node.js、npm、pnpm apt update -yapt install nodejs npm -ynpm install -g pnpm切换到项目路径、安装依赖 cd DailyHotApi pnpm install安装【PM2管理器5.5】 我们先到宝塔的软件管理,搜索pm2,安装【PM2管理器5.5】 image-20231229104849928图片 点击PM2管理器 5.5右边的设置,点击Node版本,我选择了v18.19.0,等待切换完成 image-20231229104948921图片 点击【模块管理】,在搜索框输入pnpm,点击【安装】 image-20231229105033790图片 前往 PM2管理器 —项目列表— 添加项目 启动文件:选择网站根目录的index.js,比如我的:/www/wwwroot/DailyHotApi/index.js,其他的默认不用管,点击提交 image-20231229105235724图片 最后前往项目列表— 为该项目映射添加域名 image-20231229105449329图片 image-20231229105824487图片 Tips:如果前端根目录下的.evn文件内是https协议,必须用宝塔申请部署免费SSL证书 温馨提醒:如果使用的是如 腾讯云 阿里云 华为云等服务器,需要前往安全组/防火墙 添加设置的服务器端口6688,其它服务器需要在宝塔面板 – 安全 – 添加端口规则 至此,API就部署好了 测试 在浏览器输入:http://你的小鸡ip:6688/,出现以下界面说明成功: image-20231229110536271图片 2、Docker部署 安装及配置 Docker 将不在此处说明,请自行解决本地构建 拉取源代码 git clone https://github.com/imsyy/DailyHotApi.git构建 cd DailyHotApi docker build -t dailyhot-api .运行 docker run -p 6688:6688 -d dailyhot-api在线部署 // 拉取 docker pull imsyy/dailyhot-api:1.0.5 // 运行 docker run -p 6688:6688 -d imsyy/dailyhot-api:1.0.5后续可以加上cf域名解析+nginx反代 三、前端部署 前端编译比较耗费内存,请使用至少有2G内存的小鸡或在本地编译1、源码部署 clone项目 git clone https://github.com/imsyy/DailyHot.git如果是在本地编译,要确保node版本>16.x.x,具体可以看编译时的提示信息 修改.env文件 将VITE_GLOBAL_API改为你的后端api的url,并修改备案号 image-20231229111714865图片 Tips:如果后端根目录下的.evn文件内是https协议,必须申请部署免费SSL证书 编译打包项目 cd DailyHot pnpm install pnpm build或者npm打包 cd DailyHot npm install npm run build编译完成,没有报错的话,项目目录下会有一个dist目录 image-20231229111831253图片 Nginx部署 在宝塔中新建站点,将dist目录下的文件全部复制到宝塔站点根目录中即可 2、Docker部署 拉取源代码 git clone https://github.com/imsyy/DailyHot.git进入目录 cd DailyHot编辑start.sh脚本 vim start.sh要将API 地址及备案号作为环境变量传入打包好的静态资产并构建镜像需要写一个脚本,内容如下: #!/bin/ash # 替换 API 地址及备案号 find '/app' -name '*.js' -exec sed -i -e 's,http://localhost:6688,'"$API"',g' {} \; find '/app' -name '*.js' -exec sed -i -e 's,豫ICP备2022018134号-1,'"$ICP"',g' {} \; # # 启动 httpd 服务器 httpd -f -p 80 -h /app添加执行权限 chmod +x start.sh编辑Dockerfile FROM node:16-alpine WORKDIR /app COPY package.json . RUN npm install COPY . . RUN npm run build FROM busybox:1.35.0-uclibc WORKDIR /app COPY --from=0 /app/dist . COPY --from=0 /app/start.sh . ENV API="https://api-hot.imsyy.top" ENV ICP="豫ICP备2022018134号-1" CMD ["/app/start.sh"]构建镜像 docker build -t dailyhot-web .运行 docker run -d \ --name dailyhot-web \ -p 6677:80 \ -e API="https://hot-api.bbit.fun" \ -e ICP="没有备案捏" \ --restart always \ dailyhot-web修改刚刚搭建的api地址以及备案号,访问ip:6677即可看到热榜 后续可以加上cf域名解析+nginx反代 参考文档 在宝塔面板上部署DailyHotApi Docker部署“dailyhot” 部署一个自己的今日热榜(后端+前端)
教学设计
# DailyHot
# 今日热点
# Node可打包
admin
2年前
0
480
2
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,输入m img图片 2、根据提示,输入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,文件系统类型为ext4 2、向/etc/fstab写入文件系统的信息 echo UUID=468f89f6-32b7-432f-bd98-34d6fd8ad375 <挂载文件夹路径> ext4 defaults 0 0 >> /etc/fstab3、查看新分区信息 cat /etc/fstab最后reboot重启,验证开机是否自动挂载
技术搬砖
# Linux
# 磁盘
# 挂载
admin
2年前
0
105
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 连接时使用的 IP DNS 泄露检测:查看 DNS 出口信息,以便查看在 VPN/代理的情况下,是否存在 DNS 泄露隐私的风险 暗黑模式:根据系统设置自动切换暗黑/白天模式,也可以手动切换 简约模式:为移动版提供的专门模式,缩短页面长度,快速查看最重要的信息 查任意 IP 信息:可以通过小工具查询任意 IP 的信息 根据可用性检测结果,返回目前是否可以访问全世界网络的提示 搭建教程 建立站点 我这里用的是宝塔面板,其他面板或者裸 nginx 自行添加即可。 填写你的域名,并且做好解析和 SSL 证书。 image-20231127194622726图片 注意这里 PHP 版本选择纯静态即可,因为此项目是一个 Vue.JS 纯前端项目,不涉及 PHP。 2.上传源代码 源代码下载地址: https://github.com/jason5ng32/MyIP 远程 URL 直链: https://github.com/jason5ng32/MyIP/archive/refs/heads/main.zip 进入到网站根目录,删除掉宝塔自动创建的文件后下载代码包。 我的服务器是有宝塔面板,所以我这里直接使用 远程下载 功能。 image-20231127195048905图片 3.解压代码,安装步骤即完成。非常简单,开箱即用。 image-20231127195349155图片 4.访问你的解析域名地址 查看预览效果。 image-20231127200135498图片 优化调整 对接 Bing Map 也可以选择使用对接 Google Map 是永久免费的,但是 Google Maps 因为长城的缘故也无法国内使用。 所以我选择去申请一个 Bing Maps 的 API,也是免费的,但是一年只能发起 12 万次请求,个人公益使用完全够用。 如果想做更大的请求的话,去使用 Google Map 或者国内的 API 吧~ a.进入到 Bing Maps 官网,使用 Microsoft 登录,但是注意 Bing 是单独的部门,还是要注册的。 b.注册登录之后来到 My Keys 选项卡。 img图片 c.填写信息创建一个 key。 image-20231127201558458图片 d.复制 Key 并且添加到 app.js 中。 image-20231127201848201图片 图片 e.现在我们就可以在主界面中看到地图了。 2、IP数据显示错误 image-20231127205914651图片 这应该是一个小 Bug,原作者的编写平台可能是 MacOS,这是一个 emoji 表情,但是在 Windows 平台上会显示一个小方块。 解决办法也很简单,在 index.html 中搜索 IP 数据。将
技术搬砖
# ip
admin
2年前
0
512
2
2023-11-28
解决Docker容器 iptables问题
一、问题现象 最近在研究Docker容器日志管理时,启动容器出现iptables相关报错,具体问题如下 运行容器 [root@node-11 ~]# docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd出现如下报错 docker: Error response from daemon: driver failed programming external connectivity on endpoint quizzical_thompson (c2b238f6b003b1f789c989db0d789b4bf3284ff61152ba40dacd0e01bd984653): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.3 --dport 24224 -j ACCEPT: iptables: No chain/target/match by that name. (exit status 1)).二、解决办法 经过查阅资料得知是docker0网桥的原因,解决上面报错问题需要进行一下步骤 1.kill掉docker所有进程 [root@node-11 ~]# pkill docker 2.清空nat表的所有链 [root@node-11 ~]# iptables -t nat -F3.停止docker默认网桥docker0 [root@node-11 ~]# ifconfig docker0 down4.删除docker0网桥 apt install bridge-utils brctl delbr docker05.重启docker服务 [root@node-11 ~]# systemctl restart docker至此,成功运行docker容器 [root@node-11 ~]# docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd 644e43d03b9a2b30c062c8b5cde972b5514e6eef8a8ae95a6ab8c8004af6db5b技术分享图片
默认分类
# docker
# iptables
admin
2年前
0
201
2
2023-11-26
Debian一键换源
一键切换国内源 网站教程:网站:https://linuxmirrors.cn/ 开源:开源:https://github.com/SuperManito/LinuxMirrors bash <(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 6ED0E7B82643E131 E: 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 6ED0E7B82643E131 3、添加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 那你还需要先装个gnupg apt-get install gnupg -y
技术搬砖
# 换源
# Debian
# 一键
admin
2年前
0
254
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的VPS wget -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
技术搬砖
# dd
# LXC
# OpenVZ
admin
2年前
0
273
1
2023-11-23
Podman容器管理搭建教程
什么是 Podman podman 是一个用于处理容器的开源 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、重启podman systemctl 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 p1图片 我们将被要求输入登录详细信息,以便将它们输入到仪表板中。在这里,用户名和密码与我们用于登录 Linux 服务器的登录详细信息相同。 img图片
技术搬砖
# 容器
# podman
admin
2年前
0
418
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 记录的名字随意,只要你能区分就行)见下图例子: 用 VPS架设自己的 Sub-store图片 备注:后面的代理黄云勾不勾随意,如果你用其它第三方 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用 VPS 架设自己的Sub-store图片 看上一步的提示复制粘贴 不要抄下面的②根据上一步提示执行命令:看上一步的提示复制粘贴 不要抄下面的 ③安装 node.js fnm install v16.13.2④安装 PNPM 软件包管理器 curl -fsSL https://get.pnpm.io/install.sh | sh -用 VPS 架设自己的 Sub-store图片 看上一步的提示复制粘贴 不要抄下面的⑤根据上一步提示执行命令:看上一步的提示复制粘贴 不要抄下面的 ⑥安装 pnpm npm i pnpm -g⑦安装pm2项目管理器 进入宝塔面板软件商店安装pm2项目管理器 image-20231122174553288图片 image-20231122174654449图片 4、前端修改编译 ①修改后端接口地址 宝塔自带文件管理器打开项目根目录 Sub-Store-Front-End文件夹下的.env.production文件,将文件里线上环境接口地址改为自己准备的域名,比如https://subapi.domain.com/token,token尽量复杂,下面Nginx配置需要用到,本文这里填https://subapi.domain.com/UV3yVmNYreAhkVgP image-20231122182718090图片 ②添加登录页面 由于是要部署到服务器上,即为公开的,所以还需要一个登陆页面,阻止任何人访问 在项目根目录下的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 image-20231122183245746图片 示例: 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';image-20231122183720361图片 接着修改根路由,将如下代码修改为图片上的,就是将第一个path: '/'改为path: '/sub' image-20231122184529276图片 接着添加登陆路由,在path: '/:pathMatch(.*)'代码后面添加 { path: '/:pathMatch(.*)', component: NotFound, meta: { title: 'notFound', needTabBar: false, needNavBack: true, }, }, { path: '/', component: Login, meta: { title: 'login', needTabBar: false, needNavBack: false, }, }image-20231122184807929图片 在本页最后一行export default router;上面添加路由拦截 此处if (token === null || token === '' || token !== 'code') {的code即为上面登陆页填写的token router.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;image-20231122185021731图片 接着修改根目录,/src/views/SubEditor.vue,由于代码较多,可以直接搜索router.replace,会跳转到相应代码 把router.replace('/')改为router.replace('/sub') image-20231122185218430图片 ④登陆页的命名与翻译 根目录/src/locales/en.ts 可以使用搜索notFound: '404 Not Found',,再此行下面添加login: 'Login', image-20231122185424740图片 根目录/src/locales/zh.ts 搜索notFound: '地址未找到',,再此行下面添加login: '登录', image-20231122185522788图片 至此已经全部结束,接下来就是打包发布并部署服务器 ⑤前端打包 在前端 Sub-Store-Front-End文件夹下执行,安装依赖 pnpm install在前端 Sub-Store-Front-End文件夹下执行,执行打包命令 pnpm build打包好后,根目录会多出dist文件夹,此文件夹就是打包好的网站文件,也是我们需要发布服务器的 202209182143647图片 5、部署后端 进入后端项目里的backend文件夹,进入开源后端项目最新Releases下载执行文件 image-20231122190240938图片 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 save202209211913984图片 如果成功,至此后端已经成功启动 pm2常用命令 pm2 list pm2 log <name> pm2 stop id pm2 delete id6、配置网站 宝塔面板添加站点,并配置好证书 image-20231122190954530图片 将之前打包好的dist文件夹里面的所有文件剪切到substore.domain.com站点根目录,不要复制整体dist文件夹,而是里面的单个文件 subapi.domain.com域名配置反代,进入站点设置 location /UV3yVmNYreAhkVgP/{ //API-token 也要根据需要修改,尽量复杂 proxy_pass http://127.0.0.1:3000/; }image-20231122192313286图片 三、使用教程 进入网站https://substore.domain.com,输入之前设置的用户名和密码 image-20231122192447260图片 进入我的——后端设置 image-20231122192610493图片 如果后端是之前设置的线上环境地址,就不用管了,可以直接转换节点了 image-20231122182718090图片 如果不是,需要手动添加新后端并保存好,名称随意,链接填刚刚反代的地址,https://subapi.domain.com/UV3yVmNYreAhkVgP image-20231122193022455图片 参考文章: https://www.whitemoon.top/posts/e36e6bfe.html https://www.evan888.top/1974/
技术搬砖
# substore
# 订阅管理
admin
2年前
0
6,445
2
2023-11-20
Joe主题添加文章侧边栏目录
环境说明: Typecho:正式版 V1.1-17.10.30-release Joe: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'); ?>">image-20231120210827096图片 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>image-20231120211024490图片 保存,刷新文章页面即可看到左边的侧边栏目录。 以上的样式代码经过一定时间的使用,可以完美契合 Joe 主题,并且加入了部分响应式布局的代码,在移动设备上目录会自动隐藏,不会影响内容阅读。当然,如果是非 Joe 主题,样式可能需要重新设计。
技术搬砖
# Joe
# 目录
admin
2年前
0
81
1
上一页
1
...
4
5
6
...
12
下一页