Jelajahi Sumber

六个特殊组件修改

sql715 1 bulan lalu
induk
melakukan
ebcb7d1014

+ 2 - 1
zkqy-ui/package.json

@@ -127,7 +127,8 @@
     "vuex": "3.6.0",
     "vuex-persistedstate": "^4.1.0",
     "webpack": "^4.46.0",
-    "xml2js": "^0.6.2"
+    "xml2js": "^0.6.2",
+    "vue-i18n": "7.3.2"
   },
   "devDependencies": {
     "@babel/core": "^7.12.16",

+ 29 - 1
zkqy-ui/src/api/formCreateMange/mobilePageDesignData.js

@@ -74,4 +74,32 @@ export function getListName(data) {
     data: data,
     baseURL: process.env.VUE_APP_BASE_API3
   })
-}
+}
+
+// /api/mobilePageDesignData/tree 树形接口
+// export function getTree(data,dbname) {
+//   return request({
+//     url: '/api/mobilePageDesignData/tree',
+//     method: 'post',
+//     data: data,
+//     baseURL: process.env.VUE_APP_BASE_API3,
+//     headers: {
+//       'dbname':dbname,
+//     }
+//   })
+// }
+// let dataSource = sessionStorage.getItem("dataSource");
+// console.log('optionDataComponentType', this.optionDataComponentType)
+// let data = {
+//   treeType: "multiTable",
+//   tableName: "tree_01",
+//   showValue: "name",
+//   primaryIdField: "id",
+//   children: {
+//     tableName: "tree_01_01",
+//     showValue: "name",
+//     primaryIdField: "id",
+//     parentIdField: "parent_id"
+//   }
+// }
+// this.getTreeApi({}, dataSource)

+ 13 - 1
zkqy-ui/src/api/login.js

@@ -47,7 +47,19 @@ export function adminLoginApi(username, password, code, uuid) {
     data: data
   })
 }
-
+// 修改语言
+export function changeLanguage(lang){
+  return request({
+    url: '/changeLanguage',
+    method: 'get',
+    headers: {
+      isToken: false,
+    },
+    params: {
+      lang: lang
+    }
+  })
+}
 // 注册方法
 export function register(data) {
   return request({

+ 1 - 1
zkqy-ui/src/layout/index.vue

@@ -139,7 +139,7 @@ export default {
   },
   methods: {
     async logout() {
-      this.$confirm("确定注销并退出系统吗?", "提示", {
+      this.$alert("确定注销并退出系统吗?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",

+ 6 - 4
zkqy-ui/src/main.js

@@ -64,7 +64,8 @@ import "@packages/theme/index.scss";
 
 // bpmnPro end
 
-
+import i18n from './lang'
+import VueI18n from 'vue-i18n'
 
 
 import '@/assets/styles/index.scss' // global css
@@ -153,7 +154,6 @@ Vue.use(Avue);
 
 
 
-
 // 全局方法挂载
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
@@ -196,9 +196,10 @@ Object.keys(Directives).forEach(item => {
  * Currently MockJs will be used in the production environment,
  * please remove it before going online! ! !
  */
-
+Vue.use(VueI18n) 
 Vue.use(Element, {
-  size: Cookies.get('size') || 'medium' // set element-ui default size
+  size: Cookies.get('size') || 'medium',// set element-ui default size
+  i18n: (key, value) => i18n.t(key, value)
 })
 
 Vue.config.productionTip = false
@@ -207,6 +208,7 @@ new Vue({
   el: '#app',
   router,
   store,
+  i18n,
   render: h => h(App),
   beforeCreate() {
     Vue.prototype.$bus = this

+ 1 - 0
zkqy-ui/src/store/getters.js

@@ -43,5 +43,6 @@ const getters = {
   formLastUpdated: state => state.formCreate.lastUpdated,
   // 新增:label 数据
   labelData: state => state.formCreate.labelData || {},
+  language: state => state.app.language,
 }
 export default getters

+ 8 - 0
zkqy-ui/src/store/modules/app.js

@@ -1,6 +1,7 @@
 import Cookies from 'js-cookie'
 
 const state = {
+  language: Cookies.get('language') || 'en',
   sidebar: {
     // opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
     opened: true,
@@ -12,6 +13,10 @@ const state = {
 }
 
 const mutations = {
+  SET_LANGUAGE: (state, language) => {
+    state.language = language
+    Cookies.set('language', language)
+  },
   TOGGLE_SIDEBAR: state => {
     console.log(state)
     if (state.sidebar.hide) {
@@ -48,6 +53,9 @@ const mutations = {
 }
 
 const actions = {
+  setLanguage({ commit }, language) {
+    commit('SET_LANGUAGE', language)
+  },
   toggleSideBar({ commit }) {
     commit('TOGGLE_SIDEBAR')
   },

+ 37 - 9
zkqy-ui/src/views/formCreate/components/FcDesigner.vue

@@ -371,6 +371,7 @@ import {
     copyTextToClipboard,
     formTemplate,
     htmlTemplate,
+    htmlTemplateY,
     getFormRuleDescription,
     getRuleDescription,
     getRuleTree,
@@ -1027,17 +1028,26 @@ export default defineComponent({
                     { language: 'xml' }
                 ).value
                 data.preview.html = hljs.highlight(
-                    htmlTemplate(rule, options),
+                    htmlTemplateY(rule, options),
                     { language: 'xml' }
                 ).value
             },
-            getSaveDate() {
+            getSaveDate(zkqyDataCr,dataSource,url) {
+                let zkqyData;
+                console.log('zkqyDataCr',zkqyDataCr)
+                if(zkqyDataCr){
+                    zkqyData = zkqyDataCr
+                }else {
+                    zkqyData = "[]"
+                }
+                console.log('zkqyData',zkqyData)
+
                 const rule = methods.getJson();
                 const options = methods.getOptionsJson();
                 data.preview.rule = designerForm.parseJson(rule);
                 data.preview.option = designerForm.parseJson(options);
                 // html
-                let htmlDataMb = htmlTemplate(rule, options); // 直接调用,不经过高亮
+                let htmlDataMb = htmlTemplate(rule, options,zkqyData,dataSource,url); // 直接调用,不经过高亮
                 //  组件
                 let componentDataMb = formTemplate(rule, options);
                 let saveDate = {
@@ -1116,20 +1126,38 @@ export default defineComponent({
                 baseRule.value = { rule, append };
                 data.baseForm.rule = tidyRuleConfig(field, baseRule.value, { t });
             },
-            setComponentRuleConfig(name, rule, append) {
-                console.log('----------------',name, rule, append)
-                componentRule.value[name] = { rule, append };
+            // 原来的方法,改成name可以是多个了
+            // setComponentRuleConfig(name, rule, append) {
+            //     console.log('----------------',name, rule, append)
+            //     componentRule.value[name] = { rule, append };
+            //     data.cacheProps = {};
+            //     const activeRule = data.activeRule;
+            //     if (activeRule) {
+            //         const propsVal = data.propsForm.api.formData && data.propsForm.api.formData();
+            //         data.propsForm.rule = data.cacheProps[activeRule._fc_id] = methods.getPropsRule(activeRule);
+            //         nextTick(() => {
+            //             propsVal && data.propsForm.api.setValue(propsVal);
+            //         });
+            //     }
+            // },
+            setComponentRuleConfig(names, rule, append) {
+                // console.log()
+               // 支持传入字符串或数组
+                const components = Array.isArray(names) ? names : [names];
+                components.forEach(name => {
+                    componentRule.value[name] = { rule, append };
+                    console.log('componentRule.value[name]-----------',componentRule.value[name])
+                });
                 data.cacheProps = {};
+                console.log('[[datadata]]',data)
                 const activeRule = data.activeRule;
                 if (activeRule) {
                     const propsVal = data.propsForm.api.formData && data.propsForm.api.formData();
                     data.propsForm.rule = data.cacheProps[activeRule._fc_id] = methods.getPropsRule(activeRule);
                     nextTick(() => {
-                        propsVal && data.propsForm.api.setValue(propsVal);
+                    propsVal && data.propsForm.api.setValue(propsVal);
                     });
                 }
-                console.log('------propsForm----------',data.propsForm.rule)
-
             },
             setValidateRuleConfig(rule, append) {
                 validateRule.value = { rule, append };

+ 2 - 1
zkqy-ui/src/views/formCreate/components/TreeOptions.vue

@@ -6,7 +6,8 @@
             :expand-on-click-node="false">
             <template #default="{ node, data }">
                 <div class="_fd-tree-opt-node">
-                    <el-input size="mini" class="_fd-tree-opt-first" v-model="data[overColumns.label]"
+                    <!-- :disabled="true" -->
+                    <el-input size="mini" class="_fd-tree-opt-first" v-model="data[overColumns.label]"  
                               @blur="change"/>
                     <ValueInput class="_fd-tree-opt-last" size="mini" v-model="data[overColumns.value]" @blur="change"
                                 @change-type="change">

+ 174 - 67
zkqy-ui/src/views/formCreate/layout/home/formCreateMange.vue

@@ -1,7 +1,7 @@
 <template>
   <div id="app">
     <!-- @formOptChange="formOptChange" -->
-    <fc-designer ref="designer" height="100vh" :config="config" @save="handleSave" @active="active"
+    <fc-designer ref="designer" height="100vh" :config="config" @save="handleSave" @active="active" @delete="deleteItem"
       @activeRuleChange="activeRuleChange">
       <template #handle>
         <div class="handle">
@@ -60,10 +60,10 @@
           <el-button type="primary" icon="el-icon-plus" circle size="mini" @click="addMainDisplayColumn"
             :disabled="!selectedMainTable"></el-button>
         </div>
-
         <div v-for="(column, index) in mainDisplayColumns" :key="index" class="display-column-item">
           <el-select v-model="column.selectedColumn" placeholder="请选择展示列" clearable>
-            <el-option v-for="col in availableMainColumns" :key="col.value" :label="col.label || col.fieldDescription" :value="col.value" />
+            <el-option v-for="col in availableMainColumns" :key="col.value" :label="col.label || col.fieldDescription"
+              :value="col.value" />
           </el-select>
           <el-button type="danger" icon="el-icon-delete" circle size="mini"
             @click="removeMainDisplayColumn(index)"></el-button>
@@ -134,10 +134,16 @@
         <el-button type="primary" @click="handleConfirm">确定</el-button>
       </div>
     </el-dialog>
+    <el-dialog title="选择字段数据" :visible.sync="optionDataDisplay" class="_fc-t-dialog optionDataDisplay">
+      <optionData :mode="mode" :optionDataComponentType="optionDataComponentType" :optionDataDisplay="optionDataDisplay"
+        @saveRule="saveRule" :multipleTables="multipleTables" />
+    </el-dialog>
+
   </div>
 </template>
 
 <script>
+import optionData from "./components/optionData.vue"
 import { copyTextToClipboardXg } from "../../utils/index";
 // import { copyTextToClipboard } from "../../utils";
 import formCreate from '@form-create/element-ui';
@@ -188,6 +194,7 @@ export default {
   name: "formCreateMange",
   props: [],
   components: {
+    optionData
   },
   data() {
     let data = window.location.hash.substring(1);
@@ -200,6 +207,11 @@ export default {
       }
     }
     return {
+      // 组件参数----start
+      optionDataComponentType: {},
+      optionDataDisplay: false,
+      multipleTables: [],
+      // 组件参数----end
       formState: false,
       selectedMainTable: '',
       mainTableOptions: [],
@@ -249,20 +261,6 @@ export default {
             ]
           }
         },
-        // baseRule: {
-        //   prepend: true,
-        //   rule: function () { // 改为普通函数
-        //     return [
-        //       {
-        //         type: 'select',
-        //         field: 'formCreateFieldLM',
-        //         title: '列名',
-        //         value: '',
-        //         options: []
-        //       },
-        //     ];
-        //   }
-        // },
         componentRule: {
           zkqyTable: {
             prepend: true,
@@ -616,7 +614,6 @@ export default {
         const zkqyTablePageJson = pageJson.filter(item => item.type === "zkqyTable");
         if (zkqyTableItem) {
           this.$refs.designer.setRule(pageJson)
-          
           let x = this.$refs.designer.getRule()
           let { htmlDataMb } = this.$refs.designer.getSaveDate()
           // 1. 移除原有的 Vue.use() 调用
@@ -633,22 +630,30 @@ export default {
           // 2. 添加自定义代码
           // console.log('pageJson', pageJson)
           let url = process.env.VUE_APP_BASE_API3
-          const customCode = zkqyTableTemplate(columns, zkqyTablePageJson, dataSource,url);
+          const customCode = zkqyTableTemplate(columns, zkqyTablePageJson, dataSource, url);
           // 3. 在 new Vue 之前插入自定义代码
           htmlData = modifiedHtml.replace(
             /new Vue\({/,
             `${customCode}\nnew Vue({`
           );
-          
-          
-
         } else {
+          let htmlDataMbZkqyData;
           this.$refs.designer.setRule(pageJson)
-
           let x = this.$refs.designer.getRule()
+          if(this.multipleTables.length>0){
+            console.log('[this.multipleTables]',this.multipleTables)
+            let multipleTables = this.multipleTables
+            let url = process.env.VUE_APP_BASE_API3
+          let { htmlDataMb } = this.$refs.designer.getSaveDate(JSON.stringify(multipleTables),dataSource,url)
+          htmlDataMbZkqyData = htmlDataMb
+            
+
+          }else{
           let { htmlDataMb } = this.$refs.designer.getSaveDate()
+          htmlDataMbZkqyData = htmlDataMb
 
-          htmlData = htmlDataMb
+          }
+          htmlData = htmlDataMbZkqyData
         }
         console.log('========encodeURIComponent前===================', htmlData)
         htmlData = encodeURIComponent(htmlData); // 关键编码步骤
@@ -659,7 +664,8 @@ export default {
           pageLink,
           componentData,
           htmlData,
-          name
+          name,
+          multipleTreeParam: JSON.stringify(this.multipleTables)
         };
         let res;
         if (this.mode == 3) {
@@ -679,7 +685,6 @@ export default {
             path: "/ydyq/formCreate",
           });
         } else {
-          console.err('----')
         }
       }
     },
@@ -688,15 +693,21 @@ export default {
         let r = this.row?.pageJson
         // this.zkqyTableColumns
         let o = this.row?.pageOptions
+        o = JSON.parse(o)
+        console.log('o1',o)
+
+        if(o.onSubmit) delete o.onSubmit;
+        o=JSON.stringify(o)
         this.$refs.designer.setOptions(o);
+        console.log('o',o)
         this.$refs.designer.setRule(r);
         // 查找 type 为 "zkqyTable" 的对象
         const tableObject = JSON.parse(r).find(item => item.type === "zkqyTable");
-        console.log('tableObject', tableObject)
+        // console.log('tableObject', tableObject)
         if (tableObject && tableObject.columns) {
           this.zkqyTableColumns = tableObject.columns;
           this.tableObject = { columns: tableObject.columns }; // 设置编辑数据
-          console.log(' this.tableObject', this.tableObject)
+          // console.log(' this.tableObject', this.tableObject)
 
         }
       } catch (error) {
@@ -716,7 +727,6 @@ export default {
         opt,
         rule: formCreate.toJson(rule)
       }));
-
     },
     showTemplate() {
       this.state = true;
@@ -827,6 +837,27 @@ export default {
           ],
           false
         )
+        this.$refs.designer.setComponentRuleConfig(['radio', 'checkbox', 'select', 'cascader', 'elTransfer', 'tree'],
+          (componentType) => [
+            {
+              type: 'button',
+              field: 'zkqyOptionData',
+              title: '选择字段数据',
+              value: '',
+              props: {
+                type: 'primary',
+                size: 'small',
+                icon: 'el-icon-plus'
+              },
+              on: {
+                click: () => {
+                  this.optionData(componentType);
+                }
+              }
+            }
+          ],
+          true
+        )
         this.$refs.designer.setComponentRuleConfig('default',  // id
           () => [  // rule 函数,返回 Rule[]
             {
@@ -846,8 +877,57 @@ export default {
           ],
           true,
         )
+
       });
     },
+    optionData(componentType) {
+      console.log('当前组件类型:', componentType)
+      this.optionDataComponentType = componentType
+      this.optionDataDisplay = true
+    },
+    saveRule(data) {
+      console.log('[saveRule方法接收到的传参]', data)
+      // this.multipleTables.push(data)
+      // 检查 this.multipleTables数组中有没有对象的_fc_id和data._fc_id相等的,有的话替换这个对象
+      const existingIndex = this.multipleTables.findIndex(
+        item => item._fc_id == data._fc_id
+      );
+
+      if (existingIndex !== -1) {
+        // 如果存在,替换该对象
+        this.multipleTables.splice(existingIndex, 1, data);
+        console.log('替换已存在的配置', existingIndex);
+      } else {
+        // 如果不存在,添加到数组
+        this.multipleTables.push(data);
+        console.log('添加新配置');
+      }
+
+      console.log('当前 multipleTables:', this.multipleTables);
+    },
+    deleteItem(e) {
+      console.log('[组件被删除时的事件]', e)
+      // 如果e?.type等于['radio', 'checkbox', 'select', 'cascader', 'elTransfer', 'tree']中的就获取e?._fc_id
+      //获取到以后查看 this.multipleTables数组中有没有对象的_fc_id和e._fc_id相等的,有的话删除这个对象
+      if (e?.type && ['radio', 'checkbox', 'select', 'cascader', 'elTransfer', 'tree'].includes(e.type)) {
+        const fcId = e?._fc_id;
+
+        if (fcId) {
+          // 查找 this.multipleTables 中是否有匹配的对象
+          const index = this.multipleTables.findIndex(item => item._fc_id === fcId);
+
+          if (index !== -1) {
+            // 删除匹配的对象
+            this.multipleTables.splice(index, 1);
+            console.log(`已删除 _fc_id 为 ${fcId} 的对象`);
+          } else {
+            console.log(`未在this.multipleTables(六个特殊类型的存值)中找到 _fc_id 为 ${fcId} 的对象`);
+          }
+        } else {
+          console.warn('e._fc_id 不存在');
+        }
+      }
+    },
     active(e, gLSJB) {
       // console.log('e---------',e,gLSJB)
       if (gLSJB) {
@@ -931,43 +1011,43 @@ export default {
         this.selectedMainTable = firstMainCol.tableName;
         // 加载主表列数据
         try {
-      // 加载主表列数据
-      await this.handleMainTableChange(firstMainCol.tableName);
-
-      // 确保 this.mainTableColumns 已加载
-      console.log('this.mainTableColumns',this.mainTableColumns)
-      mainTableColumns.forEach(col => {
-        this.mainDisplayColumns.push({
-          selectedColumn: col.showValue, // 字段名
-          options: this.mainTableColumns, // 确保 options 已加载
-        });
-      });
-    } catch (error) {
-      console.error("加载主表列失败:", error);
-    }
+          // 加载主表列数据
+          await this.handleMainTableChange(firstMainCol.tableName);
+
+          // 确保 this.mainTableColumns 已加载
+          console.log('this.mainTableColumns', this.mainTableColumns)
+          mainTableColumns.forEach(col => {
+            this.mainDisplayColumns.push({
+              selectedColumn: col.showValue, // 字段名
+              options: this.mainTableColumns, // 确保 options 已加载
+            });
+          });
+        } catch (error) {
+          console.error("加载主表列失败:", error);
+        }
       }
       // 如果有子表数据
       if (subTablesData.length > 0) {
         let data = {
-        databaseName: this.databaseName,
-        databaseType: this.databaseType,
-      };
-      // 替换为你的实际接口
-      getAllTable(data).then(response => {
-        if (response.code === 200) {
-          this.subTableOptions = response.data.map(item => ({
-            ...item,
-            label: item.tableComment || item.tableName,
-            value: item.tableName
-          }));
+          databaseName: this.databaseName,
+          databaseType: this.databaseType,
+        };
+        // 替换为你的实际接口
+        getAllTable(data).then(response => {
+          if (response.code === 200) {
+            this.subTableOptions = response.data.map(item => ({
+              ...item,
+              label: item.tableComment || item.tableName,
+              value: item.tableName
+            }));
 
-        } else {
+          } else {
+            this.$message.error('加载子表失败');
+          }
+        }).catch(error => {
           this.$message.error('加载子表失败');
-        }
-      }).catch(error => {
-        this.$message.error('加载子表失败');
-        console.error(error);
-      });
+          console.error(error);
+        });
         // 按子表分组
         const subTablesGrouped = subTablesData.reduce((acc, col) => {
           if (!acc[col.tableName]) {
@@ -1000,7 +1080,7 @@ export default {
               });
             }
             console.log(' this.subTables', this.subTables)
-            console.log('subTable.tableName',subTable.tableName)
+            console.log('subTable.tableName', subTable.tableName)
           }).catch(error => {
             console.error("加载子表列失败:", error);
           });
@@ -1277,10 +1357,33 @@ export default {
         this.$refs.designer.setRule(this.hashData.rule);
       } else {
         this.addZkqyMenu()
-
         this.mode = sessionStorage.getItem("form_mode");
         if (this.mode == '3') {
           this.row = JSON.parse(sessionStorage.getItem("form_row"));
+          // 检查 multipleTreeParam 是否存在,并确保它是数组
+          if (this.row && this.row.multipleTreeParam) {
+            if (Array.isArray(this.row.multipleTreeParam)) {
+              // 如果已经是数组,直接赋值
+              this.multipleTables = this.row.multipleTreeParam;
+            } else if (typeof this.row.multipleTreeParam === 'string') {
+              try {
+                // 如果是 JSON 字符串,尝试解析为数组
+                const parsedData = JSON.parse(this.row.multipleTreeParam);
+                this.multipleTables = Array.isArray(parsedData) ? parsedData : [parsedData];
+              } catch (error) {
+                console.error('解析 multipleTreeParam 失败:', error);
+                this.multipleTables = []; // 解析失败时初始化为空数组
+              }
+            } else {
+              // 如果是对象或其他类型,转换为数组
+              this.multipleTables = [this.row.multipleTreeParam];
+            }
+          } else {
+            // 如果 multipleTreeParam 不存在,初始化为空数组
+            this.multipleTables = [];
+          }
+
+          console.log('[打印 this.multipleTables]', this.multipleTables);
         } else {
           this.row = ''
         }
@@ -1430,11 +1533,6 @@ body {
   flex-direction: column !important;
 }
 
-/* #app {
-    display: flex;
-    flex-direction: column;
-    flex: 1;
-} */
 
 ._fc-copyright {
   display: flex;
@@ -1601,4 +1699,13 @@ body {
   flex: 1;
   margin-right: 10px;
 }
+</style>
+<style scoped>
+.optionDataDisplay>>>.el-dialog__body {
+  padding-top: 0px !important;
+}
+
+.optionDataDisplay>>>.el-dialog {
+  width: 80%;
+}
 </style>

+ 2 - 1
zkqy-ui/src/views/formCreate/layout/home/index.vue

@@ -78,6 +78,7 @@ export default {
       // 选中数组(包含所有数据)
       selection: [],
       // 标记,判断是编辑还是新增跳转,2增加3修改
+      mode: 4,
       // 表格 start
       loading: true,
       tableList: [],
@@ -256,4 +257,4 @@ export default {
     line-height: 32px;
     width: auto !important;
 }
-</style>
+</style>

+ 1 - 1
zkqy-ui/src/views/formCreate/layout/home/templateJs/zkqyTable.js

@@ -238,7 +238,7 @@ var zkqyTable = {
                         document.body.innerHTML = '';
                         document.body.appendChild(iframe);
                         // 将 pageId 存储到 localStorage
-                        localStorage.setItem('sharedPageId', pageId);   
+                        localStorage.setItem('sharedPageId', this.pageId);   
                     }
             });
         },

+ 154 - 2
zkqy-ui/src/views/formCreate/utils/index.js

@@ -406,7 +406,160 @@ export default {
 <\/script>`;
 }
 
-export function htmlTemplate(json, options) {
+export function htmlTemplate(json, options, zkqyData,dataSource,url) {
+    console.log('[htmlTemplate]',zkqyData)
+
+    return `<html lang="zh">
+    <head>
+        <meta charset="UTF-8">
+        <!-- Import style -->
+        <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"/>
+        <!-- Import Vue 2.7 -->
+        <script src="https://unpkg.com/vue@2"></script>
+        <!-- Import element-ui -->
+        <script src="https://unpkg.com/element-ui/lib/index.js"></script>
+        <!-- Import formCreate -->
+        <script src="https://unpkg.com/@form-create/element-ui@super"><\/script>
+    </head>
+    <body>
+        <div id="app">
+            <form-create :rule="rule" :option="options" v-model:value="formData" v-model="api" @submit="onSubmit"></form-create>
+        </div>
+        <script>
+            Vue.use(ELEMENT);
+            Vue.use(formCreate);
+            new Vue({
+                el: '#app',
+                data() {
+                    return {
+                        rule: formCreate.parseJson('${json.replaceAll('\\', '\\\\').replaceAll('\'', '\\\'')}'),
+                        options: formCreate.parseJson('${options.replaceAll('\\', '\\\\').replaceAll('\'', '\\\'')}'),
+                        formData: {},
+                        api: null,
+                        zkqyData:${zkqyData},
+                    };
+                },
+                methods: {
+                    onSubmit(formData){
+                        console.log('submit', formData);
+                    },
+                    async zkqyDataApi(data,type,id){
+                        let zkqyData = this.zkqyData;
+                        if (!zkqyData || zkqyData.length === 0) return;
+                        const headers = {
+                            'Accept': 'application/json',
+                            'dbname': '${dataSource}',
+                            'Content-Type': 'application/json'
+                        };
+                        try {
+                            let response;
+                            if (type === 'cascader' || type === 'tree') {
+                                // 调用树形接口 POST
+                                const apiUrl = '${url}api/mobilePageDesignData/tree';
+                                console.log('调用树形接口:', apiUrl);
+                                response = await fetch(apiUrl, {
+                                    method: 'POST',
+                                    headers,
+                                    body: JSON.stringify(data)
+                                });
+                            } else {
+                                // 调用下拉框接口 GET
+                                let x = new URLSearchParams(data).toString()
+                                const apiUrl = '${url}api/mobilePageDesignData/dropdown?'+x;
+                                console.log('调用下拉框接口:', apiUrl);
+                                response = await fetch(apiUrl, {
+                                    method: 'GET',
+                                    headers
+                                });
+                            }
+                
+                            if (!response.ok) {
+                                throw new Error('HTTP error! status:response.status');
+                            }
+                            const result = await response.json();
+                            // console.log('this.rule:', this.rule);
+                            console.log(type,id,result.data)
+                            const targetRule = this.rule.find(item => item._fc_id === id);
+                            // console.log('[targetRule]',targetRule)
+                              if (type === 'tree') {
+                                 console.log('[树形--targetRule]',targetRule?.props?.data)
+                                 this.$set(targetRule?.props, 'data', result.data);
+                              }
+                              else if(type === 'cascader'){
+                                console.log('[ 级联选择器,--targetRule]',targetRule?.props?.options)
+                                this.$set(targetRule.props, 'options', result.data);
+
+                              }else if(type === 'elTransfer'){
+                                console.log('[穿梭框--targetRule]',targetRule?.props?.data)
+                                this.$set(targetRule.props, 'data', result.data);
+                              }else {
+                                console.log('[其他--targetRule]',targetRule?.options)
+                                this.$set(targetRule, 'options', result.data);
+                              }
+                              this.rule =formCreate.parseJson(JSON.stringify([...this.rule])); // 触发重新渲染
+                            return result;
+                            
+                        } catch (error) {
+                            console.error('type接口请求失败:', error);
+                            throw error;
+                        }
+                    },
+                    transformTreeToSingleObject(node) {
+                        if (!node) return node;
+                        
+                        // 创建新对象,避免修改原对象
+                        const newNode = {...node};
+                        
+                        // 处理 childrenTree
+                        if (Array.isArray(newNode.childrenTree) ){
+                          if (newNode.childrenTree.length > 0) {
+                            // 取第一个元素作为对象
+                            newNode.childrenTree = this.transformTreeToSingleObject(newNode.childrenTree[0]);
+                          } else {
+                            // 空数组转为 null 或 undefined
+                            newNode.childrenTree = null;
+                          }
+                        } else if (newNode.childrenTree) {
+                          // 如果不是数组但存在 childrenTree,递归处理
+                          newNode.childrenTree = this.transformTreeToSingleObject(newNode.childrenTree);
+                        }
+                        
+                        return newNode;
+                      },
+                },
+                mounted() {
+                    let zkqyData = this.zkqyData
+                    if(zkqyData && zkqyData.length>0){
+                        console.log('[this.rule]',this.rule)
+                       // 遍历rule数组
+                        this.rule.forEach(ruleItem => {
+                        // 在zkqyData中查找匹配的_fc_id
+                        const matchedData = zkqyData.find(dataItem => dataItem._fc_id === ruleItem._fc_id);
+                        if (matchedData) {
+                            console.log("找到匹配的规则", matchedData);
+                            if (matchedData?.type !== 'cascader' && matchedData?.type !== 'tree') {
+                                resultObj = {
+                                    tableName: matchedData?.parentNode?.tableName,
+                                    valueName: matchedData?.parentNode?.primaryIdField,
+                                    labelName: matchedData?.parentNode?.showValue,
+                                    type: matchedData?.type
+                                };
+                                this.zkqyDataApi(resultObj,matchedData?.type,matchedData._fc_id)
+                            } 
+                            else {
+                                resultObj = this.transformTreeToSingleObject(matchedData.parentNode);
+                                resultObj.componentType = matchedData?.type
+                                this.zkqyDataApi(resultObj,matchedData?.type,matchedData._fc_id)
+                            }
+                    }
+                })
+            }},
+            })
+        </script>
+    </body>
+</html>`
+}
+export function htmlTemplateY(json, options) {
     return `<html lang="zh">
     <head>
         <meta charset="UTF-8">
@@ -446,7 +599,6 @@ export function htmlTemplate(json, options) {
     </body>
 </html>`
 }
-
 export function escapeRegExp(str) {
     return str.replace(/[\ .*+?^${}()|[\]\\]/g, '\\$&');
 }

+ 11 - 3
zkqy-ui/src/views/login.vue

@@ -2,8 +2,9 @@
   <div class="login">
     <div class="page-description" v-if="config.pageDescription">
       <span class="description" v-html="config.pageDescription"> </span>
-      <span class="sub-description"> 登录并开始管理您的智能引擎账户 </span>
+      <span class="sub-description">登录并开始管理您的只能引擎账户</span>
     </div>
+    
     <el-form
       ref="loginForm"
       :model="loginForm"
@@ -11,16 +12,20 @@
       class="login-form"
     >
       <el-row>
+  <!-- <lang-select class="set-language" /> -->
+
         <el-col :span="12" class="comlogo"></el-col>
         <el-col :span="12">
           <div class="grid-content bg-purple-dark title">
-            · {{ config.loginPageTitle || "工业应用引擎" }}
+           {{ config.loginPageTitle || "工业应用引擎" }}
             <!-- 智能制造平台  工联院-->
             <!-- 工业应用引擎  -->
           </div>
         </el-col>
       </el-row>
+
       <el-row class="rowww">
+        <!-- {{$t('login.title')}} -->
         <el-col :span="12" class="text" prop="username">用户名</el-col>
         <el-input
           v-model="loginForm.username"
@@ -93,9 +98,10 @@ import { getCodeImg, isTenantExist } from "@/api/login";
 import { changeDatasource } from "@/api/dataEngine";
 import Cookies from "js-cookie";
 import { encrypt, decrypt } from "@/utils/jsencrypt";
-
+import LangSelect from '@/components/LangSelect'
 export default {
   name: "Login",
+  components: { LangSelect },
   data() {
     return {
       codeUrl: "",
@@ -142,6 +148,8 @@ export default {
     this.clearSession();
     this.validateTenantId();
     this.getCode();
+    
+    // this.$i18n.locale = "en"
   },
   methods: {
     clearSession() {