Browse Source

fix:修改灵活模板中多个指标和special输入框时,后面的输入框回显问题。修改数据源管理中枚举类型ID选择器改为输入框

韩洋 3 months ago
parent
commit
356190b724

BIN
src.zip


+ 8 - 15
src/modules/conversation-dialog/format-html-md-switch-for-report.js

@@ -56,26 +56,19 @@ export const formatMdToHtml = (exist_metrics, md) => {
 
   const placeholderText = '请输入特别提示词,以此统一文本结构、规范输出样式';
 
-  // 直接在 markdown 解析前处理特殊标签,使用 HTML 注释作为占位符
-  // 这样 markdown 解析器会保留注释,不会把 (special) 当成链接
-  let specialCounter = 0;
-  const specialInputs = [];
-
-  // 使用 HTML 注释作为占位符,避免被 markdown 解析器处理
+  // 直接在 markdown 解析前将 (special)...(/special) 替换为 input 元素
+  // 使用 DOMParser 确保 HTML 转义正确
   md = md.replace(/\(special\)([\s\S]*?)\(\/special\)/gi, (match, content) => {
-    const inputHtml = `<input type="text" data-special="true" autocomplete="off" value="${content.trim()}" placeholder="${placeholderText}" contenteditable="false" style="background-color: #fff3cd; border: 1px solid #ffeeba; border-radius: 4px; padding: 2px 8px; color: #856404; font-weight: 500; min-width: 360px; display: inline-block; outline: none; font-size: inherit; font-family: inherit; vertical-align: middle; box-sizing: border-box; margin-left:5px;"/>`;
-    specialInputs.push(inputHtml);
-    return `<!--SPECIAL_INPUT_${specialCounter}-->`;
+    // 使用 DOMParser 转义内容,防止 XSS 和 HTML 解析问题
+    const doc = new DOMParser().parseFromString(`<div>${content.trim()}</div>`, 'text/html');
+    const escapedValue = doc.querySelector('div').textContent;
+
+    return `<input type="text" data-special="true" autocomplete="off" value="${escapedValue}" placeholder="${placeholderText}" contenteditable="false" style="background-color: #fff3cd; border: 1px solid #ffeeba; border-radius: 4px; padding: 2px 8px; color: #856404; font-weight: 500; min-width: 360px; display: inline-block; outline: none; font-size: inherit; font-family: inherit; vertical-align: middle; box-sizing: border-box; margin:0 5px;"/>`;
   });
 
-  // 解析 markdown 为 html
+  // 解析 markdown 为 html
   let html = marked.parse(md);
 
-  // 将 HTML 注释替换为实际的 input 元素
-  for (let i = 0; i < specialInputs.length; i++) {
-    html = html.replace(`<!--SPECIAL_INPUT_${i}-->`, specialInputs[i]);
-  }
-
   // 只转换存在的指标
   html = html.replace(/\[\[([^_]+?)_([^\]]+?)\]\]/g, (match, text, uid) => {
     // 检查指标名称是否存在

+ 4 - 3
src/modules/data-source-manage/add-source/components/ApiFieldConfig.vue

@@ -96,10 +96,11 @@
               <a-input v-model="field.multi_value_delimiter" placeholder="多值分隔符" @input="handleFieldChange" />
             </td>
             <td>
-              <a-select v-model="field.enum_type_id" @change="handleFieldChange">
+              <!-- <a-select v-model="field.enum_type_id" @change="handleFieldChange">
                 <a-option :value="0"> 无 </a-option>
                 <a-option :value="1"> 有 </a-option>
-              </a-select>
+              </a-select> -->
+              <a-input v-model="field.enum_type_id" placeholder="枚举类型ID" @input="handleFieldChange" />
             </td>
             <td>
               <a-select v-model="field.format_str" :disabled="field.field_type !== 'date'" @change="handleFieldChange">
@@ -196,7 +197,7 @@ const addField = () => {
     is_api_support_fuzzy_query: 0,
     multi_value_delimiter: ',',
     is_needs_show_fields: 1,
-    enum_type_id: 0,
+    enum_type_id: "",
     format_str: 'date', // 默认精确到日期
     time_limit: 'limit_to_day_start' // 默认截止到昨天
   }];

+ 4 - 3
src/modules/data-source-manage/add-source/components/DbFieldConfig.vue

@@ -75,10 +75,11 @@
               <a-input v-model="field.field_from_table" placeholder="字段来源表" @input="handleFieldChange" />
             </td>
             <td>
-              <a-select v-model="field.enum_type_id" @change="handleFieldChange">
+              <!-- <a-select v-model="field.enum_type_id" @change="handleFieldChange">
                 <a-option :value="0"> 无 </a-option>
                 <a-option :value="1"> 有 </a-option>
-              </a-select>
+              </a-select> -->
+              <a-input v-model="field.enum_type_id" placeholder="枚举类型ID" @input="handleFieldChange" />
               <!-- <a-input v-model="field.enum_type_id" @input="handleFieldChange" placeholder="枚举类型ID" /> -->
             </td>
             <td>
@@ -173,7 +174,7 @@ const addField = () => {
     common_config_type: null,
     field_from_table: '',
     is_needs_show_fields: 1,
-    enum_type_id: 0,
+    enum_type_id: "",
     date_format: 'date', // 默认精确到日期
     time_limit: 'limit_to_day_start' // 默认截止到昨天
   }];

+ 1 - 1
src/modules/report-template/TemplateEditor.vue

@@ -107,7 +107,7 @@ const getTemplateDetail = async () => {
           console.log(template_config.value, 9090)
         }
         if(res.data.common_config){
-         common_config.value = JSON.parse(res.data.common_config)
+          common_config.value = JSON.parse(res.data.common_config)
         }
         template_name.value = res.data.name
         template_save_time.value =formatDateTime(res.data.updated_at) || ''

+ 4 - 4
src/modules/report-template/editor-model/EditorDetail.vue

@@ -972,7 +972,7 @@ function insertSpecialTag() {
     font-family: inherit;
     vertical-align: middle;
     box-sizing: border-box;
-    margin-left:5px;
+    margin: 0 5px;
   `;
 
   // 3. 动态控制宽度
@@ -1106,13 +1106,13 @@ function syncMentionsData() {
 }
 
 function bindEventsForSpecialInputs() {
-  console.log(111111111111111111111111);
+  // console.log(111111111111111111111111);
   if (!editorRef.value) return;
-  console.log(2222222222222222222);
+  // console.log(2222222222222222222);
   const specialInputs = editorRef.value.querySelectorAll('input[data-special="true"]');
   for (let i = 0, len = specialInputs.length; i < len; i++) {
     const inputEl = specialInputs[i];
-    console.log(inputEl, '打印');
+    // console.log(inputEl, '打印');
     if (inputEl.dataset.eventsBound === 'true') continue;
 
     inputEl.dataset.eventsBound = 'true';