优化更新

This commit is contained in:
2026-09-13 17:33:13 +08:00
parent 8be23a62a3
commit 7f758cc6e9
97 changed files with 2333 additions and 3595 deletions
+2 -2
View File
@@ -18,9 +18,9 @@
| 2.7.0 | 2025-12-08 | 接口限流 + IP 地理位置 + 安全防护 |
| 2.8.0 | 2026-03-22 | Docker 容器化 + Nginx + Supervisor |
| 2.9.0 | 2026-06-15 | 文档体系 + 缓存优化 + 性能提升 |
| **3.0.0** | **2026-09-01** | **Django 6.0 + Python 3.12 + 架构优化** |
| **3.0.0** | **2026-09-10** | **Django 6.0 + Python 3.12 + 架构优化** |
## [3.0.0] - 2026-09-01
## [3.0.0] - 2026-09-10
**Django 6.0 升级,技术栈全面焕新。**
+1 -1
View File
@@ -112,7 +112,7 @@ REDIS_DB=0
DJANGO_FILE_URL=http://file.django.elevue
```
:::danger
:::danger 重要提示
`DATABASE_NAME` 需要提前在 MySQL 中创建对应的数据库:
```sql
CREATE DATABASE `djangoadmin.django.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+80 -74
View File
@@ -8,7 +8,7 @@
## 软件说明
基于 Django、Django ORM、Vue3、TypeScript、Vite、ElementPlus、MySQL 等技术栈构建的企业级前后端分离后台管理系统。
基于 Django、Django ORM、Vue3、TypeScript、Vite、ElementPlus 等技术栈构建的企业级前后端分离后台管理系统,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库。
后端采用 Python 语言,基于 Django Web 框架、Django ORM 数据库操作、Django Form 数据校验等主流技术栈;前端基于 Vue3、TypeScript、Vite 构建,采用 ElementPlus 框架,遵循 Vue 前后端分离主流设计思想。
@@ -21,7 +21,7 @@
+ **分层架构**:Model(数据)→ Form(验证)→ Service(业务)→ View(视图)→ URL(路由),职责清晰
+ **基类复用**:BaseModel 提供 6 个公共字段(id、创建人、时间、软删除),子类只需声明业务字段
+ **模块可插拔**:业务模块位于 `application/`,按 Django App 机制注册,增删不影响核心框架
+ **多数据库支持**:通过 `DATABASE_ENGINE` 环境变量一键切换 MySQL / PostgreSQL / SQLite / Oracle
+ **多数据库支持**:通过 `DATABASE_ENGINE` 环境变量一键切换 MySQL / PostgreSQL / SQLite / Oracle / SQL Server 等数据库
+ **中间件可扩展**:CORS、认证、权限、日志通过 Django 中间件链式处理,按需注册
+ **RBAC 权限**:后端 PermissionRequired + 前端 v-perm 指令双重校验,精确到按钮级
+ **代码生成器**:根据数据库表结构一键生成前后端 CRUD 代码,含列表、表单、API 全套
@@ -42,9 +42,13 @@
+ **通知公告**:主要对通知、公告等站内数据进行管理
+ **行政区划**:针对全国行政区划分数据进行管理和维护
+ **文件模板**:主要对系统中使用的文件模板进行上传和管理
+ **文件上传**:提供统一的文件上传服务,支持图片、文档等多类型文件管理,自动重命名、按日期分目录存储
+ **友情链接**:用于管理外部链接和合作伙伴链接数据,支持分类管理和排序
+ **文章管理**:用于发布和管理文章内容,支持富文本编辑、分类管理和状态管理
+ **任务调度**:主要用于对定时任务进行定义和统一调度管理
+ **代码生成**:根据数据库表结构一键生成前后端 CRUD 代码,含列表、表单、API 全套
+ **分类管理**:用于文章分类、商品分类等树形分类数据的管理
+ **示例模块**:提供代码生成器的示例参考,展示标准 CRUD 模块的实现方式
## 软件出处
@@ -59,82 +63,84 @@
| 版本名称 | 说明 | 地址 |
|:---------|:-----|:-----|
| Django+Layui混编版 | 基于 Django、Jinja2、Layui、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_Layui) |
| Django+EleVue前后端分离版 | 基于 Django、Django ORM、Vue3、ElementPlus、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_EleVue) |
| Django+AntdVue前后端分离版 | 基于 Django、Django ORM、Vue3、AntDesign、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_AntdVue) |
| Django+NaiveVue前后端分离版 | 基于 Django、Django ORM、Vue3、NaiveUI、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_NaiveVue) |
| Flask+Layui混编版 | 基于 Flask、Jinja2、Layui、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_Layui) |
| Flask+EleVue前后端分离版 | 基于 Flask、SQLAlchemy、Pydantic、Vue3、ElementPlus、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_EleVue) |
| Flask+AntdVue前后端分离版 | 基于 Flask、SQLAlchemy、Pydantic、Vue3、AntDesign、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_AntdVue) |
| Flask+NaiveVue前后端分离版 | 基于 Flask、SQLAlchemy、Pydantic、Vue3、NaiveUI、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_NaiveVue) |
| FastAPI+Layui混编版 | 基于 FastAPI、Jinja2、Layui、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_Layui) |
| FastAPI+EleVue前后端分离版 | 基于 FastAPI、SQLAlchemy、Pydantic、Vue3、ElementPlus、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_EleVue) |
| FastAPI+AntdVue前后端分离版 | 基于 FastAPI、SQLAlchemy、Pydantic、Vue3、AntDesign、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_AntdVue) |
| FastAPI+NaiveVue前后端分离版 | 基于 FastAPI、SQLAlchemy、Pydantic、Vue3、NaiveUI、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_NaiveVue) |
| Tornado+Layui混编版 | 基于 Tornado、Jinja2、Layui、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_Layui) |
| Tornado+EleVue前后端分离版 | 基于 Tornado、SQLAlchemy、Pydantic、Vue3、ElementPlus、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_EleVue) |
| Tornado+AntdVue前后端分离版 | 基于 Tornado、SQLAlchemy、Pydantic、Vue3、AntDesign、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_AntdVue) |
| Tornado+NaiveVue前后端分离版 | 基于 Tornado、SQLAlchemy、Pydantic、Vue3、NaiveUI、TypeScript、Vite、MySQL 等技术栈 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_NaiveVue) |
| Django+Layui混编版 | 基于 Django、Jinja2、Layui 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_Layui) |
| Django+ElementPlus前后端分离版 | 基于 Django、Django ORM、Vue3、ElementPlus、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_EleVue) |
| Django+AntDesign前后端分离版 | 基于 Django、Django ORM、Vue3、AntDesign、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_AntdVue) |
| Django+NaiveUI前后端分离版 | 基于 Django、Django ORM、Vue3、NaiveUI、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Django_NaiveVue) |
| Flask+Layui混编版 | 基于 Flask、Jinja2、Layui 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_Layui) |
| Flask+ElementPlus前后端分离版 | 基于 Flask、SQLAlchemy、Pydantic、Vue3、ElementPlus、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_EleVue) |
| Flask+AntDesign前后端分离版 | 基于 Flask、SQLAlchemy、Pydantic、Vue3、AntDesign、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_AntdVue) |
| Flask+NaiveUI前后端分离版 | 基于 Flask、SQLAlchemy、Pydantic、Vue3、NaiveUI、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Flask_NaiveVue) |
| FastAPI+Layui混编版 | 基于 FastAPI、Jinja2、Layui 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_Layui) |
| FastAPI+ElementPlus前后端分离版 | 基于 FastAPI、SQLAlchemy、Pydantic、Vue3、ElementPlus、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_EleVue) |
| FastAPI+AntDesign前后端分离版 | 基于 FastAPI、SQLAlchemy、Pydantic、Vue3、AntDesign、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_AntdVue) |
| FastAPI+NaiveUI前后端分离版 | 基于 FastAPI、SQLAlchemy、Pydantic、Vue3、NaiveUI、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_NaiveVue) |
| Tornado+Layui混编版 | 基于 Tornado、Jinja2、Layui 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_Layui) |
| Tornado+ElementPlus前后端分离版 | 基于 Tornado、SQLAlchemy、Pydantic、Vue3、ElementPlus、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_EleVue) |
| Tornado+AntDesign前后端分离版 | 基于 Tornado、SQLAlchemy、Pydantic、Vue3、AntDesign、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_AntdVue) |
| Tornado+NaiveUI前后端分离版 | 基于 Tornado、SQLAlchemy、Pydantic、Vue3、NaiveUI、TypeScript、Vite 等技术栈,支持 MySQL、PostgreSQL、SQLite、Oracle、SQL Server 等数据库 | [Gitee地址](https://gitee.com/djangoadmin/DjangoAdmin_Tornado_NaiveVue) |
## 模块展示
<table>
<tr>
<td><img src="/demo/1.png"/></td>
<td><img src="/demo/2.png"/></td>
</tr>
<tr>
<td><img src="/demo/3.png"/></td>
<td><img src="/demo/4.png"/></td>
</tr>
<tr>
<td><img src="/demo/5.png"/></td>
<td><img src="/demo/6.png"/></td>
</tr>
<tr>
<td><img src="/demo/7.png"/></td>
<td><img src="/demo/8.png"/></td>
</tr>
<tr>
<td><img src="/demo/9.png"/></td>
<td><img src="/demo/10.png"/></td>
</tr>
<tr>
<td><img src="/demo/11.png"/></td>
<td><img src="/demo/12.png"/></td>
</tr>
<tr>
<td><img src="/demo/13.png"/></td>
<td><img src="/demo/14.png"/></td>
</tr>
<tr>
<td><img src="/demo/15.png"/></td>
<td><img src="/demo/16.png"/></td>
</tr>
<tr>
<td><img src="/demo/17.png"/></td>
<td><img src="/demo/18.png"/></td>
</tr>
<tr>
<td><img src="/demo/19.png"/></td>
<td><img src="/demo/20.png"/></td>
</tr>
<tr>
<td><img src="/demo/21.png"/></td>
<td><img src="/demo/22.png"/></td>
</tr>
<tr>
<td><img src="/demo/23.png"/></td>
<td><img src="/demo/24.png"/></td>
</tr>
<tr>
<td><img src="/demo/25.png"/></td>
<td><img src="/demo/26.png"/></td>
</tr>
<tr>
<td><img src="/demo/27.png"/></td>
<td><img src="/demo/28.png"/></td>
</tr>
<tbody>
<tr>
<td><img src="/demo/1.png"/></td>
<td><img src="/demo/2.png"/></td>
</tr>
<tr>
<td><img src="/demo/3.png"/></td>
<td><img src="/demo/4.png"/></td>
</tr>
<tr>
<td><img src="/demo/5.png"/></td>
<td><img src="/demo/6.png"/></td>
</tr>
<tr>
<td><img src="/demo/7.png"/></td>
<td><img src="/demo/8.png"/></td>
</tr>
<tr>
<td><img src="/demo/9.png"/></td>
<td><img src="/demo/10.png"/></td>
</tr>
<tr>
<td><img src="/demo/11.png"/></td>
<td><img src="/demo/12.png"/></td>
</tr>
<tr>
<td><img src="/demo/13.png"/></td>
<td><img src="/demo/14.png"/></td>
</tr>
<tr>
<td><img src="/demo/15.png"/></td>
<td><img src="/demo/16.png"/></td>
</tr>
<tr>
<td><img src="/demo/17.png"/></td>
<td><img src="/demo/18.png"/></td>
</tr>
<tr>
<td><img src="/demo/19.png"/></td>
<td><img src="/demo/20.png"/></td>
</tr>
<tr>
<td><img src="/demo/21.png"/></td>
<td><img src="/demo/22.png"/></td>
</tr>
<tr>
<td><img src="/demo/23.png"/></td>
<td><img src="/demo/24.png"/></td>
</tr>
<tr>
<td><img src="/demo/25.png"/></td>
<td><img src="/demo/26.png"/></td>
</tr>
<tr>
<td><img src="/demo/27.png"/></td>
<td><img src="/demo/28.png"/></td>
</tr>
</tbody>
</table>
## 开源协议
-1
View File
@@ -3,7 +3,6 @@
## 整体结构
```
DjangoAdmin_Django_EleVue/
├── application/ # Django 应用目录(所有业务模块)
│ ├── example/ # 示例模块(标准 CRUD 模板,可作为开发参考)
│ │ ├── models.py # 数据模型
@@ -204,14 +204,7 @@ python manage.py migrate
`makemigrations` 会根据 `models.py` 中的模型定义自动生成迁移文件,`migrate` 会执行迁移文件创建或修改数据表结构。更多数据库相关内容请参见 [数据库初始化](/zh/volume1/database) 章节。
:::
### 第三步:回填数据库字段注释(可选)
```bash
# 为数据库表和字段添加中文注释
python manage.py add_full_comments
```
### 第四步:导入初始数据
### 第三步:导入初始数据
数据库初始数据(管理员账号、默认角色、菜单权限等)通过 SQL 脚本导入。脚本位于项目对应目录中:
@@ -54,7 +54,7 @@ DATABASE_PREFIX="django_" # 数据表前缀
| MySQL | `django.db.backends.mysql` | 3306 | mysqlclient |
| PostgreSQL | `django.db.backends.postgresql` | 5432 | psycopg2-binary |
| SQLite | `django.db.backends.sqlite3` | - | 内置 |
| Oracle | `django.db.backends.oracle` | 1521 | cx-Oracle |
| Oracle | `django.db.backends.oracle` | 1521 | oracledb |
| SQL Server | `mssql` | 1433 | mssql-django |
切换数据库引擎后,需安装对应的 Python 驱动包。例如切换到 PostgreSQL:
@@ -122,20 +122,7 @@ mysql -uroot -p djangoadmin.django.elevue < document/mysql/djangoadmin.django.el
| 系统配置 | 系统默认配置项 |
:::
## 第五步:回填数据库字段注释(可选)
项目提供了自定义管理命令,用于为数据库表和字段添加中文注释:
```bash
# 为所有数据表添加字段注释
python manage.py add_full_comments
```
:::tip 温馨提示
此命令会读取 Django 模型中的 `verbose_name` 和 `help_text` 属性,将其写入数据库的字段注释中,便于使用 Navicat 等工具查看表结构时理解每个字段的含义。
:::
## 第六步:验证
## 第五步:验证
启动后端服务,验证数据库连接是否正常:
@@ -271,7 +258,6 @@ cp db_backup.sqlite3 db.sqlite3
2. 配置 .env:设置 DATABASE_ENGINE、DATABASE_NAME 等连接信息
3. 执行迁移:python manage.py makemigrations && python manage.py migrate
4. 导入初始数据:mysql ... < document/mysql/djangoadmin.django.elevue.sql
5. 回填注释(可选):python manage.py add_full_comments
```
后续的模型变更通过 Django 迁移系统管理(`makemigrations` + `migrate`),确保数据库结构与代码保持同步。如需使用代码生成器创建新模块,生成器会自动处理数据库迁移。
@@ -146,7 +146,7 @@ DJANGO_NAME=Django+EleVue旗舰版
DJANGO_VERSION=v3.0.0
DJANGO_DEBUG=True
DJANGO_DEMO=False # 代码默认True(演示模式),开发环境设为False以启用写操作
DJANGO_UPLOAD_DIR="E:\DjangoAdmin_V3\DjangoAdmin_Django_EleVue\public\uploads"
DJANGO_UPLOAD_DIR="E:\DjangoAdmin_Django_EleVue\public\uploads"
DJANGO_FILE_URL='http://file.django.elevue'
# ============================================================
@@ -2,7 +2,7 @@
本章节介绍在本地搭建项目所需的基础环境和软件安装。项目采用 `Python` + `Django` 后端、`Vue3` + `ElementPlus` 前端的分离架构,本地开发需准备以下软件。
安装软件:`Python(3.12+)`、`MySQL(8.0+)`、`Redis(6.0+)`、`Node.js(18+)`、`pnpm` 等。
安装软件:`Python(3.12+)`、`MySQL(8.0+)`(或其他支持的数据库)、`Redis(6.0+)`、`Node.js(18+)`、`pnpm` 等。
:::tip 温馨提示
1. 部分软件安装后需要设置本地环境变量,便于在终端中使用命令。
+1 -1
View File
@@ -378,7 +378,7 @@ python manage.py shell
```bash
# .env 中的上传配置
DJANGO_UPLOAD_DIR="E:\DjangoAdmin_V3\DjangoAdmin_Django_EleVue\public\uploads"
DJANGO_UPLOAD_DIR="E:\DjangoAdmin_Django_EleVue\public\uploads"
DJANGO_FILE_URL='http://file.django.elevue'
```
+58 -1
View File
@@ -16,15 +16,32 @@ from django import forms
from application.example import models
# =============================================================
# 案例表单验证类
# =============================================================
class ExampleForm(forms.ModelForm):
"""
案例表单验证类
用于创建和更新案例信息时的表单验证。
验证字段包括:name, avatar, type, status, sort
包含案例名称, 案例图片, 案例类型等属性
验证字段包括:
- name: 案例名称
- avatar: 案例图片
- type: 案例类型
- status: 案例状态(1-正常, 2-禁用)
- sort: 排序
"""
# ----------------------------------------------------------
# 案例名称
# ----------------------------------------------------------
# 字段说明: 案例的名称
# 字段类型: 字符串(CharField)
# 验证规则: 必填(required=True),最大长度100字符
# 业务说明: 案例的核心标识字段,用于列表展示和搜索
name = forms.CharField(
required=True,
max_length=100,
@@ -34,7 +51,13 @@ class ExampleForm(forms.ModelForm):
}
)
# ----------------------------------------------------------
# 案例图片
# ----------------------------------------------------------
# 字段说明: 案例的图片
# 字段类型: 字符串(CharField)
# 验证规则: 可选(required=False),最大长度255字符
# 业务说明: 用于案例列表展示和详情页的图片
avatar = forms.CharField(
required=False,
max_length=255,
@@ -43,7 +66,13 @@ class ExampleForm(forms.ModelForm):
}
)
# ----------------------------------------------------------
# 案例类型
# ----------------------------------------------------------
# 字段说明: 案例的分类类型
# 字段类型: 整数(IntegerField)
# 验证规则: 必填(required=True),取值范围1-4
# 业务说明: 对案例进行分类管理,支持按类型筛选
type = forms.IntegerField(
required=True,
min_value=1,
@@ -55,7 +84,13 @@ class ExampleForm(forms.ModelForm):
}
)
# ----------------------------------------------------------
# 案例状态
# ----------------------------------------------------------
# 字段说明: 案例的显示状态
# 字段类型: 整数(IntegerField)
# 验证规则: 必填(required=True),取值范围1-2
# 业务说明: 1-正常, 2-禁用,控制案例是否在前端展示
status = forms.IntegerField(
required=True,
min_value=1,
@@ -67,7 +102,14 @@ class ExampleForm(forms.ModelForm):
}
)
# ----------------------------------------------------------
# 排序
# ----------------------------------------------------------
# 字段说明: 案例的排序权重
# 字段类型: 整数(IntegerField)
# 验证规则: 必填(required=True)
# 排序规则: 数值越小越靠前
# 业务说明: 手动控制案例在列表中的显示顺序
sort = forms.IntegerField(
required=True,
error_messages={
@@ -75,8 +117,23 @@ class ExampleForm(forms.ModelForm):
}
)
# =============================================================
# 表单元数据配置
# =============================================================
class Meta:
"""
表单元数据配置类
定义表单绑定的模型和需要验证的字段。
"""
# 绑定模型
# 指定该表单对应的数据模型为 Example(案例)
model = models.Example
# 指定需要验证的字段
# 只验证以下字段,其他字段不进行表单验证
fields = [
'name',
'avatar',
+89 -7
View File
@@ -17,6 +17,10 @@ from application.models import BaseModel
from utils.common import get_table_name
# =============================================================
# 案例模型类
# =============================================================
class Example(BaseModel):
"""
案例模型类
@@ -29,29 +33,53 @@ class Example(BaseModel):
- create_time: 创建时间
- update_user: 更新人
- update_time: 更新时间
主要业务字段:
- name: 案例名称
- avatar: 案例图片
- type: 案例类型
- status: 案例状态(1-正常, 2-禁用)
- sort: 排序权重(数值越小越靠前)
"""
# ----------------------------------------------------------
# 案例名称
# ----------------------------------------------------------
# 字段说明: 案例的名称
# 字段类型: 字符串(CharField)
# 约束: 非空(null=False),最大长度100字符
# 索引: 添加了数据库索引(db_index=True)以提升查询效率
# 作用: 案例的核心标识字段,用于列表展示和搜索
name = models.CharField(
null=False,
max_length=100,
db_index=True,
verbose_name="案例名称",
help_text="案例名称",
db_comment='案例名称'
db_comment='案例名称' # 数据库字段注释
)
# ----------------------------------------------------------
# 案例图片
# ----------------------------------------------------------
# 字段说明: 案例的图片
# 字段类型: 字符串(CharField)
# 约束: 允许为空(null=True, blank=True),最大长度255字符
# 存储: 存储的是相对路径,通过 get_file_url() 生成完整访问URL
# 作用: 用于案例列表展示和详情页的图片
avatar = models.CharField(
null=True,
blank=True,
max_length=255,
verbose_name="案例图片",
help_text="案例图片",
db_comment='案例图片'
db_comment='案例图片' # 数据库字段注释
)
# ----------------------------------------------------------
# 案例类型
# ----------------------------------------------------------
# 类型常量定义
TYPE_CHOICES = (
(1, "类型1"),
(2, "类型2"),
@@ -59,44 +87,98 @@ class Example(BaseModel):
(4, "类型4"),
)
# 字段说明: 案例的分类类型
# 字段类型: 整数(IntegerField)
# 约束: 非空(null=False)
# 选择项: 使用 TYPE_CHOICES 限制可选值
# 作用: 对案例进行分类管理,支持按类型筛选
type = models.IntegerField(
null=False,
choices=TYPE_CHOICES,
verbose_name="案例类型:1-类型1 2-类型2 3-类型3 4-类型4",
help_text="案例类型:1-类型1 2-类型2 3-类型3 4-类型4",
db_comment='案例类型:1-类型1 2-类型2 3-类型3 4-类型4'
db_comment='案例类型:1-类型1 2-类型2 3-类型3 4-类型4' # 数据库字段注释
)
# ----------------------------------------------------------
# 案例状态
# ----------------------------------------------------------
# 状态常量定义
STATUS_CHOICES = (
(1, "正常"),
(2, "禁用"),
(1, "正常"), # 正常状态:案例正常显示
(2, "禁用"), # 禁用状态:案例不对外展示
)
# 字段说明: 案例的显示状态
# 字段类型: 整数(IntegerField)
# 约束: 非空(null=False)
# 选择项: 使用 STATUS_CHOICES 限制可选值
# 作用: 控制案例是否在前端展示
status = models.IntegerField(
null=False,
choices=STATUS_CHOICES,
verbose_name="案例状态:1-正常 2-禁用",
help_text="案例状态:1-正常 2-禁用",
db_comment='案例状态:1-正常 2-禁用'
db_comment='案例状态:1-正常 2-禁用' # 数据库字段注释
)
# ----------------------------------------------------------
# 排序
# ----------------------------------------------------------
# 字段说明: 案例的排序权重
# 字段类型: 整数(IntegerField)
# 约束: 非空(null=False)
# 排序规则: 数值越小越靠前(升序排列)
# 作用: 手动控制案例在列表中的显示顺序
sort = models.IntegerField(
null=False,
verbose_name="排序",
help_text="排序",
db_comment='排序'
db_comment='排序' # 数据库字段注释
)
# =============================================================
# 模型元数据配置
# =============================================================
class Meta:
"""
模型元数据配置类
定义模型在数据库中的表名、显示名称、默认排序规则等。
"""
# 数据表名
# 使用配置文件中的表前缀 + "example",避免与其他应用表名冲突
db_table = get_table_name('example')
# 表注释(Django 3.2+ 支持)
# 在数据库中生成 COMMENT 语句,便于数据库管理
db_table_comment = "案例表"
# 模型在admin后台显示的友好名称(单数)
verbose_name = "案例表"
# 模型在admin后台显示的友好名称(复数)
verbose_name_plural = verbose_name
# 默认排序规则
# 按照 sort 字段升序排列(数值小的在前),确保显示顺序可控
ordering = ("sort",)
# =============================================================
# 实例方法
# =============================================================
def __str__(self):
"""
模型的字符串表示方法
当需要将模型实例转换为字符串时调用,如admin后台显示、日志输出等。
Returns:
str: 包含案例名称的字符串
"""
return f"案例{self.name}"
```
+61 -1
View File
@@ -17,30 +17,90 @@ application/urls.py # 主路由
from django.urls import path
from application.example import views
"""
案例模块路由配置
=============================================================
URL端点概览:
------------------------------------------------------------------------
| 功能说明 | 请求方法 | URL路径 | 视图类 |
|-----------------|----------|-----------------------------|-------------------------|
| 分页查询 | GET | /example/page | ExamplePageView |
| 列表查询 | GET | /example/list | ExampleListView |
| 详情查询 | GET | /example/detail/<id> | ExampleDetailView |
| 添加案例 | POST | /example/add | ExampleAddView |
| 更新案例 | PUT | /example/update | ExampleUpdateView |
| 删除案例 | DELETE | /example/delete/<ids>| ExampleDeleteView |
| 设置状态 | PUT | /example/status | ExampleStatusView |
| 获取列表 | GET | /example/data | ExampleDataView |
------------------------------------------------------------------------
URL参数说明:
- id: int类型,案例ID(用于查询详情)
- id: str类型,逗号分隔的案例ID字符串(用于批量删除)
使用示例:
1. 分页查询:GET /api/example/page?pageNo=1&pageSize=10
2. 列表查询:GET /api/example/list
3. 详情查询:GET /api/example/detail/5
4. 添加案例:POST /api/example/add
5. 更新案例:PUT /api/example/update
6. 删除案例:DELETE /api/example/delete/1,2,3
7. 设置状态:PUT /api/example/status
8. 获取列表:GET /api/example/data
"""
# 案例模块路由配置
urlpatterns = [
# 查询案例分页列表
# URL: /example/page
# 请求方法: GET
# 功能: 获取案例分页数据,支持按案例名称、案例类型、案例状态等条件筛选
path('page', views.ExamplePageView.as_view()),
# 查询案例数据列表(支持筛选)
# URL: /example/list
# 请求方法: GET
# 功能: 获取所有案例的列表数据,支持按条件筛选,用于下拉选择等前端组件
path('list', views.ExampleListView.as_view()),
# 查询案例详情
# URL: /example/detail/<int:id>
# 请求方法: GET
# URL参数: id - 案例ID(整数类型)
# 功能: 根据ID获取指定案例的详细信息
path('detail/<int:id>', views.ExampleDetailView.as_view()),
# 添加案例
# URL: /example/add
# 请求方法: POST
# 功能: 创建新的案例记录,请求体需包含案例信息(name、avatar、type、status、sort等)
path('add', views.ExampleAddView.as_view()),
# 更新案例
# URL: /example/update
# 请求方法: PUT
# 功能: 更新现有案例信息,请求体需包含案例ID和更新内容
path('update', views.ExampleUpdateView.as_view()),
# 删除案例
# URL: /example/delete/<str:id>
# 请求方法: DELETE
# URL参数: id - 案例ID字符串,支持单个ID或逗号分隔的多个ID(如 "1,2,3")
# 功能: 删除指定案例(逻辑删除,设置is_delete=True)
path('delete/<str:id>', views.ExampleDeleteView.as_view()),
# 设置案例状态
# URL: /example/status
# 请求方法: PUT
# 功能: 更新案例的启用/禁用状态
path('status', views.ExampleStatusView.as_view()),
# 查询案例数据列表
path('list', views.ExampleDataView.as_view()),
# URL: /example/data
# 请求方法: GET
# 功能: 获取所有启用案例的列表数据,用于下拉选择等前端组件
path('data', views.ExampleDataView.as_view()),
]
```
+225 -13
View File
@@ -23,93 +23,305 @@ from application.operation_log.constants import LogType
from application.operation_log.decorators import operation_log
# =============================================================
# 分页查询视图
# =============================================================
@method_decorator(check_login, name="get")
class ExamplePageView(PermissionRequired, View):
"""案例分页数据查询视图"""
"""
案例分页数据查询视图
处理GET请求,返回案例列表的分页数据。
支持按案例名称、案例类型、案例状态等条件筛选。
URL: /example/page
请求方法: GET
权限要求:sys:example:page
"""
# 方法权限标识
permission_required = ("sys:example:page",)
@operation_log(title="案例管理-查询分页列表", log_type=LogType.QUERY)
@operation_log(
title="案例管理-查询分页列表",
log_type=LogType.QUERY
)
def get(self, request):
"""
处理GET请求,返回案例分页数据
Args:
request: HttpRequest对象,包含分页参数和筛选条件
- pageNo: 当前页码
- pageSize: 每页记录数
- name: 案例名称(可选,模糊查询)
- type: 案例类型(可选,精确匹配)
- status: 案例状态(可选,精确匹配)
Returns:
JsonResponse: 包含分页数据的JSON响应
"""
result = services.get_example_page(request)
return result
# =============================================================
# 列表查询视图(不分页)
# =============================================================
@method_decorator(check_login, name='get')
class ExampleListView(View):
"""案例列表获取视图(支持筛选,不分页)"""
"""
案例列表获取视图(支持筛选,不分页)
处理GET请求,返回所有案例的列表数据。
支持按案例名称、案例类型、案例状态等条件筛选。
URL: /example/list
请求方法: GET
权限要求:需要登录
"""
def get(self, request):
"""
处理GET请求,返回案例列表
Args:
request: HttpRequest对象
Returns:
JsonResponse: 包含案例列表的JSON响应
"""
result = services.get_example_list(request)
return R.ok(data=result)
# =============================================================
# 详情查询视图
# =============================================================
@method_decorator(check_login, name="get")
class ExampleDetailView(PermissionRequired, View):
"""案例详情查询视图"""
"""
案例详情查询视图
处理GET请求,根据案例ID返回案例详细信息。
URL: /example/detail/<int:id>
请求方法: GET
权限要求:sys:example:detail
"""
# 方法权限标识
permission_required = ("sys:example:detail",)
@operation_log(title="案例管理-查询记录详情", log_type=LogType.QUERY)
@operation_log(
title="案例管理-查询记录详情",
log_type=LogType.QUERY
)
def get(self, request, id):
"""
处理GET请求,返回案例详情
Args:
request: HttpRequest对象
id: 案例ID(URL参数)
Returns:
JsonResponse: 包含案例详情的JSON响应
"""
data = services.get_example_detail(id)
return R.ok(data=data)
# =============================================================
# 添加视图
# =============================================================
@method_decorator(check_login, name="post")
class ExampleAddView(PermissionRequired, View):
"""添加案例视图"""
"""
添加案例视图
处理POST请求,创建新的案例记录。
请求体需包含案例信息(name、avatar、type、status、sort等)。
URL: /example/add
请求方法: POST
权限要求:sys:example:add
"""
# 方法权限标识
permission_required = ("sys:example:add",)
@operation_log(title="案例管理-添加记录", log_type=LogType.ADD)
@operation_log(
title="案例管理-添加记录",
log_type=LogType.ADD
)
def post(self, request):
"""
处理POST请求,添加案例
Args:
request: HttpRequest对象,请求体包含案例信息
Returns:
JsonResponse: 操作结果的JSON响应
"""
# 演示模式检查
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.add_example(request)
return result
# =============================================================
# 更新视图
# =============================================================
@method_decorator(check_login, name="put")
class ExampleUpdateView(PermissionRequired, View):
"""更新案例视图"""
"""
更新案例视图
处理PUT请求,更新现有案例信息。
请求体需包含案例ID和更新内容。
URL: /example/update
请求方法: PUT
权限要求:sys:example:update
"""
# 方法权限标识
permission_required = ('sys:example:update',)
@operation_log(title="案例管理-更新记录", log_type=LogType.UPDATE)
@operation_log(
title="案例管理-更新记录",
log_type=LogType.UPDATE
)
def put(self, request):
"""
处理PUT请求,更新案例
Args:
request: HttpRequest对象,请求体包含更新信息
Returns:
JsonResponse: 操作结果的JSON响应
"""
# 演示模式检查
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.update_example(request)
return result
# =============================================================
# 删除视图
# =============================================================
@method_decorator(check_login, name="delete")
class ExampleDeleteView(PermissionRequired, View):
"""删除案例视图"""
"""
删除案例视图
处理DELETE请求,删除指定案例(逻辑删除)。
支持批量删除,多个ID用逗号分隔。
URL: /example/delete/<str:id>
请求方法: DELETE
权限要求:sys:example:delete
"""
# 方法权限标识
permission_required = ('sys:example:delete',)
@operation_log(title="案例管理-删除记录", log_type=LogType.DELETE)
@operation_log(
title="案例管理-删除记录",
log_type=LogType.DELETE
)
def delete(self, request, id):
"""
处理DELETE请求,删除案例
Args:
request: HttpRequest对象
id: 案例ID字符串,支持逗号分隔的多个ID(如 "1,2,3")
Returns:
JsonResponse: 操作结果的JSON响应
"""
# 演示模式检查
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.delete_examples(id)
return result
# =============================================================
# 状态更新视图
# =============================================================
@method_decorator(check_login, name="put")
class ExampleStatusView(PermissionRequired, View):
"""设置案例状态视图"""
"""
设置案例状态视图
处理PUT请求,更新案例的启用/禁用状态。
URL: /example/status
请求方法: PUT
权限要求:sys:example:status
"""
# 方法权限标识
permission_required = ('sys:example:status',)
def put(self, request):
"""
处理PUT请求,更新案例状态
Args:
request: HttpRequest对象,请求体包含案例ID和新状态
Returns:
JsonResponse: 操作结果的JSON响应
"""
# 演示模式检查
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
result = services.update_example_status(request)
return result
# =============================================================
# 数据列表视图(下拉选择用)
# =============================================================
@method_decorator(check_login, name='get')
class ExampleDataView(View):
"""案例列表获取视图"""
"""
案例列表获取视图
处理GET请求,返回所有启用案例的列表数据。
用于下拉选择等前端组件。
URL: /example/data
请求方法: GET
权限要求:需要登录
"""
def get(self, request):
"""
处理GET请求,返回案例数据列表
Args:
request: HttpRequest对象
Returns:
JsonResponse: 包含案例列表的JSON响应
"""
result = services.get_example_data()
return R.ok(data=result)
```
@@ -53,65 +53,100 @@ JsonResponse <-- Django HTTP响应
```python
class BaseModel(models.Model):
"""基础模型抽象类"""
"""
基础模型抽象类
==============
功能:提供所有模型的公共字段,如主键、创建人、创建时间等
特点:定义为抽象类,不会在数据库中创建对应的表
用途:被其他业务模型继承,实现字段复用
继承此基类的模型会自动拥有以下6个公共字段:
- id: 自增主键
- create_user: 创建人
- create_time: 创建时间
- update_user: 更新人
- update_time: 更新时间
- is_delete: 逻辑删除标识
注意:公共字段会自动排列在业务字段之后,使数据库表结构更清晰
"""
# ==================== 公共字段定义 ====================
# 主键ID字段
# 自增主键,每个模型的唯一标识符
id = models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name='主键ID',
db_comment='主键ID'
auto_created=True, # 自动创建主键字段
primary_key=True, # 设置为主键
serialize=False, # 不参与序列化(避免在API响应中暴露)
verbose_name='主键ID', # 字段中文名称
db_comment='主键ID' # 数据库字段注释
)
# 创建人字段
# 记录数据由谁创建,通常关联用户表的用户名或ID
# 例如:admin, zhangsan, system
create_user = models.CharField(
null=True,
max_length=50,
default=None,
db_default=None,
verbose_name='创建人',
db_comment='创建人'
null=True, # 数据库允许为NULL
max_length=50, # 最大长度50个字符
default=None, # 默认值为None
db_default=None, # 数据库层默认值
verbose_name='创建人', # 字段中文名称
db_comment='创建人' # 数据库字段注释
)
# 创建时间字段
# 自动记录数据创建的时间戳
# auto_now_add: 仅在创建时自动设置当前时间,后续更新不会改变
create_time = models.DateTimeField(
null=True,
auto_now_add=True,
verbose_name="创建时间",
max_length=11,
db_comment='创建时间'
null=True, # 数据库允许为NULL
auto_now_add=True, # 创建时自动设为当前时间
verbose_name="创建时间", # 字段中文名称
max_length=11, # 时间戳长度
db_comment='创建时间' # 数据库字段注释
)
# 更新人字段
# 记录数据最后由谁更新,通常关联用户表的用户名或ID
# null=True: 允许数据库为NULL(新创建记录时可能没有更新人)
update_user = models.CharField(
null=True,
max_length=50,
default=None,
db_default=None,
verbose_name='更新人',
db_comment='更新人'
null=True, # 数据库允许为NULL
max_length=50, # 最大长度50个字符
default=None, # 默认值为None
db_default=None, # 数据库层默认值
verbose_name='更新人', # 字段中文名称
db_comment='更新人' # 数据库字段注释
)
# 更新时间字段
# 自动记录数据最后更新的时间戳
# auto_now: 每次保存(更新)时自动设为当前时间
update_time = models.DateTimeField(
null=True,
auto_now=True,
verbose_name="更新时间",
max_length=11,
db_comment='更新时间'
null=True, # 数据库允许为NULL
auto_now=True, # 每次保存时自动更新为当前时间
verbose_name="更新时间", # 字段中文名称
max_length=11, # 时间戳长度
db_comment='更新时间' # 数据库字段注释
)
# 逻辑删除标识
# 用于软删除,避免物理删除数据造成的数据丢失
# 0:正常(默认值)| 1:已删除
is_delete = models.BooleanField(
default=0,
db_default=0,
verbose_name="逻辑删除",
db_comment='逻辑删除:0-正常 1-已删除'
default=0, # 默认为0,表示正常
db_default=0, # 数据库层默认值
verbose_name="逻辑删除", # 字段中文名称
db_comment='逻辑删除:0-正常 1-已删除' # 数据库字段注释
)
class Meta:
abstract = True # 抽象模型,不创建数据库表
"""
元数据配置
"""
# 定义为抽象模型类
# abstract = True 表示这个模型是抽象的,不会在数据库中创建对应的表
# 子类模型会继承这些字段,并在各自对应的表中创建这些列
abstract = True
```
### 字段说明
@@ -65,7 +65,7 @@ REDIS_DB = int(os.getenv('REDIS_DB', 0))
|------|--------|------|
| `REDIS_HOST` | `127.0.0.1` | Redis服务器地址 |
| `REDIS_PORT` | `6379` | Redis端口 |
| `REDIS_PASSWORD` | `123456` | Redis密码 |
| `REDIS_PASSWORD` | `123456` | Redis密码(`.env` 中配置,无密码时留空) |
| `REDIS_DB` | `0` | Redis数据库索引(0-15) |
## 4.3 缓存应用场景
@@ -162,7 +162,7 @@ public/templates/
### 4.4.2 模板语法示例
```jinja2
```jinja
{# models.py.tpl #}
from django.db import models
from application.models import BaseModel
@@ -294,7 +294,6 @@ python manage.py runserver # 启动开发服务器
python manage.py makemigrations <app> # 生成迁移文件
python manage.py migrate # 执行迁移
python manage.py createsuperuser # 创建超级用户
python manage.py add_full_comments # 回填数据库字段注释
```
## 4.8 前端扩展
@@ -212,7 +212,7 @@ import(/* webpackChunkName: "editor" */ '@wangeditor/editor');
## Gunicorn Worker 配置
```ini
```bash
# gunicorn.conf.py
import multiprocessing
@@ -106,7 +106,7 @@ Jinja2 模板文件,分为后端模板(7 个)和前端模板(ui/ 6 个 +
## 使用限制
:::warning 使用前提
1. **数据库要求**:代码生成器基于 MySQL 的 `information_schema` 查询表结构,仅支持 MySQL 数据库。
1. **数据库要求**:代码生成器基于 MySQL 的 `information_schema` 查询表结构,仅支持 MySQL 数据库。其他数据库(PostgreSQL、Oracle、SQL Server 等)需手动创建模块。
2. **表结构要求**:不支持复合主键、外键关联等复杂表结构,建议使用单主键(自增 id)的标准业务表。
3. **环境要求**:需确保 Django 环境已初始化、MySQL 和 Redis 服务正常运行。
:::
@@ -162,7 +162,7 @@ public/templates/
修改 `public/templates/models.py.tpl`:
```jinja2
```jinja
{% if f.type == 'CharField' %}
{{ f.name }} = models.CharField(
max_length={{ f.max_length or 255 }},
@@ -177,7 +177,7 @@ public/templates/
修改 `public/templates/services.py.tpl`,在添加方法中添加自定义校验:
```jinja2
```jinja
def add_{{ app_name }}(request):
# ... 原有代码 ...
# 自定义校验:检查名称是否重复
@@ -190,7 +190,7 @@ def add_{{ app_name }}(request):
修改 `public/templates/ui/columns.ts.tpl`:
```jinja2
```jinja
{% for f in list_fields %}
{
label: '{{ f.label }}',
@@ -208,7 +208,7 @@ def add_{{ app_name }}(request):
在 `public/templates/` 下新建 `test.py.tpl`:
```jinja2
```jinja
# tests/test_{{ app_name }}.py
from django.test import TestCase
from application.{{ app_name }}.models import {{ model_class_name }}
@@ -247,7 +247,7 @@ backend_templates = [
## Jinja2 语法速查
```jinja2
```jinja
{# 注释 #}
{# 变量输出 #}
@@ -44,7 +44,7 @@ mysqlbinlog --start-datetime="2026-09-05 00:00:00" \
:::tip binlog 配置
确保 MySQL 配置中启用了 binlog:
```ini
```bash
[mysqld]
server-id = 1
log-bin = mysql-bin
@@ -167,7 +167,7 @@ stages:
### pytest 配置
```ini
```bash
# pytest.ini
[pytest]
DJANGO_SETTINGS_MODULE = application.settings
@@ -7,7 +7,6 @@
:::tip 迁移工具链
- **结构迁移**:Django 内置迁移系统(`makemigrations` + `migrate`)
- **字段注释**:Django 4.1+ 通过 `db_comment` 参数自动添加数据库字段注释
- **自定义命令**:`python manage.py add_full_comments` 回填数据库字段注释
:::
## 全新安装初始化
@@ -99,7 +98,7 @@ python manage.py migrate --fake example
## 字段注释管理
Django 4.1+ 支持通过 `db_comment` 参数为数据库字段添加注释。项目中的模型已自动生成 `db_comment`:
Django 4.1+ 支持通过 `db_comment` 参数为数据库字段添加注释。项目中的模型已自动生成 `db_comment`,在执行 `migrate` 时会自动同步到数据库:
```python
class Example(BaseModel):
@@ -110,16 +109,6 @@ class Example(BaseModel):
)
```
### 回填字段注释
对于已有数据库,可使用自定义命令回填字段注释:
```bash
python manage.py add_full_comments
```
该命令会遍历所有模型,为缺少注释的字段补充 `db_comment`。
## 迁移文件结构
每个应用的迁移文件位于 `application/{app_name}/migrations/` 目录:
@@ -150,7 +139,6 @@ application/example/
| 回滚指定应用 | `python manage.py migrate <app> zero` |
| 查看迁移状态 | `python manage.py showmigrations` |
| 查看迁移 SQL | `python manage.py sqlmigrate <app> <migration>` |
| 回填字段注释 | `python manage.py add_full_comments` |
## 常见问题与排错
@@ -239,7 +239,7 @@ class MasterSlaveRouter:
## Supervisor 多实例配置
```ini
```bash
; /etc/supervisor/conf.d/djangoadmin.conf
[program:djangoadmin-1]
command=/opt/venv/bin/gunicorn application.wsgi:application -c gunicorn.conf.py -b 127.0.0.1:8001
@@ -12,7 +12,7 @@ Supervisor 是一个 Python 编写的进程管理工具,用于在 Linux 服务
## 配置文件示例
```ini
```bash
; Supervisor 进程管理配置
; 将 command / directory 替换为实际路径后复制到 /etc/supervisor/conf.d/
@@ -134,7 +134,7 @@ gunicorn application.wsgi:application \
Supervisor 内置日志轮转功能,通过以下配置控制:
```ini
```bash
; 单个日志文件最大 50MB
stdout_logfile_maxbytes=50MB
; 保留 10 个历史日志文件
@@ -153,7 +153,7 @@ stdout_logfile_backups=10
如需同时管理多个进程(如应用 + Celery Worker):
```ini
```bash
[program:djangoadmin]
command=/path/to/venv/bin/gunicorn application.wsgi:application --bind 127.0.0.1:8000 --workers 4
directory=/data/apps/DjangoAdmin_Django_EleVue