-
+
全部
@@ -110,6 +110,7 @@
设计
= {
],
};
-/**
- * 重置表单数据和验证状态
- */
+// 重置表单数据和校验状态
function resetForm(): void {
formDefinitionFormRef.value?.resetFields();
formDefinitionFormRef.value?.clearValidate();
@@ -364,17 +363,13 @@ function openDialog(): void {
dialogState.visible = true;
}
-/**
- * 关闭表单定义弹窗并清理临时状态
- */
+// 关闭弹窗并重置
function closeDialog(): void {
dialogState.visible = false;
resetForm();
}
-/**
- * 打开新增表单定义弹窗:类型按当前过滤视图预选(仍可修改)
- */
+// 打开新增弹窗(类型按当前过滤视图预选)
function handleCreateClick(): void {
resetForm();
editingStatus.value = null;
@@ -384,9 +379,8 @@ function handleCreateClick(): void {
}
/**
- * 打开编辑表单定义弹窗并回填数据
- *
- * @param row 当前表单行(携带状态,用于判断类型可否修改)
+ * 打开编辑弹窗并回填数据
+ * @param row 当前表单行(携带状态,判断类型可否修改)
*/
async function handleEditClick(row: FormDefinitionItem): Promise {
resetForm();
@@ -397,9 +391,7 @@ async function handleEditClick(row: FormDefinitionItem): Promise {
openDialog();
}
-/**
- * 校验并提交表单定义
- */
+// 校验并提交
async function handleSubmit(): Promise {
const valid = await formDefinitionFormRef.value?.validate().then(
() => true,
@@ -411,7 +403,10 @@ async function handleSubmit(): Promise {
try {
const id = formData.id;
if (id) {
- await FormAPI.update(id, formData);
+ // 仅提交元数据:formData 由回显数据整体赋值,含 formJson/optionsJson,
+ // 整体回写会用打开弹窗时的旧规则覆盖期间设计器保存的新规则
+ const { formKey, formName, category, description } = formData;
+ await FormAPI.update(id, { formKey, formName, category, description });
ElMessage.success("修改成功");
} else {
await FormAPI.create(formData);
@@ -424,9 +419,7 @@ async function handleSubmit(): Promise {
}
}
-/**
- * 发布向导状态("发布"与已发布表单的"入口管理"共用)
- */
+/** 发布向导状态(发布/入口管理共用) */
const publishState = reactive({
visible: false,
formId: "",
@@ -438,8 +431,7 @@ const publishState = reactive({
});
/**
- * 打开发布向导(未发布走发布流程,已发布直达入口配置)
- *
+ * 打开发布向导(已发布表单直达入口配置)
* @param row 当前表单行
*/
function openPublishDialog(row: FormDefinitionItem): void {
@@ -453,16 +445,13 @@ function openPublishDialog(row: FormDefinitionItem): void {
});
}
-/**
- * 发布向导保存成功后刷新列表(表单状态与版本可能已变更)
- */
+// 发布后刷新列表(状态与版本可能已变更)
function handlePublishSuccess(): void {
fetchData();
}
/**
* 跳转到指定表单页面并检查路由是否已注册
- *
* @param name 路由名称(FormDesigner/FormData)
* @param query 路由参数
*/
@@ -482,7 +471,6 @@ function openFormPage(name: string, query: Record): void {
/**
* 跳转到表单数据页
- *
* @param row 当前表单行
*/
function openDataPage(row: FormDefinitionItem): void {
@@ -491,7 +479,6 @@ function openDataPage(row: FormDefinitionItem): void {
/**
* 停用表单(已发出去的访问入口立即失效)
- *
* @param id 表单 ID
*/
async function handleDisable(id: string): Promise {
@@ -512,8 +499,7 @@ async function handleDisable(id: string): Promise {
/**
* 删除单个或批量表单定义
- *
- * @param id 指定时删除单个表单;不指定时删除表格勾选项
+ * @param id 指定时删除单个表单,否则删除勾选项
*/
async function handleDelete(id?: string): Promise {
const formIds = id ?? selectedIds.value.join(",");
@@ -545,7 +531,6 @@ async function handleDelete(id?: string): Promise {
/**
* 跳转到表单设计器页面
- *
* @param row 当前表单行
*/
function openDesigner(row: FormDefinitionItem): void {
diff --git a/src/views/dynamic-form/preview.vue b/src/views/dynamic-form/preview.vue
index cc07e49a..38dc9b96 100644
--- a/src/views/dynamic-form/preview.vue
+++ b/src/views/dynamic-form/preview.vue
@@ -37,10 +37,10 @@ defineOptions({
const route = useRoute();
-/** 表单 ID(设计器"预览"按钮携参进入) */
+/** 表单 ID(设计器"预览"按钮携带) */
const formId = computed(() => String(route.query.id ?? ""));
-/** 页面标题(设计器携带,如【入职信息采集】表单预览) */
+/** 页面标题(设计器携带) */
const title = computed(() => String(route.query.title ?? "表单预览"));
// 走表单定义接口拉草稿规则:render 接口仅返回已发布表单,预览恰恰要覆盖未发布态
@@ -56,12 +56,12 @@ onMounted(async () => {
await load();
});
-/** 预览提交:校验通过即进入成功态,不落库 */
+// 预览不落库,校验通过即进入成功态
function handlePreviewSubmit(): void {
submitted.value = true;
}
-/** 返回设计器继续编辑 */
+// 返回设计器
function handleBack(): void {
router.back();
}
diff --git a/src/views/dynamic-form/render.vue b/src/views/dynamic-form/render.vue
index bcd7abbe..4879da55 100644
--- a/src/views/dynamic-form/render.vue
+++ b/src/views/dynamic-form/render.vue
@@ -36,12 +36,7 @@ defineOptions({
const route = useRoute();
const router = useRouter();
-/**
- * 表单唯一标识
- *
- * 优先取菜单路由参数(meta.params 由后端菜单 params 转换而来,刷新不丢失);
- * query 兜底:侧边栏点击跳转时 LayoutSidebarItem 会将 meta.params 透传为 query
- */
+/** 表单唯一标识(优先菜单路由 meta.params,query 兜底) */
const formKey = computed(() => {
const metaParams = route.meta.params as Record | undefined;
return String(metaParams?.formKey ?? route.query.formKey ?? "");
@@ -63,8 +58,7 @@ onMounted(async () => {
});
/**
- * 提交表单数据(FormRenderer 校验通过后触发)
- *
+ * 提交表单数据(校验通过后触发)
* @param data 表单数据(field -> value 映射)
*/
async function handleSubmit(data: Record): Promise {
@@ -79,14 +73,10 @@ async function handleSubmit(data: Record): Promise {
}
}
-/**
- * 是否有权查看收集数据(复用 form:data:list 数据查询权限)
- *
- * 无权限(匿名分享等)不显示"查看已提交数据"按钮,避免点击后无路由可跳
- */
+/** 是否有权查看收集数据(无权限时不显示"查看已提交数据"按钮) */
const canViewData = computed(() => hasPerm(["form:data:list"]));
-/** 跳转数据列表(带 formKey 定位表单,列表按提交时间倒序,本次提交在首位) */
+// 跳转数据列表(按提交时间倒序,本次提交在首位)
function handleViewData(): void {
router.push({
name: "FormData",
diff --git a/src/views/dynamic-form/share.vue b/src/views/dynamic-form/share.vue
index d25bddaf..518cb477 100644
--- a/src/views/dynamic-form/share.vue
+++ b/src/views/dynamic-form/share.vue
@@ -50,7 +50,7 @@ const formKey = computed(() => String(route.params.formKey ?? ""));
const renderData = ref();
const submitting = ref(false);
-/** 加载失败提示(接口异常时 request 拦截器已弹错误消息,此处只负责兜底文案) */
+/** 加载失败兜底文案(错误消息由拦截器统一弹出) */
const loadError = ref("");
const { rule, option, loading, submitted, load, refill } = useFormRenderer(() =>
@@ -70,8 +70,7 @@ onMounted(async () => {
});
/**
- * 匿名提交表单数据(FormRenderer 校验通过后触发)
- *
+ * 匿名提交表单数据(校验通过后触发)
* @param data 表单数据(field -> value 映射)
*/
async function handleSubmit(data: Record): Promise {
@@ -81,7 +80,7 @@ async function handleSubmit(data: Record): Promise {
await FormAPI.submitPublicFormData(formKey.value, data);
submitted.value = true;
} catch {
- // 提交失败(限流/校验不通过)消息由 request 拦截器统一弹出,无需重复提示;停留填写态可重试
+ // 失败不重复提示(拦截器已弹),停留填写态可重试
} finally {
submitting.value = false;
}
diff --git a/src/views/dynamic-form/utils/form-field.ts b/src/views/dynamic-form/utils/form-field.ts
index 4b0c04b0..6393960a 100644
--- a/src/views/dynamic-form/utils/form-field.ts
+++ b/src/views/dynamic-form/utils/form-field.ts
@@ -1,7 +1,5 @@
/**
- * 表单字段解析
- *
- * @description 从 form-create 规则提取字段元数据、解析提交数据并格式化展示值
+ * 表单字段解析(规则字段提取、提交数据解析与展示格式化)
*/
/** 表单字段元数据 */
@@ -15,12 +13,8 @@ export interface FormFieldMeta {
}
/**
- * 递归提取表单字段元数据
- *
- * 布局容器(row/col)自身无 field,其子节点递归收集;
- * 参数为 JSON 解析产物,结构未经校验,按 unknown 逐层探测
- *
- * @param rules form-create 规则(JSON 解析值)
+ * 递归提取表单字段元数据(布局容器的子节点递归收集)
+ * @param rules form-create 规则(JSON 解析产物,结构未校验)
*/
export function extractFields(rules: unknown): FormFieldMeta[] {
const result: FormFieldMeta[] = [];
@@ -45,11 +39,8 @@ export function extractFields(rules: unknown): FormFieldMeta[] {
}
/**
- * 提取字段选项映射(value -> label)
- *
- * 非对象或缺失 value/label 的脏项跳过
- *
- * @param options 规则里的 options 数组(JSON 解析值)
+ * 提取字段选项映射(value -> label,脏项跳过)
+ * @param options 规则 options 数组
*/
export function extractOptionMap(options: unknown): Map {
const optionMap = new Map();
@@ -66,7 +57,6 @@ export function extractOptionMap(options: unknown): Map {
/**
* 解析提交数据(field -> value 映射,解析失败按空数据兜底)
- *
* @param dataJson 数据 JSON 字符串
*/
export function parseDataJson(dataJson?: string): Record {
@@ -79,9 +69,8 @@ export function parseDataJson(dataJson?: string): Record {
/**
* 格式化单元格展示值(选项翻译、数组拼接、对象序列化、空值占位)
- *
* @param value 字段值
- * @param field 字段元数据(选项类字段 value 翻译为 label,未命中映射时原样展示)
+ * @param field 字段元数据(选项类字段翻译 label,未命中原样展示)
*/
export function formatCellValue(value: unknown, field?: FormFieldMeta): string {
if (value === null || value === undefined || value === "") return "-";