去年接手公司内部业务流程自动化需求时,我发现业务部门提交的Excel自动化需求中有70%都是重复性表单处理。这些需求本质上都是对数据库的CRUD操作,但每次都需要开发人员手动编写Python脚本。这让我萌生了一个想法:能否打造一个让业务人员自己就能完成这些简单流程的零代码平台?
ZQ-Platform的雏形就这样诞生了。这个用Python+Django构建的平台,核心目标是让非技术人员通过可视化拖拽就能完成:
关键设计原则:用20%的可配置功能覆盖80%的常规业务场景,剩余20%复杂场景仍保留代码扩展入口。
选择Django作为基础框架主要基于以下考量:
mermaid复制graph TD
A[前端] -->|JSON配置| B(Django后端)
B --> C[动态模型]
C --> D[PostgreSQL]
B --> E[任务队列]
E --> F[Celery]
(注:实际实现中移除了mermaid图表,改用文字描述)
前端采用Vue.js + ElementUI组合,主要考虑:
这是平台最核心的技术难点,需要实现:
python复制# 动态创建模型示例
def create_dynamic_model(fields):
attributes = {
'__module__': __name__,
'Meta': type('Meta', (), {'app_label': 'dynamic_models'})
}
for field in fields:
if field['type'] == 'string':
attributes[field['name']] = models.CharField(max_length=255)
elif field['type'] == 'number':
attributes[field['name']] = models.IntegerField()
return type(field['model_name'], (models.Model,), attributes)
关键技术实现点:
json复制// 典型表单配置
{
"formName": "采购申请单",
"fields": [
{
"name": "applicant",
"label": "申请人",
"type": "string",
"required": true,
"permission": {
"read": ["*"],
"write": ["user"]
}
}
]
}
为了解决动态创建应用的路由问题,我们开发了路由注册中间件:
python复制class DynamicAppMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.path.startswith('/dynamic/'):
app_name = request.path.split('/')[2]
return dynamic_views.app_home(request, app_name)
return self.get_response(request)
考虑到动态模型的特殊性,采用以下策略:
sql复制-- 动态创建表示例
CREATE TABLE IF NOT EXISTS {table_name} (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE,
data JSONB NOT NULL
);
模型注册冲突:
迁移文件混乱:
性能瓶颈:
经过压力测试后实施的关键优化:
| 优化点 | 实施前(QPS) | 实施后(QPS) | 提升幅度 |
|---|---|---|---|
| 模型缓存 | 12 | 85 | 608% |
| 查询优化 | 23 | 142 | 517% |
| 模板预编译 | 7 | 41 | 486% |
具体实现代码片段:
python复制# 模型缓存装饰器
def cache_dynamic_model(func):
@functools.wraps(func)
def wrapper(model_name):
cache_key = f'dynamic_model_{model_name}'
model = cache.get(cache_key)
if not model:
model = func(model_name)
cache.set(cache_key, model, timeout=3600)
return model
return wrapper
基于状态机实现简单审批流:
python复制class WorkflowEngine:
STATES = ['draft', 'pending', 'approved', 'rejected']
def __init__(self, transitions):
self.transitions = transitions
def can_transition(self, from_state, to_state):
return to_state in self.transitions.get(from_state, [])
# 示例配置
transitions = {
'draft': ['pending'],
'pending': ['approved', 'rejected']
}
通过插件机制实现扩展:
插件接口定义:
python复制class BasePlugin:
@classmethod
def get_config_schema(cls):
raise NotImplementedError
def execute(self, context):
raise NotImplementedError
采用RBAC模型扩展:
权限校验示例:
python复制def check_permission(user, action, resource):
if user.is_superuser:
return True
role = user.role
permissions = role.permissions.filter(
action=action,
resource_type=resource.__class__.__name__
)
if not permissions.exists():
return False
# 细粒度校验逻辑...
return True
python复制# 字段加密示例
from cryptography.fernet import Fernet
class EncryptedField(models.Field):
def __init__(self, *args, **kwargs):
self.cipher = Fernet(settings.FIELD_ENCRYPTION_KEY)
super().__init__(*args, **kwargs)
def get_prep_value(self, value):
return self.cipher.encrypt(value.encode()).decode()
Docker-compose配置要点:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- redis
- db
environment:
- DJANGO_SETTINGS_MODULE=config.docker
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
关键监控项:
Prometheus配置示例:
yaml复制- job_name: 'zq_platform'
metrics_path: '/metrics'
static_configs:
- targets: ['web:8000']
当前架构已预留扩展接口:
python复制class ExtensionPoint:
@classmethod
def register_hook(cls, hook_name, callback):
cls._hooks.setdefault(hook_name, []).append(callback)
@classmethod
def run_hooks(cls, hook_name, *args, **kwargs):
for hook in cls._hooks.get(hook_name, []):
hook(*args, **kwargs)
这个项目给我的最大启示是:看似简单的零代码平台,背后需要极其严谨的架构设计。特别是在动态模型管理这块,我们前后重构了三次才找到平衡灵活性和性能的最佳方案。对于想尝试类似项目的开发者,我的建议是先从小的垂直场景切入,验证核心机制可行后再扩展通用能力。