Metadata-Version: 2.4
Name: django-simpleui-antd
Version: 1.0.1
Summary: simpleui(Django Admin 主题)的 React 19 + Ant Design 6 复刻版 —— 可安装的 Django 管理后台
Author: neekin
License-Expression: MIT
Project-URL: Homepage, https://github.com/neekin/simpleui-antd
Project-URL: Repository, https://github.com/neekin/simpleui-antd
Project-URL: Issues, https://github.com/neekin/simpleui-antd/issues
Classifier: Framework :: Django
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.0
Classifier: Framework :: Django :: 5.1
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: django>=4.2
Requires-Dist: pillow>=9.0

# django-simpleui-antd

[simpleui](https://github.com/newpanjing/simpleui)(Django Admin 主题,原版为 Vue + Element-UI)的
**React 19 + Ant Design 6** 复刻版 —— 可安装的 Django 管理后台。

`pip install` 后 `INSTALLED_APPS` 加一行,React 界面**直接接管 `/admin/`**(与原版 simpleui
使用方式一致,深链也不会回退原生 admin),数据来自你注册到 Django Admin 的模型,
复用其 queryset、权限与 ModelForm 校验。

## 特性

- **接管 /admin/**:与 simpleui 同款集成;可选 `SIMPLEUI_ANTD_FULL_TAKEOVER = False`
  切回「入口接管 + 原生 admin 兜底」模式
- **拖拽式数据大屏**:首页卡片拖拽排序、宽度调整、隐藏恢复,布局按用户持久化;
  ECharts 柱状图 / 占比环形图 / 近 7 日动作趋势
- **全模型管理**:列表(搜索 / 排序 / 分页 / 勾选 / 批量 Action)、新增 / 编辑 / 删除、
  **内联 InlineModelAdmin**(弹窗内子记录增删改)、**文件 / 图片上传**、**多对多多选**
- **Pro 组件字段**(API 形态对齐 simplepro.components.fields):复选框 / 单选 / 切换 / 数字 /
  滑块 / 评分 / 日期 / 日期时间 / 时间 / **穿梭框 TransferField** / **树形下拉 TreeSelectField** /
  **地图取点 MapField** / **视频 VideoField**
- **编辑器**:富文本 RichTextField(内置工具栏)/ Markdown MDTextField
- **登录验证码开关**:后台「系统设置」一键开启/关闭,图片验证码(Pillow 生成),
  会话绑定、一次性,登录接口强制校验
- **主题**:8 套高级感配色(深墨侧栏 + 低饱和强调色),即时切换
- **多标签页栏**、字体大小、全屏、最近动作(Django Admin LogEntry)、登录页分栏大气布局

## 安装

```bash
pip install django-simpleui-antd
```

## 快速开始

```python
# settings.py
INSTALLED_APPS = [
    ...,
    "simpleui_antd",   # 放在你自己的 app 之后即可
]

# urls.py —— React 界面接管 /admin/
urlpatterns = [
    path("admin/", include("simpleui_antd.urls")),   # 必须写在 admin.site.urls 之前
    path("admin/", admin.site.urls),                 # 原生 admin 兜底(可选)
]
```

```bash
python manage.py migrate   # 创建大屏布局 / 站点配置表
python manage.py runserver
```

访问 <http://127.0.0.1:8000/admin/>,用**任意 is_staff 账号**登录即可。

不希望完全接管时,在 settings.py 设置
`SIMPLEUI_ANTD_FULL_TAKEOVER = False`,则仅 `/admin/` 入口为 React 界面,
其余子路径走原生 admin;也可独立挂载
`path("simpleui/", include("simpleui_antd.urls"))` 两者并存。

## Pro 组件字段示例

```python
from django.db import models
from simpleui_antd.components import fields
from simpleui_antd.editor import fields as editor_fields

class Product(models.Model):
    STATUS = (("on", "在售"), ("off", "下架"))
    LABELS = (("hot", "热卖"), ("new", "新品"), ("free", "包邮"))

    labels = fields.CheckboxField(choices=LABELS, max_length=128)  # 复选框组
    status = fields.RadioField(choices=STATUS, default="on")       # 单选框
    rating = fields.RateField("评分")                               # 星级评分
    weight = fields.SliderField("推荐权重")                         # 滑块
    released_on = fields.DateField("上架日期")                      # 日期选择器
    tags = fields.TransferField(Tag, titles=["待选", "已选"])       # 穿梭框(多对多)
    location = fields.MapField("仓库经纬度")                        # 地图取点(Leaflet + OSM,免 Key)
    video = fields.VideoField("宣传视频")                           # 视频播放器
    desc = editor_fields.RichTextField("图文详情")                  # 富文本
    md = editor_fields.MDTextField("说明")                          # Markdown
```

在模型中定义后,管理界面自动渲染对应组件,零配置。

## 登录验证码开关

右上角用户菜单 →「系统设置」→ 打开「登录验证码」→ 保存(持久化到数据库)。
开启后登录页出现图片验证码,登录接口强制校验,验证码会话绑定、一次性。

## 目录结构

```
frontend/                       # Vite + React 19 + AntD 6 前端
└── src/
    ├── api.js                  # 数据源抽象(Django API / 演示数据)
    ├── data.jsx                # 主题与演示数据
    ├── motionShim.js           # iframe / 截图型 webview 动画兜底(可移除)
    └── components/
        ├── AdminView.jsx       # 管理端外壳(侧栏 / 顶栏 / 多标签页栏)
        ├── HomePage.jsx        # 拖拽式数据大屏
        ├── ListPage.jsx        # 通用列表页(meta 驱动)
        ├── EditModal.jsx       # 新增 / 编辑弹窗(含内联)
        ├── InlineEditor.jsx    # 内联子记录编辑器
        ├── LoginView.jsx       # 登录页(分栏大气布局)
        ├── SettingsModal.jsx   # 系统设置(验证码开关)
        ├── ThemeModal.jsx      # 主题切换
        └── widgets.jsx         # Pro 组件渲染器(上传 / 穿梭框 / 地图 / 富文本 …)
django/                         # django-simpleui-antd Python 包
└── simpleui_antd/
    ├── api/                    # 管理接口(菜单 / 元数据 / 列表 / 增删改 / 上传 / 内联 / Action / 大屏)
    ├── components/fields.py    # Pro 组件模型字段
    ├── editor/fields.py        # 富文本 / Markdown 字段
    ├── models.py               # DashboardLayout / SiteConfig
    └── templates, static/      # SPA 入口与构建产物
scripts/sync-dist.sh            # 构建前端并同步到 Python 包
```

## 版本管理

- 版本号:`frontend/package.json` 与 `django/pyproject.toml` 保持一致,遵循 SemVer
- 变更记录:[CHANGELOG.md](./CHANGELOG.md)(Keep a Changelog 格式)
- 提交信息遵循 Conventional Commits(`feat:` / `fix:` / `chore:` …)

发布(需仓库管理员):

1. 同步更新版本号并打 tag:`git tag v1.x.y && git push origin main v1.x.y`
2. GitHub → Actions → **Release** → Run workflow,输入该 tag
3. 工作流:构建前端 → 同步产物 → 构建 wheel/sdist → 创建 GitHub Release →
   **twine 上传 PyPI**(需配置 `PYPI_API_KEY` Secret,未配置时自动跳过)

## 已知边界

- SPA 无前端路由:任何深链都渲染数据大屏(与接管语义一致)
- 内联(inline)子记录支持常用字段类型,暂不支持文件 / 图片与多对多
- 列表搜索基于文本字段 icontains,未复刻 admin 自定义 filter
- 地图为经纬度取点(Leaflet + OpenStreetMap),无 POI 搜索
- 富文本为内置轻量编辑器(非 ueditor);Markdown 保存源文
