feat: 重构前端项目结构并优化代码

refactor: 迁移前端资源文件至web目录
feat: 新增多种图标资源
style: 统一代码风格和格式化配置
docs: 更新README和文档说明
chore: 更新依赖和配置文件
fix: 修复部分类型定义和枚举
perf: 优化路由和组件加载逻辑
This commit is contained in:
zhangtao
2026-05-01 01:01:17 +08:00
parent 1355a09441
commit 80263e98e1
887 changed files with 116349 additions and 33825 deletions
+23
View File
@@ -0,0 +1,23 @@
# 数据库配置
MYSQL_ROOT_PASSWORD=fastapiadmin_root
MYSQL_DATABASE=fastapiadmin
MYSQL_USER=fastapiadmin
MYSQL_PASSWORD=fastapiadmin123
MYSQL_PORT=3306
# Redis配置
REDIS_PASSWORD=fastapiadmin_redis
REDIS_PORT=6379
# 后端配置
BACKEND_PORT=8001
# Nginx配置
HTTP_PORT=80
HTTPS_PORT=443
# 项目配置
PROJECT_NAME=FastapiAdmin
# 部署环境
DEPLOY_ENV=prod
+23
View File
@@ -0,0 +1,23 @@
# 数据库配置
MYSQL_ROOT_PASSWORD=your_mysql_root_password
MYSQL_DATABASE=fastapiadmin
MYSQL_USER=fastapiadmin
MYSQL_PASSWORD=your_mysql_password
MYSQL_PORT=3306
# Redis配置
REDIS_PASSWORD=your_redis_password
REDIS_PORT=6379
# 后端配置
BACKEND_PORT=8001
# Nginx配置
HTTP_PORT=80
HTTPS_PORT=443
# 项目配置
PROJECT_NAME=FastapiAdmin
# 部署环境
DEPLOY_ENV=prod
+163
View File
@@ -0,0 +1,163 @@
# FastapiAdmin 部署说明
## 项目结构
```
docker/
├── backend/ # 后端服务配置
│ └── Dockerfile # 后端Dockerfile
├── nginx/ # Nginx配置
│ ├── nginx.conf # Nginx配置文件
│ ├── ssl/ # SSL证书目录
│ ├── web/ # 前端静态文件
│ ├── app/ # 小程序静态文件
│ └── docs/ # 文档静态文件
├── mysql/ # MySQL数据目录
│ └── data/ # MySQL数据持久化目录
├── redis/ # Redis数据目录
│ └── data/ # Redis数据持久化目录
├── docker-compose.yaml # Docker Compose配置文件
├── .env # 环境变量配置文件
├── .env.example # 环境变量示例文件
└── README.md # 部署说明文档
```
## 部署准备
### 系统依赖
- Git
- Docker
- Docker Compose
- Node.js (前端构建需要)
- pnpm (前端构建需要)
### 环境配置
1. **配置环境变量**
复制 `.env.example` 文件为 `.env`,并根据实际情况修改配置:
```bash
cp .env.example .env
```
主要配置项:
- `MYSQL_ROOT_PASSWORD`: MySQL根密码
- `MYSQL_DATABASE`: 数据库名
- `MYSQL_USER`: 数据库用户
- `MYSQL_PASSWORD`: 数据库密码
- `REDIS_PASSWORD`: Redis密码
- `BACKEND_PORT`: 后端服务端口
- `HTTP_PORT`: HTTP端口
- `HTTPS_PORT`: HTTPS端口
2. **SSL证书配置** (可选)
如果需要HTTPS,将SSL证书文件放在 `nginx/ssl/` 目录下:
- `server.key`: 私钥文件
- `server.pem`: 证书文件
## 部署流程
### 1. 执行部署脚本
在项目根目录执行部署脚本:
```bash
./deploy.sh
```
部署脚本会自动执行以下步骤:
1. 加载环境变量
2. 检查系统依赖
3. 停止现有容器
4. 更新代码
5. 构建前端(可选)
6. 构建镜像
7. 启动容器
8. 显示日志
### 2. 命令选项
部署脚本支持以下命令选项:
- `./deploy.sh start` - 启动所有容器
- `./deploy.sh stop` - 停止所有容器
- `./deploy.sh restart` - 重启所有容器
- `./deploy.sh logs` - 查看所有容器日志
- `./deploy.sh help` - 显示帮助信息
## 访问信息
部署完成后,可以通过以下地址访问:
- **官网**: https://域名(或ip:端口)
- **前端**: https://域名(或ip:端口)/web
- **小程序**: https://域名(或ip:端口)/app
- **登录信息**: 账号 admin,密码 123456
## 日志管理
### 查看容器日志
```bash
# 查看所有容器日志
./deploy.sh logs
# 查看实时日志
cd docker
docker compose logs -f [服务名]
# 服务名:backend, nginx, mysql, redis
```
### 清理旧镜像
部署脚本会自动清理72小时前的旧镜像,以节省磁盘空间。
## 常见问题
### 1. 环境变量文件不存在
如果 `.env` 文件不存在,部署脚本会自动从 `.env.example` 创建。
### 2. 前端构建失败
如果服务器资源不足,建议在本地构建前端,然后将 `dist` 目录上传到 `docker/nginx/` 对应目录。
### 3. 容器启动失败
检查容器日志,查看具体错误信息:
```bash
cd docker
docker compose logs [服务名]
```
### 4. 数据库连接失败
确保 `.env` 文件中的数据库配置正确,并且MySQL容器正常运行。
### 5. 端口冲突
如果端口被占用,修改 `.env` 文件中的端口配置。
## 安全建议
1. **修改默认密码**:部署后请修改默认的数据库密码和Redis密码
2. **更新SSL证书**:使用有效的SSL证书,定期更新
3. **限制访问**:配置防火墙,限制不必要的端口访问
4. **定期备份**:定期备份数据库和重要数据
## 版本更新
当项目有新版本时,执行部署脚本即可自动更新:
```bash
./deploy.sh
```
脚本会自动拉取最新代码,构建新镜像,重启容器。
+56
View File
@@ -0,0 +1,56 @@
# 第一阶段:构建依赖
FROM python:3.10-slim as builder
# 设置时区
ENV TZ Asia/Shanghai
# 设置容器内工作目录
WORKDIR /build
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY ./backend/requirements.txt .
# 安装依赖到指定目录
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
--target=/home/deps
# 第二阶段:运行环境
FROM python:3.10-slim
# 使用 LABEL 替代 MAINTAINER
LABEL maintainer="948080782@qq.com"
# 设置时区
ENV TZ Asia/Shanghai
# 创建非root用户
RUN useradd -m -u 1001 fastapiadmin
# 设置容器内工作目录
WORKDIR /home
# 从构建阶段复制依赖
COPY --from=builder /home/deps /home/deps
# 设置PYTHONPATH
ENV PYTHONPATH=/home/deps:$PYTHONPATH
# 复制应用代码
COPY ./backend/ .
# 更改文件权限
RUN chown -R fastapiadmin:fastapiadmin /home
# 切换到非root用户
USER fastapiadmin
# 运行应用
CMD ["python", "main.py", "run", "--env=prod"]
# 暴露端口
EXPOSE 8001
+7
View File
@@ -0,0 +1,7 @@
# 小程序静态文件目录
请将小程序 H5 构建产物放置于此目录。
构建后应包含:
- index.html
- static/ (或其他静态资源)
+7
View File
@@ -0,0 +1,7 @@
# 官网静态文件目录
请将官网构建产物放置于此目录。
构建后应包含:
- index.html
- static/ (或其他静态资源)
+91
View File
@@ -0,0 +1,91 @@
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
########### 每个指令必须有分号结束。#################
worker_processes 1; # 允许生成的进程数,默认为1:
pid /var/run/nginx.pid; # 指定 Nginx 进程运行文件存放地址
error_log /var/log/nginx/error.log;
events {
accept_mutex on; # 设置网络连接序列化,防止惊群现象发生,默认为on
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
use epoll; # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; # 最大连接数,默认为512
}
http {
include mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,默认为text/plain
# 访问服务日志
access_log on;
sendfile on;
keepalive_timeout 75;
# HTTP server块 - 重定向到HTTPS
server {
listen 80;
server_name service.fastapiadmin.com;
return 301 https://$server_name$request_uri;
}
# HTTPS server块
server {
listen 443 ssl http2;
server_name service.fastapiadmin.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/server.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 官网 - 根路径访问官网
location / {
root /usr/share/nginx/html/docs/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# 前端 - /web访问前端
location /web {
alias /usr/share/nginx/html/web/dist;
try_files $uri $uri/ /web/index.html;
}
# 小程序 - /app访问小程序
location /app {
alias /usr/share/nginx/html/app/dist/build/h5;
try_files $uri $uri/ /app/index.html;
}
# 后端代理
location /api/v1 {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
proxy_pass http://backend:8001;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
+27
View File
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAzttQDKbMEkUh3KpmuwnpjvO7PP/x6OzI86kEaCL/LfHrNOu+
leXFrxk7dBcfbLyqpmh7uBZeIUg8qnl4e6oFd7DXdX9bT1tiJJRtngIqUVL/lzoN
5TMVVN6s3Kbuhe1siMkDu59MF1BIDfAQOgNQFRoO3edQtGiOHt2z41fX75npuo7Z
2yXHFDPeBBK3mP0Y60hju2ACYhdI9ZRkbUu5bo/gZbrb4/CZhEZIbU2n1mexg6mc
Vmz2DpIt0ABklT4vx1dcWMBXm8tK8KR3WM7KGYvavOR8dBGPTfcrzZ7DumHPvgZI
XYEmLqf9/fOBNzGic+4x1XXtqrgexWqCRs97JQIDAQABAoIBAALTOWeZDSHj20Ml
h/ZswrtVBH7K1aBYsjGr8KdpcLm/FD5VD+dW9md62a8vJeHjr02gn1hh5H0ap2c7
ErDIyfDiCQV/np0EdFISkuDngzjGx5QRNoUJONhN1K6oyTVGteMl6XBq0wkMCCRW
XdUIjf5iAcejgiq3Q4IUE2V62tCf00T/7CKHGIACDGsgvVIl3QXvFy//tchnOJi1
z7WygRRXmKrvf2hFERwhp7h8qyFGS0RChtVY8W8rT3p0YjATQn75+T9K2LBZsPSW
/cMPIBOsJCxbXQqqSLLKmmzoaeA1rduaSVDVRH15aRJ77kPHqnTAdrgmc7uO1gBi
1vZKRkECgYEA7iFTC6uo02QfECi+Otded2w6OvSw5TjuRqlK8xeP/deQ1TNj2Gtz
y+nywdFeymqNYMU1pBH3zJQFyDTd2N5ztR7XETUVqh2/i3gRcgj7l20fv52YNhsq
p86OigS3lHMYSkzPx+VKkBJyc7JEp28aOFs6xozbX5WJgnu4pwvsQ+ECgYEA3mEy
9sg/+ZXFEw3MY+e34N//fXV4DgRn8ssZAHepC/Te0QPc2a77HQ76B399hYT/Cm6m
cNfZ+0FKig+NE+KdMFZ4khcqnI+nfcwzlOCY3AltHo4SJbOWSW/AH1/SiszPHnWi
/RtEHIgxUO6Vg8odCRTMjI5Tn/SzHTesavanH8UCgYAaZNcvk/dCdvZ6dAmhu/1c
f0J1BmoU/hpq+pi0GQh8ukfzWZ7XfhF3qJafpPU8ulKxRyqK5PLyWfXKGxH716w7
hw+PeLLOCD4S11wXp6c7QX0jX/RfCuPPdbWW1q8CZT9r/NeK8H8zONg2uquhY08k
r/fzyekGzyxOqiftXAT0AQKBgAqHcaFLo/POSpF3YskMLKGiGXe4OyH2xXEyepGS
GNfvFSmyVB+ecFdU4TO/rpLG1EiLKqhHIBQMaFoXGGfrn+OtBHJuVF8rUhPbukl/
RN2OOLNsqKFOWnxJpUAXCmH2Box7p2byhowPSr55PW0LAcrvSCwThRQawuxMOYaq
/Qi9AoGBANuVlK6PGaE9C2F8aOdzV40/c1pugDMGy1UhiVTdf4tNXWUAyFXjpPKO
9BW9iUC0BnYNflJwuejYwzMpu0SQTWpwNTgZ2kvXTq5k+3p+WB6PYuz6otfvZNbG
0AaTXSlFK9XQ5cIoVbUKzZGLX/g38dPYIm5rRnP6O6NH/E4AiAo2
-----END RSA PRIVATE KEY-----
+62
View File
@@ -0,0 +1,62 @@
-----BEGIN CERTIFICATE-----
MIIGJjCCBQ6gAwIBAgIQD74yY155PWDBA/hoM+TguTANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzIwHhcNMjUwODE4MDAwMDAwWhcNMjYwODE3MjM1OTU5WjAj
MSEwHwYDVQQDExhzZXJ2aWNlLmZhc3RhcGlhZG1pbi5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDO21AMpswSRSHcqma7CemO87s8//Ho7MjzqQRo
Iv8t8es0676V5cWvGTt0Fx9svKqmaHu4Fl4hSDyqeXh7qgV3sNd1f1tPW2IklG2e
AipRUv+XOg3lMxVU3qzcpu6F7WyIyQO7n0wXUEgN8BA6A1AVGg7d51C0aI4e3bPj
V9fvmem6jtnbJccUM94EEreY/RjrSGO7YAJiF0j1lGRtS7luj+Blutvj8JmERkht
TafWZ7GDqZxWbPYOki3QAGSVPi/HV1xYwFeby0rwpHdYzsoZi9q85Hx0EY9N9yvN
nsO6Yc++BkhdgSYup/3984E3MaJz7jHVde2quB7FaoJGz3slAgMBAAGjggMJMIID
BTAfBgNVHSMEGDAWgBR435GQX+7erPbFdevVTFVT7yRKtjAdBgNVHQ4EFgQUH6rO
Uuzt5oaI+OKEH1/CTKptVDUwQQYDVR0RBDowOIIYc2VydmljZS5mYXN0YXBpYWRt
aW4uY29tghx3d3cuc2VydmljZS5mYXN0YXBpYWRtaW4uY29tMD4GA1UdIAQ3MDUw
MwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29t
L0NQUzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
Z2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
Y29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFNDQS1HMi5jcnQwDAYDVR0TAQH/
BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHYA1219ENGn9XfCx+lf1wC/
+YLJM1pl4dCzAXMXwMjFaXcAAAGYvZSjUAAABAMARzBFAiEA/PxBgTEUC5gfKL20
ZqrgGdbcySamDtflh3JdxR4JQXUCIEt/ujuodbeG2nrxnfkt+L+h08maf3Qm0TiS
c994RCM+AHYAwjF+V0UZo0XufzjespBB68fCIVoiv3/Vta12mtkOUs0AAAGYvZSj
igAABAMARzBFAiAlz51wosOOTyuxzj6LrdIYuShO0FHTSpWJrF0B/bHHKQIhANkS
QaufbcAKIChv8Jt7zBgPdhGkT+2MlZVERwanjHliAHYAlE5Dh/rswe+B8xkkJqgY
ZQHH0184AgE/cmd9VTcuGdgAAAGYvZSjnQAABAMARzBFAiB+MXarEEExSmxyrTXV
RLt4eDU/wXu2n3xaYQagt8WMHwIhAIneSXcWtQpBc/dyQL3TH/egJDjgMgl8l/F+
F6VOA30RMA0GCSqGSIb3DQEBCwUAA4IBAQAv3uihVpCQL8LmE20ztwrkj2E4YjuG
CCb2eQp0n3KrUTU5Glsi/8leDTSLFRB5yiPtsE3S1L8AJGgZYMqwXmg/9kGIJJrP
hseJHjfjCntPhiWm9roN1NBeqBPiaJzjg/YqK1t5Uoz350Byyx2UZGkVSjRpy7tz
iy3ZvDfTQhpZxjsWEO6NsKlzu96JgnscYvUkVTyf9guGuqVE4lrWk3/6rw4WhDSc
IPUPFaw296ooa6aITyWzg2CqIuusrHYV2ATgSHzQZeY7vJbIivrXPPKtUYnm7wW4
X7eI4thVlUaRpUEJI1L19LlE4CmFmI/Xiqdk/PeSnYEpF0TaeHLe/Gac
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE
eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv
NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch
QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn
NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP
ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI
lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf
BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ
L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi
98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe
xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN
GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2
n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==
-----END CERTIFICATE-----
+7
View File
@@ -0,0 +1,7 @@
# 前端静态文件目录
请将前端构建产物放置于此目录。
构建后应包含:
- index.html
- static/ (或其他静态资源)