-
element-plus icon图标
# element-plus icon图标
## icon引用-组件名格式规范
本篇主要是介绍引用icon图标时`<el-icon><document-copy /></el-icon>`,`<el-icon><DocumentCopy /></el-icon>`两种不同的引用方式的区别
首先`<el-icon><document-copy /></el-icon>`的这种 PascalCase 的命名格式,是合法的 JavaScript 标识符。但是,由于你是在 index.html 直接写代码(DOM 模板),Vue 官方文档明确指出:
“在原生的 HTML 模板中,你应该始终使用 kebab-case 命名法。”
因此就会出现 `<el-icon><DocumentCopy /></el-icon>` 无法显示的问题
总结:
- 在 JS 里: 使用大写驼峰,比如 ElementPlusIconsVue.DocumentCopy。
- 在 HTML 里: 使用小写横杠,比如 <document-copy />。
## 使用时机问题
由于 Vue 的组件(如 <el-icon> 和 <document-copy>)需要被 Vue 的编译器“编译”后才能变成浏览器能看懂的 SVG 图标。当你使用 jQuery 的 append 方法添加 HTML 字符串时,例如下面这样:
```
let iconSvg = '<el-icon><document-copy /></el-icon>'
let copy = $('<i>' + iconSvg + '</i>');
$(this).append(copy)
```
这些内容是直接插入 DOM 的,完全绕过了 Vue 的编译过程。浏览器看到 <document-copy> 这个标签,不知道它是干什么的(因为它不是标准的 HTML 标签),所以什么都不显示。
解决方法就是直接使用原生 SVG,直接加载官方的 SVG 代码,例如下面这样:
```
let iconSvg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" ><path fill="currentColor" d="巴拉巴拉巴拉巴拉..."></path></svg>'
let copy = $('<i title="copy" class="code_copy">' + iconSvg + '</i>');
$(this).append(copy)
```
## 参考网址链接
组件注册
```
https://cn.vuejs.org/guide/components/registration
```
图标库
```
https://element-plus.org/zh-CN/component/icon
```
3
666
1115
2026-01-24
-
frp内网穿透
# 内网穿透frp技术部署
## 一、理解FRP
### 什么是内网穿透?
FRP 是 Fast Reverse Proxy(快速反向代理)的缩写,是一个高性能的反向代理应用,主要用于实现内网穿透。
### FRP 的工作原理
FRP 采用 客户端-服务端 (Client-Server) 模型,由两部分组成:
- frps (Server): 部署在拥有公网 IP 的云服务器上(比如阿里云、腾讯云、AWS 等 VPS)。它负责在公网“占位”,接收来自外部的连接。
- frpc (Client): 部署在你想要暴露的内网机器上(比如你的树莓派、家用电脑、NAS)。它会主动向 frps 发起连接,保持一条加密的通道。
流程:
外部用户访问云服务器 (frps) -> frps 通过隧道将流量转发给内网机器 (frpc) -> 内网机器处理请求并原路返回数据。

## 二、文件结构分析
首先是frp官网地址:[点击跳转](https://gofrp.org/zh-cn/)
```url
https://gofrp.org/zh-cn/
```
### 1.服务端frps.toml文件
**服务端**的核心配置文件,文件中定义了 bindPort(默认 7000)。服务端启动后,会占用服务器的这个端口,持续监听来自客户端(frpc)的连接请求。这是构建隧道的“地基”。
```frps.toml
bindPort = 7000
# 身份验证 (必须与 frps.toml 一致)
auth.method = "token"
auth.token = "这里填一个复杂的密码123456"
```
### 2.客户端frpc.toml文件
frpc主要做的事情为,向服务器地址发起连接请求,提交认证,认证通过后建立长连接,然后注册服务例如把本地的22端口映射到服务器的8000端口.
如果客户端有多个端口需要映射,只需要增加一个 `` 就可以了
```frpc.toml
serverAddr = "8.8.8.001"
serverPort = 7000
# 身份验证 (必须与 frps.toml 一致)
auth.method = "token"
auth.token = "这里填那个复杂的密码123456"
name = "testhsm-wshsmtcp"
type = "tcp"
localIP = "127.0.0.1" 需要更改
localPort = 22
remotePort = 8000
```
- serverAddr:服务器的地址
- serverPort:frp的管理端口,用来维持连接
- localIP:一般是本机回环地址(如果frpc不在本机的话,这个地址需要更改)
- localPort:这是客户端上 SSH 服务实际监听的端口。
- remotePort:数据的入口,也是访问时对外开放的大门
## 三、部署
### 1.服务端
用tmux启用后台会话
```bash
tmux new -s frps
# 在tmux窗口运行服务端程序
./frps -c ./frps.toml
```
将会话切到后台:`Ctrl + b` + `d`
### 2.客户端
客户端如果不需要长期运行可以直接和服务端一样一行命令启动,如果需要自启动配置的话可以看下面。
#### 自启动配置
如果需要在后台长期运行,建议结合其他工具,如 `systemd`。
##### 1.配置systemd开机自启服务
创建文件:
```bash
sudo vim /etc/systemd/system/frpc.service
```
在文件中添加以下内容:
```bash
[Unit]
Description=Frp Client
After=network.target
[Service]
User=orangepi
ExecStart=/home/orangepi/.frp/frpc -c /home/orangepi/.frp/frpc.toml
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
```
##### 2.启动运行
1.刷新配置
```bash
sudo systemctl daemon-reload
```
2.开启开机自启
```bash
sudo systemctl enable frpc
```
3.立即测试启动
```bash
sudo systemctl start frpc
```
4.重启测试
```bash
sudo reboot
```
## 四、补充问题解决
如果遇到tmux没有启动,可以尝试产看日志,看服务是否报错
```bash
sudo systemctl status frpc
```
9
666
1870
2026-01-26
-
django 局部钩子和全局钩子
# django 局部钩子和全局钩子
钩子(hook)的概念在编程界非常普遍,钩子的含义就是,你不需要手动调用,当系统运行到某个地方时,会自动帮你“钩起”这段代码。
Django 固定的钩子用法为,在自定义的Form类中写 `clean_字段名`、 `clean` 以用来对特定的字段进行校验。以 clean (干净) 命名代表清晰数据的含义
## 局部钩子
在Fom类中定义 `clean_字段名()` 方法,就能够实现对特定字段进行校验。(校验函数正常必须返回当前字段值)
局部钩子处理文章简介的字段, 例如:
```
# 局部钩子,name不能重复
def clean_name(self):
name = self.cleaned_data.get('name')
user_query = UserInfo.objects.filter(username=name)
if user_query:
self.add_error('name', "该用户已注册")
return self.cleaned_data
```
## 全局钩子
局部钩子只能“自扫门前雪”,它看不见别的字段。有些场景你需要校验两个字段是否相等时就没有办法使用,比如以下场景必须动用全局钩子:
密码一致性校验:你需要同时对比 password 和 re_password
```
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd != re_pwd:
self.add_error('re_pwd', "两次密码不一致")
return self.cleaned_data
```
## 参考网址
```url
https://www.cnblogs.com/open-yang/p/11223175.html
```
6
666
0
2026-01-26
-
部署django项目
# 部署django项目
将 django 项目从windows迁移并部署到linux,本项目核心基于 django + vue3 + mysql搭建
本项目部署主要分为四步:1.传代码,2.配置环境3.传数据库4.配置并运行项目
此外在数据库迁移时出现了问题,因此还涉及 linux 的 python 源码编译安装,以及 mysql 的安装过程
项目目录:
<img src="/media/uploads/articles_image/202601/20260127_025104_image.png" height="500" alt="项目目录">
## 一、传代码
这一部分摘要:这一部分主要是通过 `requirements.txt` 提前备份版本,通过 git 将文件传到 linux 上
### 1.requirements.txt备份
首先在本地项目里生成一个requirements.txt文件,用来备份虚拟环境中用到的 python 库的版本:
```shell
pip freeze > requirements.txt
```
文件结构大概这样:
```Plaintext
asgiref==3.11.0 <-- 库名 == 版本号
cssselect==1.3.0
Django==6.0
...
```
### 2.把代码推送到 Gitee 或 GitHub
#### 1.1 创建.gitignore文件
不需要上传
venv 文件夹(虚拟环境)和 __pycache__ 文件夹
db.sqlite3: 数据
media: 用户上传文件目录
```Plaintext
venv/
__pycache__/
*.pyc
db.sqlite3
media/
.DS_Store
.vscode/
```
#### 1.2 上传
- 创建github仓库
- 在本地项目文件夹:
```bash
git init
git add .
git commit -m "首次部署"
git branch -M main
git remote add origin <你的仓库地址>
git push -u origin master
```
### 2 克隆代码
```bash
cd ~
git clone https://github.com/LuminovaBeta/my_blog_v1.git my_blog
```
如果github连接慢,直接告诉 Git 使用代理,防止以后直连出问题,克隆完成后,取消代理
```Bash
cd ~
git config --global http.proxy http://192.168.1.101:7890
git config --global https.proxy http://192.168.1.101:7890
git clone https://github.com/LuminovaBeta/my_blog_v1.git my_blog
git config --global --unset http.proxy
git config --global --unset https.proxy
```
## 二、配置虚拟环境和系统依赖
首先由于虚拟环境必须前提是电脑自己带的环境,因此需要装以下根项目的版本比较接近的python版本,如果版本差距比较大,建议装一下版本差不多的例如我的项目是`Python 3.12.4`,但是我的系统是 `Python 3.8.1`
这个时候就需要在保留系统自带 Python 3.8 的同时,安装你指定的 Python 3.12.4,因此需要使用 源码编译安装 (Source Compilation) 并配合 altinstall 命令。
源码构建官网教程地址
```url
https://devguide.python.org/getting-started/setup-building/#unix
```
1. 安装编译依赖
Python 编译需要很多底层库的支持(比如 SSL 加密、SQLite 数据库、解压支持等)。如果这一步缺了东西,装出来的 Python 会出现“缺胳膊少腿”的情况(比如 pip 用不了,或者连不上 HTTPS)。
```bash
sudo apt update
sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev liblzma-dev tk-dev uuid-dev libmysqlclient-dev
```
2. 下载Python源码
```bash
cd ~
wget https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz
tar -xvf Python-3.12.4.tgz
cd Python-3.12.4
```
3. 配置与编译
配置环境(开启优化):
```bash
./configure --enable-optimizations --with-lto
```
编译
```bash
make -j4
```
安装必须使用 altinstall,绝对不要用 install
```bash
sudo make altinstall
```
验证安装
```bash
python3 --version
# 输出应该是原版: Python 3.8.10
python3.12 --version
# 输出应该是: Python 3.12.4
```
4. 为你的项目创建**虚拟**环境
首先确保没有旧的虚拟环境
创建新的环境:
```bash
/usr/local/bin/python3.12 -m venv venv
```
激活环境:
```bash
source venv/bin/activate
```
5. 进入虚拟环境并安装依赖
根据 `requirements.txt` 文件安装依赖
```bash
sudo apt update
pip install -r requirements.txt
```

## 三、传数据库
由于本项目并没有用django默认的db.sqlite3,用的是MySQL
本次迁移windows上用的是 MySQL 8.0 香橙派上用的版本是 MariaDB 然后进行数据库传输
MySQL 是一个服务,不能直接把 Windows 里的文件夹复制到香橙派。你必须在香橙派上重新搭建一套一样的数据库环境,然后把数据导入进去。
### 1. 在香橙派上安装 MySQL 服务
#### 1.1 卸载旧的 MariaDB
检查版本:
```bash
mysql --version
```
这里我的输出是:(版本不合适)
```bash
mysql Ver 15.1 Distrib 10.3.39-MariaDB, for debian-linux-gnu (aarch64) using readline 5.2
```
如果当前有比较老的版本,比如 `10.3.39-MariaDB` 的话建议先卸载
```bash
# 停止服务
sudo systemctl stop mariadb
# 卸载软件
sudo apt purge mariadb-server mariadb-client mariadb-common -y
sudo apt autoremove -y
# 关键:删除旧数据目录(否则新版安装会冲突)
# 注意:这会删除你之前尝试导入的所有数据
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
```
#### 1.1 安装 MySQL 8.0
##### 安装服务和开发库
```bash
cd ~
# 下载配置包
wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb
# 安装配置包
sudo dpkg -i mysql-apt-config_0.8.28-1_all.deb
```
执行后会弹出蓝色菜单,直接选 OK(默认就是 MySQL 8.0)即可。


##### 正式安装
```bash
sudo apt update
sudo apt install mysql-server -y
```
如果刚刚删除过数据库这个时候直接运行安装命令可能会报错`mysqld: Can't read dir of '/etc/mysql/conf.d/'`
这是因为刚刚把整个 `/etc/mysql` 目录删除了,需要先创建 `sudo mkdir -p /etc/mysql/conf.d/`, `sudo mkdir -p /etc/mysql/mysql.conf.d/`
启动并进行安全配置
##### 检查
版本输出:
```bash
orangepi@orangepi5pro:~$ mysql --version
mysql Ver 8.0.42-0ubuntu0.20.04.1 for Linux on aarch64 ((Ubuntu))
```
后台是否启动?
```bash
sudo systemctl status mysql
```
#### 1.2 创建用户和数据库
创建root用户:
```bash
sudo mysql -u root -p
```
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'my_blog', # 数据库的名字
'USER': 'root', # 用户名
'PASSWORD': 'root', # 密码
'HOST': '127.0.0.1',# 地址
'PORT': 3306 # 端口
}
}
```
根据在 `setting.py` 创建一个不需要root权限登录的用户:
```SQL
-- 创建用户: 这里的 'my_blog_user' 和 'password' 对应你 settings.py 里的配置
CREATE USER 'my_blog_user'@'localhost' IDENTIFIED BY 'password';
-- 授予权限
GRANT ALL PRIVILEGES ON my_blog.* TO 'my_blog_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
```
创建数据库:
首先需要先进入数据库
```sql
show databases;
create database my_blog;
```
### 2.数据库迁移
#### 数据库版本兼容问题(弃)
在之前的版本兼容问题参考,可以忽略这一部分
在windows上用的是 MySQL 8.0 而香橙派上用的版本是 MariaDB 之间存在版本兼容性问题,并且如果你的数据库比较老的话,django 建表的命令会报错无法使用
主要是直接生成的 `.sql` 文件里面还包括很多SQL 的语法,这些 SQL 语法差异会导致迁移数据库报错,因此先用django自带的建表命令 `python manage.py migrate` 创建数据结构,再只导出“数据”,不导出“结构”
创建数据结构:
```bash
python manage.py makemigrations
python manage.py migrate
```
##### 问题与解决-加密验证驱动库安装
```bash
python manage.py makemigrations
python manage.py migrate
```
如果使用上面创建数据表的命令,报错:
```bash
# 报错信息
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
```
解决(用清华园比较快):
```bash
pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple
```
#### 2.1 数据库导出
在原服务器上导出(Dump)仅导出数据文件,使用 mysqldump 工具将数据库打包成文件:
```bash
# 2. 使用 -r 确保编码是 UTF-8,避免之前的 \0 乱码报错
mysqldump -u root -p --databases my_blog -r my_blog_full.sql
```
#### 2.2 数据库导入
按照 `settings.py` 中的配置
上面已经在服务器上创建一个数据库,运行:
```bash
# my_blog_db 为真实数据库名称
sudo mysql -u root -p my_blog_db < blog_data_only.sql
sudo mysql -u root -p < /home/orangepi/my_blog_full.sql
```
#### 2.3 数据库检查
查看是否成功创建,运行:`use my_blog;`, `SHOW tables;` 看看输出全不全,可以根原数据库对比

## 四、运行项目
### 终端运行
#### 仅在本机访问
```bash
python manage.py runserver
```
- 默认端口:127.0.0.1:8000。
#### 允许局域网访问
```bash
python manage.py runserver 0.0.0.0:8000
```
- 0.0.0.0:告诉 Django 监听香橙派所有的网络接口。
- :8000:手动指定端口号。如果你想用别的端口(比如 8080),直接修改这个数字即可。
这个时候你可以尝试访问,但如果没有配置django项目应该会报错
##### 允许ip访问
打开 settings.py
找到 `ALLOWED_HOSTS` 这一行
原来的内容:
```python
ALLOWED_HOSTS = []
```
修改后的内容:
```python
ALLOWED_HOSTS = ['*']
```
### 服务运行
```bash
sudo vim /etc/systemd/system/my_blog.service
```
复制下面的内容进去
```
[Unit]
Description=Django My Blog Service
After=network.target mysql.service
[Service]
# 你的香橙派用户名
User=orangepi
# 项目根目录路径
WorkingDirectory=/home/orangepi/my_blog
# 使用虚拟环境里的 python 运行项目
ExecStart=/home/orangepi/my_blog/venv/bin/python /home/orangepi/my_blog/manage.py runserver 0.0.0.0:8000
# 崩溃后 5 秒自动重启
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
启动服务:
```bash
# 1. 重新加载系统配置,让它识别新写的服务
sudo systemctl daemon-reload
# 2. 启动博客服务
sudo systemctl start my_blog
# 3. 设置开机自启
sudo systemctl enable my_blog
# 4. 查看运行状态
sudo systemctl status my_blog
```
重启服务 `sudo systemctl daemon-reload`,`sudo systemctl restart my_blog`
## 五、用户 media 目录迁移
可以直接用命令 `scp` 完整的传过去
35
666
6324
2026-01-27