• 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) -> 内网机器处理请求并原路返回数据。 ![流程图](/media/uploads/articles_image/202601/20260126_171231_屏幕截图_2026-01-26_165847.png) ## 二、文件结构分析 首先是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 ``` ![安装完成检查](/media/uploads/articles_image/202601/20260127_025201_image-1.png "安装完成") ## 三、传数据库 由于本项目并没有用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)即可。 ![安装mysql](/media/uploads/articles_image/202601/20260127_025258_image-2.png "安装mysql") ![安装mysql](/media/uploads/articles_image/202601/20260127_025319_image-3.png "安装mysql") ##### 正式安装 ```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;` 看看输出全不全,可以根原数据库对比 ![数据库迁移完成](/media/uploads/articles_image/202601/20260127_025348_image-4.png "数据库迁移完成") ## 四、运行项目 ### 终端运行 #### 仅在本机访问 ```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