diff --git a/static/view/templates/formDesktop.vue.twig b/static/view/templates/formDesktop.vue.twig
index 1a72a44..94651bf 100644
--- a/static/view/templates/formDesktop.vue.twig
+++ b/static/view/templates/formDesktop.vue.twig
@@ -1,24 +1,162 @@
+{% macro renderProps(props) %}
+{% autoescape false %}
+{% for key, val in props %}
+{% if val is same as(true) %}
+{{- ' ' ~ key -}}
+{% elseif val is same as(false) or val is null %}
+{% elseif val is iterable %}
+{% elseif (val ~ '') matches '/^-?\\d+(\\.\\d+)?$/' %}
+{{- ' :' ~ key ~ '="' ~ val ~ '"' -}}
+{% elseif val is not null and val != "" %}
+{{- ' ' ~ key ~ '="' ~ val ~ '"' -}}
+{% endif %}
+{% endfor %}
+{% endautoescape %}
+{% endmacro %}
+{% macro renderField(field, config, _self) %}
+{% if field.name == 'layout' %}
+
+{% for child in field.children %}
+
+{{ _self.renderField(child, config, _self) -}}
+
+{% endfor %}
+
+{% else %}
+
+{% if field.name in ['text', 'textarea', 'password'] %}
+
+{% elseif field.name == 'number' %}
+
+{% elseif field.name == 'select' %}
+
+{% for item in field.options %}
+
+{% endfor %}
+
+{% elseif field.name == 'cascader' %}
+
+{% elseif field.name == 'radio' %}
+
+{% for item in field.options %}
+{% if field.style == 'button' %}
+
+{% else %}
+
+{% endif %}
+{% endfor %}
+
+{% elseif field.name == 'checkbox' %}
+
+{% for item in field.options %}
+{% if field.style == 'button' %}
+
+{% else %}
+
+{% endif %}
+{% endfor %}
+
+{% elseif field.name == 'switch' %}
+
+{% elseif field.name == 'slider' %}
+
+{% elseif field.name == 'time' %}
+
+{% elseif field.name == 'timerange' %}
+
+{% elseif field.name == 'date' %}
+
+{% elseif field.name == 'daterange' %}
+
+{% elseif field.name == 'rate' %}
+
+{% elseif field.name == 'color' %}
+
+{% elseif field.name == 'upload' %}
+
+{% if field.props.listType == 'text' or field.props.listType == 'picture' %}
+
+
+ {{ field.btnText }}
+
+
+{% else %}
+
+
+
+
+
+{% endif %}
+{% if field.tip %}
+
+
+ {{ field.tip }}
+
+
+{% endif %}
+
+{% elseif field.name == 'button' %}
+
+{% if field.btnText %}
+
+ {{ field.btnText }}
+
+{% endif %}
+
+{% endif %}
+
+{% endif %}
+{% endmacro %}
+{% macro renderFormDefaults(fields) %}
+{% for field in fields %}
+{# 如果是容器,递归 children #}
+{% if field.children is defined and field.children is iterable %}
+{{ _self.renderFormDefaults(field.children) }}
+{% elseif field.field_name is defined %}
+{% set val = field.value is defined ? field.value : null %}
+{{ field.field_name }}: {{ val is null ? 'null' : val }},
+{% endif %}
+{% endfor %}
+{% endmacro %}
+{% macro js_object(rule) %}
+{ {% for k, v in rule %}
+{{ k }}: '{{ v }}'
+{%- if not loop.last %}, {% endif %}
+{% endfor %} }
+{% endmacro %}
+{% macro renderRules(fields) %}
+{% for field in fields %}
+{% if field.children is defined and field.children is iterable %}
+{{- _self.renderRules(field.children) -}}
+{% elseif field.field_name is defined %}
+{% if (field.rules is defined and field.rules|length > 0) or field.required|default(false) == true %}
+{{ field.field_name }}: [
+{# 输出规则数组 #}
+{% if field.required|default(false) == true %}
+{ required: true, message: '该项必填', trigger: 'blur' },
+{% endif %}
+{% if field.rules is defined and field.rules|length > 0 %}
+{% for rule in field.rules %}
+{{ _self.js_object(rule) }}
+{% endfor %}
+{% endif %}],
+{% endif %}
+{% endif %}
+{% endfor %}
+{% endmacro %}
-
+
{% for field in fields %}
-
-{% if field.name == 'text' %}
-
-{% endif %}
-
+{{ _self.renderField(field, config, _self) -}}
{% endfor %}
取 消
保 存
-
+