优化更新
This commit is contained in:
@@ -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 升级,技术栈全面焕新。**
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
## 开源协议
|
||||
|
||||
@@ -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. 部分软件安装后需要设置本地环境变量,便于在终端中使用命令。
|
||||
|
||||
@@ -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'
|
||||
```
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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}"
|
||||
```
|
||||
|
||||
|
||||
@@ -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()),
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user