优化更新
This commit is contained in:
@@ -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 缓存应用场景
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
## 4.1 项目根目录
|
||||
|
||||
```
|
||||
DjangoAdmin_Django_EleVue/
|
||||
DjangoAdmin_Django_AntdVue/
|
||||
|
|
||||
+-- application/ # Django后端应用主目录
|
||||
+-- middleware/ # 自定义中间件
|
||||
|
||||
@@ -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 前端扩展
|
||||
@@ -310,7 +309,7 @@ VALUES ('案例管理', '/example', 'tool/example/index', 'sys:example:page', 0,
|
||||
|
||||
### 4.8.2 组件扩展
|
||||
|
||||
前端使用 Vue3 + ElementPlus,可通过以下方式扩展:
|
||||
前端使用 Vue3 + Ant Design Vue,可通过以下方式扩展:
|
||||
|
||||
1. **自定义组件**:在 `ui/src/components/` 目录下创建新组件
|
||||
2. **组合式函数**:在 `ui/src/hooks/` 目录下创建自定义 hooks
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
## 4.1 整体架构
|
||||
|
||||
项目采用前后端分离的 B/S 架构,后端基于 Django 6.0.3 提供 RESTful API,前端基于 Vue3 + ElementPlus 构建单页应用。系统通过 Nginx 反向代理统一入口,实现静态资源托管与 API 转发。
|
||||
项目采用前后端分离的 B/S 架构,后端基于 Django 6.0.3 提供 RESTful API,前端基于 Vue3 + Ant Design Vue 构建单页应用。系统通过 Nginx 反向代理统一入口,实现静态资源托管与 API 转发。
|
||||
|
||||
### 架构图
|
||||
|
||||
```
|
||||
浏览器 (Vue3 + ElementPlus)
|
||||
浏览器 (Vue3 + Ant Design Vue)
|
||||
|
|
||||
v
|
||||
Nginx (反向代理)
|
||||
@@ -117,14 +117,14 @@ application/<module>/
|
||||
| 缓存 | Redis | 6.0+ |
|
||||
| 认证 | JWT (PyJWT) | - |
|
||||
| 前端框架 | Vue3 | 3.x |
|
||||
| UI组件库 | ElementPlus | - |
|
||||
| UI组件库 | Ant Design Vue | - |
|
||||
| 构建工具 | Vite | - |
|
||||
| 状态管理 | Pinia | - |
|
||||
|
||||
## 4.7 目录结构
|
||||
|
||||
```
|
||||
DjangoAdmin_Django_EleVue/
|
||||
DjangoAdmin_Django_AntdVue/
|
||||
+-- application/ # Django后端应用
|
||||
| +-- settings.py # 项目配置
|
||||
| +-- urls.py # 主路由
|
||||
|
||||
@@ -192,8 +192,8 @@ const routes = [
|
||||
### 组件按需导入
|
||||
|
||||
```typescript
|
||||
// ElementPlus 按需导入
|
||||
import { ElButton, ElTable, ElForm } from 'element-plus';
|
||||
// Ant Design Vue 按需导入
|
||||
import { Button, Table, Form } from 'ant-design-vue';
|
||||
```
|
||||
|
||||
### 图片懒加载
|
||||
@@ -212,7 +212,7 @@ import(/* webpackChunkName: "editor" */ '@wangeditor/editor');
|
||||
|
||||
## Gunicorn Worker 配置
|
||||
|
||||
```ini
|
||||
```bash
|
||||
# gunicorn.conf.py
|
||||
import multiprocessing
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ def parse_payload(token):
|
||||
- TypeScript 提供类型安全,减少运行时错误
|
||||
- 生态成熟,社区活跃
|
||||
|
||||
### ElementPlus
|
||||
### Ant Design Vue
|
||||
|
||||
**选型理由**:
|
||||
- 基于 Vue3 的企业级 UI 组件库
|
||||
@@ -197,7 +197,7 @@ jinja2
|
||||
{
|
||||
"dependencies": {
|
||||
"vue": "^3.x",
|
||||
"element-plus": "^2.x",
|
||||
"ant-design-vue": "^3.x",
|
||||
"pinia": "^2.x",
|
||||
"vue-router": "^4.x",
|
||||
"axios": "^1.x"
|
||||
|
||||
Reference in New Issue
Block a user