3 Commity e9a2e4d919 ... 46a91c00c7

Autor SHA1 Správa Dátum
  sql715 46a91c00c7 国际化,工具端部分 1 mesiac pred
  sql715 01963c08c3 图片修改 1 mesiac pred
  sql715 ebcb7d1014 六个特殊组件修改 1 mesiac pred
68 zmenil súbory, kde vykonal 2900 pridanie a 2017 odobranie
  1. 1 0
      zkqy-ui/node_modules/k-form-design/packages/components/KBatch/batch.vue
  2. 38 2
      zkqy-ui/node_modules/k-form-design/packages/components/KChangeOption/index.vue
  3. 1 0
      zkqy-ui/node_modules/k-form-design/packages/components/KDatePicker/datePicker.vue
  4. 11 0
      zkqy-ui/node_modules/k-form-design/packages/components/KFormBuild/index.vue
  5. 30 2
      zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/config/formItemsConfig.js
  6. 35 1
      zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/index.vue
  7. 8 3
      zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/codeModal.vue
  8. 252 13
      zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/formItemProperties.vue
  9. 145 4
      zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/formProperties.vue
  10. 52 0
      zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/layoutItem.vue
  11. 15 1
      zkqy-ui/node_modules/k-form-design/packages/components/KFormItem/index.vue
  12. 5 0
      zkqy-ui/node_modules/k-form-design/packages/components/KFormPreview/index.vue
  13. 1 0
      zkqy-ui/node_modules/k-form-design/packages/components/KSlider/KSlider.vue
  14. 2 3
      zkqy-ui/node_modules/k-form-design/packages/mini.js
  15. 1 0
      zkqy-ui/node_modules/k-form-design/packages/utils/NodeSchema.js
  16. 5 5
      zkqy-ui/node_modules/k-form-design/packages/utils/index.js
  17. 2 1
      zkqy-ui/package.json
  18. 29 1
      zkqy-ui/src/api/formCreateMange/mobilePageDesignData.js
  19. 13 1
      zkqy-ui/src/api/login.js
  20. 1 0
      zkqy-ui/src/components/Breadcrumb/index.vue
  21. 7 6
      zkqy-ui/src/layout/components/TagsView/index.vue
  22. 53 30
      zkqy-ui/src/layout/index.vue
  23. 6 4
      zkqy-ui/src/main.js
  24. 5 3
      zkqy-ui/src/router/index.js
  25. 1 0
      zkqy-ui/src/store/getters.js
  26. 8 0
      zkqy-ui/src/store/modules/app.js
  27. 1 31
      zkqy-ui/src/store/modules/permission.js
  28. 13 1
      zkqy-ui/src/utils/request.js
  29. 55 38
      zkqy-ui/src/views/adminLogin.vue
  30. 0 1
      zkqy-ui/src/views/asEditor/App.vue
  31. 2 2
      zkqy-ui/src/views/asEditor/components/realTimeView/index.vue
  32. 3 3
      zkqy-ui/src/views/asEditor/components/uploadImg/index.vue
  33. 42 48
      zkqy-ui/src/views/bpmprocess/index.vue
  34. 85 88
      zkqy-ui/src/views/bpmprocess/scriptManage.vue
  35. 67 67
      zkqy-ui/src/views/dataEngine/datamodeling/index.vue
  36. 8 8
      zkqy-ui/src/views/dialogMange/index.vue
  37. 8 8
      zkqy-ui/src/views/dialogMange/relayTableMange/tablelist.vue
  38. 62 75
      zkqy-ui/src/views/dragform/index.vue
  39. 52 74
      zkqy-ui/src/views/dragform/tableList.vue
  40. 63 11
      zkqy-ui/src/views/formCreate/components/FcDesigner.vue
  41. 2 1
      zkqy-ui/src/views/formCreate/components/TreeOptions.vue
  42. 253 104
      zkqy-ui/src/views/formCreate/layout/home/formCreateMange.vue
  43. 19 18
      zkqy-ui/src/views/formCreate/layout/home/index.vue
  44. 39 45
      zkqy-ui/src/views/formCreate/layout/home/navigationBar.vue
  45. 1 5
      zkqy-ui/src/views/formCreate/layout/home/templateJs/zkqyTable.js
  46. 167 2
      zkqy-ui/src/views/formCreate/utils/index.js
  47. 79 35
      zkqy-ui/src/views/index.vue
  48. 1 1
      zkqy-ui/src/views/loading.vue
  49. 86 58
      zkqy-ui/src/views/login.vue
  50. 92 102
      zkqy-ui/src/views/relateTable/index.vue
  51. 24 19
      zkqy-ui/src/views/system/engineeringManage/index.vue
  52. 132 268
      zkqy-ui/src/views/system/excuteBtnMange/index.vue
  53. 71 71
      zkqy-ui/src/views/system/formGroupMange/index.vue
  54. 99 205
      zkqy-ui/src/views/system/tenant/tenantIndex.vue
  55. 19 11
      zkqy-ui/src/views/system/user/profile/index.vue
  56. 12 12
      zkqy-ui/src/views/system/user/profile/resetPwd.vue
  57. 37 37
      zkqy-ui/src/views/system/user/profile/userAvatar.vue
  58. 14 14
      zkqy-ui/src/views/system/user/profile/userInfo.vue
  59. 34 36
      zkqy-ui/src/views/tableMange/components/ClassificationQueryPanel.vue
  60. 9 9
      zkqy-ui/src/views/tableMange/components/DataFilterPanel.vue
  61. 48 53
      zkqy-ui/src/views/tableMange/components/StyleFormPanel.vue
  62. 90 89
      zkqy-ui/src/views/tableMange/index.vue
  63. 156 156
      zkqy-ui/src/views/tool/datasheet/index.vue
  64. 1 1
      zkqy-ui/src/views/treeTable/del.vue
  65. 23 23
      zkqy-ui/src/views/treeTable/index.vue
  66. 75 83
      zkqy-ui/src/views/treeTableMange/index.vue
  67. 127 10
      zkqy-ui/ss.html
  68. 2 14
      zkqy-ui/vue.config.js

+ 1 - 0
zkqy-ui/node_modules/k-form-design/packages/components/KBatch/batch.vue

@@ -104,6 +104,7 @@ export default {
       return this.record.list.filter(item => !item.options.hidden).length;
     },
     columns() {
+      console.log(this.record);
       const columns = [];
       if (!this.record.options.hideSequence) {
         columns.push({

+ 38 - 2
zkqy-ui/node_modules/k-form-design/packages/components/KChangeOption/index.vue

@@ -3,7 +3,19 @@
     <a-row v-if="type === 'option' || type === 'tab'" :gutter="8">
       <div class="option-change-box" v-for="(val, index) in value" :key="index">
         <a-col :span="9"><Input v-model="val.label" placeholder="名称"/></a-col>
-        <a-col :span="9"><Input v-model="val.value" placeholder="值"/></a-col>
+        <a-col :span="9">
+          <!-- <Input v-model="val.value" placeholder="值"/> -->
+          <el-select v-model="val.value" placeholder="请选择" filterable>
+            <el-option
+              v-for="item in tableList"
+              :key="item.tableName"
+              :label="item.tableComment"
+              :value="item.tableName">
+              <span class="discribe" style="float: left">{{ item.tableComment }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.tableName }}</span>
+            </el-option>
+          </el-select>
+          </a-col>
         <a-col :span="6"
           ><div @click="handleDelete(index)" class="option-delete-box">
             <a-icon type="delete" /></div
@@ -48,19 +60,23 @@
   </div>
 </template>
 <script>
+import { mounted } from 'vue2-ace-editor'
 /*
  * author kcz
  * date 2019-11-20
  * description 修改多选、下拉、单选等控件options的组件,添加移除校验规制的组件
  */
+import { getUncommonTable } from '@/utils/other';
 import { pluginManager } from "../../utils/index";
 const Input = pluginManager.getComponent("input").component;
 const InputNumber = pluginManager.getComponent("number").component;
+const Select = pluginManager.getComponent("select").component;
 export default {
   name: "KChangeOption",
   components: {
     Input,
-    InputNumber
+    InputNumber,
+    Select
   },
   props: {
     value: {
@@ -70,9 +86,29 @@ export default {
     type: {
       type: String,
       default: "option"
+    },
+    tableList:{
+      type: Array,
+      default:()=>[],
+    }
+  },
+  data() {
+    return {
+      // tableOptions: [],
     }
   },
+  mounted() {
+    // this.getTableList();
+  },
   methods: {
+    // 获取表格list
+    async getTableList() {
+      let par = {
+        ... this.$store.state.user.dataSource
+      }
+      let res = await getUncommonTable()
+      this.tableOptions=res||[]
+    },
     handleAdd() {
       // 添加
       const addData = [

+ 1 - 0
zkqy-ui/node_modules/k-form-design/packages/components/KDatePicker/datePicker.vue

@@ -48,6 +48,7 @@ import moment from "moment";
 import { pluginManager } from "../../utils/index";
 
 const DatePicker = pluginManager.getComponent("datePicker");
+// const DatePicker = pluginManager.getComponent("datetimePicker");
 const RangePicker = pluginManager.getComponent("rangePicker");
 const MonthPicker = pluginManager.getComponent("monthPicker");
 

+ 11 - 0
zkqy-ui/node_modules/k-form-design/packages/components/KFormBuild/index.vue

@@ -76,8 +76,17 @@ export default {
     defaultValue: {
       type: Object,
       default: () => ({})
+    },
+    tableData: {
+      type: Array,
+      default: () => []
     }
   },
+  provide() {
+    return {
+      tableData: () => this.tableData,
+    };
+  },
   components: {
     buildBlocks
   },
@@ -101,6 +110,7 @@ export default {
       this.form.resetFields();
     },
     getData() {
+      console.log('this.form',this.form);
       // 提交函数,提供父级组件调用
       return new Promise((resolve, reject) => {
         try {
@@ -145,6 +155,7 @@ export default {
         }
       });
     },
+    getselectData(){},
     setData(json) {
       return new Promise((resolve, reject) => {
         lazyLoadTick.nextTick(() => {

+ 30 - 2
zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/config/formItemsConfig.js

@@ -313,7 +313,7 @@ export const defaultSchemaList = [
       data: "{}",
       fileName: "file",
       headers: {},
-      action: "https://examples.epicjs.cn/epic-mock/common/upload",
+      action: "http://cdn.kcz66.com/uploadFile.txt",
       placeholder: "上传"
     },
     model: "",
@@ -342,7 +342,7 @@ export const defaultSchemaList = [
       placeholder: "上传",
       fileName: "image",
       headers: {},
-      action: "https://examples.epicjs.cn/epic-mock/common/upload",
+      action: "http://cdn.kcz66.com/upload-img.txt",
       listType: "picture-card"
     },
     model: "",
@@ -591,6 +591,34 @@ export const defaultSchemaList = [
     },
     key: ""
   },
+  {
+    type: "textShow", // 表单类型
+    label: "文本展示", // 标题文字
+    icon: "icon-pingfen_moren",
+    options: {
+      type: "text",
+      width: "100%", // 宽度
+      defaultValue: "", // 默认值
+      placeholder: "请输入", // 没有输入时,提示文字
+      clearable: false,
+      maxLength: null,
+      addonBefore: "",
+      addonAfter: "",
+      showLabel: true,
+      hidden: false, // 是否隐藏,false显示,true隐藏
+      disabled: false // 是否禁用,false不禁用,true禁用
+    },
+    model: "", // 数据字段
+    key: "",
+    help: "",
+    rules: [
+      //验证规则
+      {
+        required: false, // 必须填写
+        message: "必填项"
+      }
+    ]
+  },
   {
     type: "html",
     label: "HTML",

+ 35 - 1
zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/index.vue

@@ -83,7 +83,8 @@
               <slot name="right-action"></slot>
             </template>
           </operatingArea>
-          <!-- 操作区域 end -->
+          <!-- 操作区域 end --> 
+          <!-- 中间控件渲染区域 start -->
           <k-form-component-panel
             :class="{ 'no-toolbars-top': !toolbarsTop }"
             :data="data"
@@ -94,6 +95,8 @@
             ref="KFCP"
             @handleSetSelectItem="handleSetSelectItem"
           />
+          <!-- 中间控件渲染区域 end -->
+
           <!-- 操作区域 start -->
           <k-json-modal ref="jsonModal" />
           <k-code-modal ref="codeModal" />
@@ -120,6 +123,7 @@
                 class="form-item-properties"
                 :selectItem="selectItem"
                 :hideModel="hideModel"
+                @changeOptionsListData="changeOptionsListData"
               />
             </a-tab-pane>
           </a-tabs>
@@ -151,6 +155,10 @@ import { Modal, message } from "ant-design-vue";
 import { revoke, nodeSchema } from "../../utils/index";
 import formItemProperties from "./module/formItemProperties";
 import formProperties from "./module/formProperties";
+import { black } from '@/components/updateModule/bpmn-js/lib/draw/BpmnRenderUtil'
+import stringify from 'uuid/dist/stringify'
+import tempData from '@/assets/js/kFormDesign.js'
+
 
 export default {
   name: "KFormDesign",
@@ -273,7 +281,16 @@ export default {
     }
   },
   methods: {
+    changeOptionsListData(flag, index) {
+      if (flag) {
+        this.selectItem.options.optionsListData.push('');
+        console.log(this.selectItem.options.optionsListData);
+      } else (
+        this.selectItem.options.optionsListData.split(index,1)
+      )
+    },
     generateKey(list, index) {
+      // console.log('generateKey');
       // 生成key值
       const key = list[index].type + "_" + new Date().getTime();
       this.$set(list, index, {
@@ -288,6 +305,8 @@ export default {
     },
     handleListPush(item) {
       // 双击控件按钮push到list
+      console.log(this.selectItem);
+      console.log(item);
       // 生成key值
       if (!this.selectItem.key) {
         // 在没有选择表单时,将数据push到this.data.list
@@ -490,6 +509,15 @@ export default {
 
     handleSave() {
       // 保存函数
+      // console.log(this.data)
+      if(this.data.list.length == 0){
+        message.error("请拖拽组件");
+        return
+      }
+      if (!this.data.config.formName || !this.data.config.nickFormName){
+        message.error("请填写表单名称和表单别名");
+        return
+      }
       this.$emit("save", JSON.stringify(this.data));
     },
     getValue() {
@@ -501,8 +529,14 @@ export default {
     }
   },
   created() {
+    let blackList=['评分','警告提示','HTML','富文本','按钮']
     this.loadState = true;
     nodeSchema.addComputed(this.schemaGroup);
+    this.schemaGroup = tempData;
+    console.log('this.schemaGroup',this.schemaGroup);
+    this.schemaGroup[0].list = this.schemaGroup[0].list.filter(item => {
+      return !blackList.some(v=>v==item.label)
+    })
   }
 };
 </script>

+ 8 - 3
zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/codeModal.vue

@@ -31,6 +31,7 @@
   </a-modal>
 </template>
 <script>
+// vue的生成
 const codeVueFront = `<template>
   <div>
     <k-form-build
@@ -38,7 +39,7 @@ const codeVueFront = `<template>
       ref="KFB"
       @submit="handleSubmit"
     />
-    <button @click="getData">提交</button>
+    <button @click="getData">测试</button>
   </div>
 </template>
 <script>
@@ -76,11 +77,13 @@ let codeVueLast = `
 }
 <\/script>`;
 
+
+// 生成HTML的
 let codeHtmlFront = `<!DOCTYPE html>
 <html>
 
 <head>
-  <title>表单设计器kcz</title>
+  <title>表单设计</title>
   <meta charset="UTF-8">
   <link rel="stylesheet" href="http://unpkg.com/k-form-design/lib/k-form-design.css">
 </head>
@@ -90,7 +93,7 @@ let codeHtmlFront = `<!DOCTYPE html>
     <k-form-build ref="KFB" @submit="handleSubmit" :value="jsonData"></k-form-build>
     <button @click="getData">提交</button>
   </div>
-  <script src="https://cdn.epicjs.cn/vue.min.js"><\/script>
+  <script src="http://cdn.kcz66.com/vue.min.js"><\/script>
   <script src="http://unpkg.com/k-form-design/lib/k-form-design.umd.min.js"><\/script>
   <script>
     let jsonData = `;
@@ -149,6 +152,7 @@ export default {
         this.editorHtmlJson =
           codeHtmlFront + JSON.stringify(this.jsonData) + codeHtmlLast;
       }
+      
     }
   },
   components: {
@@ -157,6 +161,7 @@ export default {
   methods: {
     handleCancel() {
       this.visible = false;
+     
     }
   }
 };

+ 252 - 13
zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/formItemProperties.vue

@@ -9,15 +9,65 @@
 
       <a-form v-show="selectItem.key !== ''">
         <a-form-item v-if="isDefined(selectItem.label)" label="标签">
-          <Input v-model="selectItem.label" placeholder="请输入" />
+          <Input v-model="selectItem.label" @input="seeSelectItem" placeholder="请输入" />
         </a-form-item>
 
+        <!-- +++ -->
         <a-form-item
           v-if="!hideModel && isDefined(selectItem.model)"
-          label="数据字段"
+          label="表名"
         >
-          <Input v-model="selectItem.model" placeholder="请输入" />
+        <!-- <Select
+            v-model="formList.tableName"
+            :fieldNames="{
+              'label': tableComment, 'value': tableName
+            }"
+            @change="getFormList"
+            mode="tags"
+          /> -->
+          <el-select v-model="selectItem.tableName" placeholder="请选择" filterable @change="getListName(selectItem)">
+            <el-option
+              v-for="item in formList.formName"
+              :key="item.tableName"
+              :label="item.tableComment"
+              :value="item.tableName">
+              <span class="discribe" style="float: left">{{ item.tableComment }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.tableName }}</span>
+            </el-option>
+          </el-select>
         </a-form-item>
+        <a-form-item
+          v-if="!hideModel && isDefined(selectItem.model) && isNeedColumn(selectItem)"
+          label="列名"
+        >
+          <el-select v-model="selectItem.model" @change="changeModel" filterable placeholder="请选择">
+            <el-option
+              v-for="item in formList.listName"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+              <span style="float: left">{{ item.label }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.fieldDescription }}</span>
+            </el-option>
+          </el-select>
+        </a-form-item>
+        <a-form-item
+          v-if="!hideModel && isDefined(selectItem.columns)"
+          label="编辑列"
+        >
+        <el-button type="primary" icon="el-icon-edit" @click="editTableColumns(selectItem)">编辑</el-button>
+          <!-- <el-select v-model="selectItem.model" @change="changeModel" filterable placeholder="请选择">
+            <el-option
+              v-for="item in formList.listName"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+              <span style="float: left">{{ item.label }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.fieldDescription }}</span>
+            </el-option>
+          </el-select> -->
+        </a-form-item>
+       
         <!-- input type start -->
         <a-form-item v-if="selectItem.type === 'input'" label="输入框type">
           <Input v-model="options.type" placeholder="请输入" />
@@ -99,28 +149,35 @@
         <a-form-item v-if="isDefined(options.dictCode)" label="dictCode">
           <Input v-model="options.dictCode" />
         </a-form-item>
+
         <!-- 选项配置及动态数据配置 start -->
         <a-form-item v-if="isDefined(options.options)" label="选项配置">
           <Radio buttonStyle="solid" v-model="options.dynamic">
             <RadioButton :value="false">静态数据</RadioButton>
             <RadioButton :value="true">动态数据</RadioButton>
           </Radio>
-
-          <Input
+          <!-- <div class="dynamic-wrap"> -->
+            <Input
             v-show="options.dynamic"
             v-model="options.dynamicKey"
             placeholder="动态数据变量名"
           />
+          <OptionsEdit class="ml5 mt10" :dynamicKey="options.dynamicKey" v-show="options.dynamic&&options
+          .dynamicKey" @setDynamicKey="setDynamicKey" :options="options" :selectItem="selectItem"></OptionsEdit>
+          <!-- </div> -->
+          
+          
 
           <KChangeOption v-show="!options.dynamic" v-model="options.options" />
         </a-form-item>
         <!-- 选项配置及动态数据配置 end -->
+
         <!-- tabs配置 start -->
         <a-form-item
           v-if="['tabs', 'selectInputList'].includes(selectItem.type)"
           :label="selectItem.type === 'tabs' ? '页签配置' : '列选项配置'"
         >
-          <KChangeOption v-model="selectItem.columns" type="tab" />
+          <KChangeOption v-model="selectItem.columns" :tableList="formList.formName" type="tab" />
         </a-form-item>
         <!-- tabs配置 end -->
         <a-form-item v-if="selectItem.type === 'grid'" label="栅格间距">
@@ -154,21 +211,30 @@
             :count="options.max"
           />
         </a-form-item>
+        
         <a-form-item v-if="selectItem.type === 'select'" label="默认值">
           <Select
-            :options="options.options"
+            :options="formList.listName"
             v-model="options.defaultValue"
             :allowClear="options.clearable"
             :mode="options.multiple ? 'multiple' : ''"
           />
+          <!-- <el-option
+              v-for="item in formList.listName"
+              :key="item.fieldName"
+              :label="item.fieldName"
+              :value="item.fieldName">
+            </el-option> -->
         </a-form-item>
+
         <a-form-item v-if="selectItem.type === 'radio'" label="默认值">
           <Radio :options="options.options" v-model="options.defaultValue" />
         </a-form-item>
+
         <a-form-item v-if="selectItem.type === 'checkbox'" label="默认值">
           <Checkbox :options="options.options" v-model="options.defaultValue" />
         </a-form-item>
-        <!-- 日期选择器默认值 start -->
+        <!-- 默认值 start -->
         <a-form-item v-if="selectItem.type === 'date'" label="默认值">
           <Input
             v-if="!options.range"
@@ -512,10 +578,57 @@
         </a-form-item>
       </a-form>
     </div>
+    <!-- 表格展示数据弹窗 -->
+    <el-dialog
+      :visible.sync="tableShowData.isShow"
+      :modal-append-to-body="false"
+      :append-to-body="true"
+      title="表格展示数据"
+      width="500px"
+    >
+    <div class="ben-list mb5" >
+      <el-button type="primary" size="small" icon="el-icon-plus" @click="addOneColumn">添加一列</el-button>
+      <el-button size="small" icon="el-icon-close" @click="tableShowData.isShow=false">关闭</el-button>
+    </div>
+    
+    <div class="table-wrap">
+    <el-table v-if="selectItem" :data="selectItem.columns||[]" border stripe>
+    <el-table-column type="index" width="50" />
+    <el-table-column prop="prop" label="字段">
+      <template slot-scope="scope">
+        <el-select v-model="scope.row.prop" filterable size="mini">
+      <el-option
+              v-for="item in formList.listName"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+              <span style="float: left">{{ item.label }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.fieldDescription }}</span>
+            </el-option>
+      </el-select>
+      </template>
+      
+    </el-table-column>
+    <el-table-column prop="label" label="描述">
+      <template slot-scope="scope">
+        <el-input v-model="scope.row.label"  size="mini" clearable ></el-input>
+        
+      </template>
+    </el-table-column>
+    <el-table-column label="操作">
+      <template slot-scope="scope">
+        <el-button type="text" size="mini" icon="el-icon-delete" @click="handleDelete(scope.$index)">删除</el-button>
+      </template>
+    </el-table-column>
+    
+    </el-table>
+    </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import { message } from 'ant-design-vue'
 /*
  * author kcz
  * date 2019-11-20
@@ -524,6 +637,9 @@
 import KChangeOption from "../../KChangeOption/index.vue";
 import kCheckbox from "../../KCheckbox/index.vue";
 import { pluginManager } from "../../../utils/index";
+import { getListName, getFormName } from "@/api/dragform/form";
+import { getUncommonTable } from '@/utils/other';
+import OptionsEdit from '@/components/kFormDesign/OptionsEdit.vue'
 const Input = pluginManager.getComponent("input").component;
 const InputNumber = pluginManager.getComponent("number").component;
 const Rate = pluginManager.getComponent("rate").component;
@@ -551,7 +667,8 @@ export default {
     RadioItem,
     RadioButton,
     Textarea,
-    Select
+    Select,
+    OptionsEdit
   },
   data() {
     return {
@@ -628,13 +745,26 @@ export default {
           value: "9pt",
           label: "小五"
         }
-      ]
+      ],
+      formList:{
+        formName:[],
+        listName:[],
+        tableName:""
+      },
+      tableShowData: {
+        isShow: false,
+        columns:[]
+      }
     };
   },
   computed: {
     options() {
+      if(!this.selectItem.tableName){
+        this.formList.listName = [];
+      }
       return this.selectItem.options || {};
-    }
+    },
+
   },
   props: {
     selectItem: {
@@ -644,16 +774,125 @@ export default {
     hideModel: {
       type: Boolean,
       default: false
-    }
+    },
+    
   },
   methods: {
+    // 删除一列
+    handleDelete(index){
+      this.selectItem.columns.splice(index,1)
+    },
+    // 添加一列
+    addOneColumn(){
+      this.selectItem.columns.push({
+        label:'',
+        prop:'',
+      })
+    },
+    // 编辑tableShow的列
+    editTableColumns() {
+      if(!this.selectItem.tableName){
+        this.$message.warning('请先选择表名')
+        return
+      }
+      console.log(this.selectItem)
+      this.tableShowData.isShow = true;
+      
+    },
+    seeSelectItem() {
+      console.log('selectItem',this.selectItem);
+    },
+    // 列名变化回调
+    changeModel() {
+      console.log('列',this.selectItem);
+    },
+    setDynamicKey(sqlData) {
+      console.log('sqlData',sqlData);
+      this.options.dynamicKey = sqlData.dynamicName;
+      this.options.sqlData=JSON.parse(JSON.stringify(sqlData))
+      // console.log(this.options.dynamicKey,key,111);
+    },
     /**
      * 判断是否已定义
      * @param {*} value
      */
     isDefined(value) {
+
       return typeof value !== "undefined";
+    },
+    // 判断是否需要列名
+    isNeedColumn(value) {
+      console.log(value.type);
+      let notNeedColumnList = ['batch', 'selectInputList','tableShow'];
+      if (notNeedColumnList.includes(value.type)) {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    async getFormList() {
+      let par = {
+        ... this.$store.state.user.dataSource
+      }
+      let res = await getUncommonTable()
+      this.formList.formName=res
+      // console.log(res);
+      // getFormName(par).then(res=>{
+      //   this.formList.formName = res.data
+      // });
+    },
+    getListName(item = {}) {
+      let notNeedColumnList = ['batch', 'selectInputList'];
+      let flag=notNeedColumnList.includes(item.type)
+      if (flag) {
+      item.model='batch.'+item.tableName
+      } else if(item.type){
+        item.model='tableShow.'+item.tableName
+      }else {
+      item.model=''
     }
-  }
+      let par2 = {
+        ... this.$store.state.user.dataSource,
+        'tableName':this.selectItem.tableName
+      }
+      
+      getListName(par2).then(res=>{
+        this.formList.listName = res.map(item => {
+          return {
+            label: item.fieldName,
+            value: item.fieldName,
+            fieldDescription:item.fieldDescription
+          }
+        });
+      })
+    }
+  },
+  mounted() {
+    this.getFormList();
+    console.log('this.selectItem',this.selectItem);
+    if (this.selectItem.tableName) {
+      this.getListName()
+    }
+  },
+  
 };
 </script>
+
+<style lang="scss" scoped>
+.dynamic-wrap{
+  display: flex !important;
+  align-items: center;
+
+}
+.discribe{
+  display: block;
+  max-width: 200px;
+  white-space:nowrap;
+  overflow:hidden;
+  text-overflow:ellipsis;
+}
+.table-wrap{
+  max-height: 500px;
+  overflow-y: scroll
+}
+</style>

+ 145 - 4
zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/formProperties.vue

@@ -1,7 +1,79 @@
 <template>
   <div class="properties-centent kk-checkbox">
     <div class="properties-body">
-      <a-form>
+      <el-form :rules="rules" :model="config" ref="config" class="demo-ruleForm" >
+        <!-- 新增的 start -->
+        <el-form-item label="表单名称" prop="formName">
+            <el-input 
+              style="width:100%;" 
+              v-model="config.formName" />
+        </el-form-item>
+        <el-form-item label="表单别名" prop="nickFormName">
+            <el-input 
+              style="width:100%;" 
+              v-model="config.nickFormName" />
+        </el-form-item>
+
+        <a-form-item label="绑定表名称(主表)">
+            <!-- <Input style="width:100%;" v-model="config.mainTableName" /> -->
+            <el-select v-model="config.mainTableName" placeholder="请选择实际操作表" clearable filterable>
+            <el-option
+              v-for="item in tableList"
+              :key="item.tableName"
+              :label="item.tableComment"
+              :value="item.tableName">
+              <span class="discribe" style="float: left">{{ item.tableComment }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.tableName }}</span>
+            </el-option>
+          </el-select>
+        </a-form-item>
+        <!-- 拖拽表格 -->
+        <!-- <a-form-item
+          label="关联的自定义表格"
+        >
+          <el-select v-model="config.tdId" @change="relationTableChange" clearable filterable placeholder="请选择拖拽table">
+            <el-option
+              v-for="item in dragTableList"
+              :key="item.tId"
+              :label="item.dtName"
+              :value="item.tId">
+            </el-option>
+          </el-select>
+        </a-form-item> -->
+        <!-- 表单类型 -->
+        <a-form-item
+          label="表单类型"
+        >
+          <el-select v-model="config.formType" clearable filterable placeholder="请选择表单类型">
+            <el-option
+              v-for="item in formTypeList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+              <!-- <span v-show="false">{{ $sessionStorage.setItem('sqlKey',item.sqlKey) }}</span> -->
+            </el-option>
+          </el-select>
+        </a-form-item>
+        <a-form-item label="表单描述">
+            <Textarea v-model="config.formDescription" />
+        </a-form-item>
+        <a-form-item label="表单sql">
+            <Textarea v-model="config.formSQL" />
+        </a-form-item>
+        <a-form-item label="表单节点id">
+            <!-- <Input style="width:100%;" v-model="config.mainTableName" /> -->
+            <el-select v-model="config.formNodeId" placeholder="请选择">
+            <el-option
+              v-for="item in []"
+              :key="item.tableName"
+              :label="item.tableComment"
+              :value="item.tableName">
+              <span style="float: left">{{ item.tableComment }}</span>
+      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.tableName }}</span>
+            </el-option>
+          </el-select>
+        </a-form-item>
+        <!-- 新增的 end -->
         <a-form-item label="表单布局">
           <Radio buttonStyle="solid" v-model="config.layout">
             <RadioButton value="horizontal">水平</RadioButton>
@@ -21,6 +93,7 @@
         >
           <InputNumber v-model="config.labelWidth" />
         </a-form-item>
+        
         <a-form-item label="labelCol" v-show="config.labelLayout !== 'flex'">
           <div class="change-col-box">
             <Slider
@@ -96,9 +169,10 @@
         <a-form-item label="提示">
           实际预览效果请点击预览查看
         </a-form-item>
-      </a-form>
+      </el-form>
     </div>
   </div>
+
 </template>
 <script>
 /*
@@ -106,23 +180,57 @@
  * date 2019-11-20
  * description 表单属性设置面板组件
  */
+import {getUncommonTable} from '@/utils/other'
 import kCheckbox from "../../KCheckbox/index.vue";
 import { pluginManager } from "../../../utils/index";
+import {dragTableList} from '@/api/dragform/tableList.js'
 const InputNumber = pluginManager.getComponent("number").component;
+const Input = pluginManager.getComponent("input").component;
 const Radio = pluginManager.getComponent("radio").component;
 const RadioButton = pluginManager.getComponent("radioButton").component;
 const Textarea = pluginManager.getComponent("textarea").component;
 const Slider = pluginManager.getComponent("aSlider").component;
+const Select=pluginManager.getComponent("select").component
 
 export default {
   name: "formProperties",
+  data() {
+    return {
+      dragTableList: [],
+      tableList:[],
+      // ruleForm: {
+      //   formname: '',
+      //   nickformname: '',
+      // },
+      rules: {
+        formName: [
+            { required: true, message: '请输入表单名称', trigger: 'blur' },
+          ],
+        nickFormName: [
+            { required: true, message: '请输入表单别名', trigger: 'blur' }
+          ],
+      },
+        formTypeList: [
+        {
+          value: '1',
+            label:'普通表单',
+        },
+        {
+          value: '2',
+            label:'动态表格表单',
+          }
+        ],
+    }
+  },
   components: {
     kCheckbox,
     InputNumber,
     Radio,
+    Input,
     RadioButton,
     Textarea,
-    Slider
+    Slider,
+    Select
   },
   props: {
     config: {
@@ -135,12 +243,45 @@ export default {
     }
   },
   methods: {
+    // 获取所有非基础表
+    async getUncommonTable() {
+      let res = await getUncommonTable()
+      this.tableList = res;
+    },
     handleChangeCol(e) {
       this.config.labelCol.xs = this.config.labelCol.sm = this.config.labelCol.md = this.config.labelCol.lg = this.config.labelCol.xl = this.config.labelCol.xxl = e;
 
       this.config.wrapperCol.xs = this.config.wrapperCol.sm = this.config.wrapperCol.md = this.config.wrapperCol.lg = this.config.wrapperCol.xl = this.config.wrapperCol.xxl =
         24 - e;
-    }
+    },
+    relationTableChange(tId) {
+      // if (!tId) {
+      //   return 
+      // }
+      let sqlKey = this.dragTableList.filter(item => item.tId == tId)[0]?.sqlKey;
+sessionStorage.setItem('sqlKey',sqlKey)
   }
+  },
+  async created () {
+    let res = await dragTableList()
+    this.getUncommonTable()
+    if (res.code == 200) {
+      this.dragTableList=res.data
+    } else {
+      this.$message.error("请选择数据表");
+      this.$message.error(res.msg)
+    }
+  },
+  
 };
 </script>
+
+<style lang="scss" scoped>
+.discribe{
+  display: block;
+  max-width: 200px;
+  white-space:nowrap;
+  overflow:hidden;
+  text-overflow:ellipsis;
+}
+</style>

+ 52 - 0
zkqy-ui/node_modules/k-form-design/packages/components/KFormDesign/module/layoutItem.vue

@@ -476,6 +476,58 @@
       </div>
     </template>
     <!-- 表格布局 end -->
+    <!-- 表格展示  start -->
+    <template v-else-if="record.type === 'tableShow'">
+      <div
+        class="table-box"
+        :class="{ active: record.key === selectItem.key }"
+        @click.stop="handleSelectItem(record)"
+        style="overflow: scroll;"
+
+      >
+        <table
+          class="table-layout kk-table-9136076486841527"
+          :class="{
+            bright: record.options.bright,
+            small: record.options.small,
+            bordered: record.options.bordered
+          }"
+          
+        >
+          <tr>
+            <td>
+              <input type="checkbox"></input>
+            </td>
+            <td
+              class="table-td"
+              v-for="(item, idnex) in record.columns"
+              :key="idnex"
+              style="padding: 0 10px;overflow:hidden;"
+              @contextmenu.prevent="
+                $emit('handleShowRightMenu', $event, record, trIndex, tdIndex)
+              "
+            >
+            <span style="display:block;white-space: nowrap;line-height:45px;">{{ item.label }}</span>
+            </td>
+          </tr>
+        </table>
+        <div
+          class="copy"
+          :class="record.key === selectItem.key ? 'active' : 'unactivated'"
+          @click.stop="$emit('handleCopy')"
+        >
+          <a-icon type="copy" />
+        </div>
+        <div
+          class="delete"
+          :class="record.key === selectItem.key ? 'active' : 'unactivated'"
+          @click.stop="$emit('handleDelete')"
+        >
+          <a-icon type="delete" />
+        </div>
+      </div>
+    </template>
+    <!-- 表格展示  end -->
     <template v-else>
       <formNode
         :key="record.key"

+ 15 - 1
zkqy-ui/node_modules/k-form-design/packages/components/KFormItem/index.vue

@@ -11,6 +11,7 @@
     v-bind="getComponentProps"
     @hook:mounted="childMounted"
     :is="componentItem"
+    @change="handleChange"
   ></component>
   <!-- 可隐藏label -->
   <a-form-item
@@ -73,8 +74,10 @@
  * date 2019-11-20
  */
 import { pluginManager, lazyLoadTick } from "../../utils/index";
+import textShow from '../KTextShow/index.js'
+import tableShow from '../KTableShow/index.js'
 const _ = require("lodash/object");
-const ComponentArray = pluginManager.getComponents();
+let ComponentArray = pluginManager.getComponents();
 
 export default {
   name: "KFormItem",
@@ -192,6 +195,15 @@ export default {
      */
 
     componentItem() {
+      // console.log(ComponentArray);
+      ComponentArray.textShow = {
+        component: textShow,
+        bindModel:'value'
+      }
+      ComponentArray.tableShow={
+        component: tableShow,
+        bindModel:'value'
+      }
       return ComponentArray[this.record.type].component;
     },
     componentOption() {
@@ -219,6 +231,8 @@ export default {
       if (e && e.target) {
         value = e.target.value;
       }
+      console.log(this.record);
+      console.log(e,this.record.model);
       // 传递change事件
       this.$emit("change", value, this.record.model);
     },

+ 5 - 0
zkqy-ui/node_modules/k-form-design/packages/components/KFormPreview/index.vue

@@ -64,15 +64,20 @@ export default {
      * 手动验证获取表单数据
      */
     async handleGetData() {
+      // 获取表单数据
       this.$refs.KFormBuild.getData()
         .then(res => {
           console.log(res, "获取数据成功");
+          // 获取自定义  表格  勾选数据
+          let selectData= this.$refs.KFormBuild.getselectData()
           this.$refs.jsonModel.jsonData = res;
           this.$refs.jsonModel.visible = true;
         })
         .catch(err => {
           console.log(err, "获取数据失败");
         });
+      
+      
     },
     /**
      * 监听表单change 事件

+ 1 - 0
zkqy-ui/node_modules/k-form-design/packages/components/KSlider/KSlider.vue

@@ -26,6 +26,7 @@ export default {
         return this.value;
       },
       set(e) {
+        console.log(e);
         this.$emit("change", e);
       }
     }

+ 2 - 3
zkqy-ui/node_modules/k-form-design/packages/mini.js

@@ -43,7 +43,7 @@ function setFormDesignConfig(config) {
     // 配置uploadFile默认上传地址
     const uploadFile = nodeSchema.getSchemaByType("uploadFile");
     uploadFile.options.action =
-      config.uploadFile || "https://examples.epicjs.cn/epic-mock/common/upload";
+      config.uploadFile || "http://cdn.kcz66.com/uploadFile.txt";
 
     // 配置uploadFile默认额外参数
     uploadFile.options.data = JSON.stringify(config.uploadFileData || {});
@@ -58,8 +58,7 @@ function setFormDesignConfig(config) {
     // 配置uploadImage默认上传地址
     const uploadImg = nodeSchema.getSchemaByType("uploadImg");
     uploadImg.options.action =
-      config.uploadImage ||
-      "https://examples.epicjs.cn/epic-mock/common/upload";
+      config.uploadImage || "http://cdn.kcz66.com/upload-img.txt";
     // 配置uploadImage默认额外参数
     uploadImg.options.data = JSON.stringify(config.uploadImageData || {});
     // 配置uploadFile默认name

+ 1 - 0
zkqy-ui/node_modules/k-form-design/packages/utils/NodeSchema.js

@@ -30,6 +30,7 @@ class NodeSchema {
         "button",
         "alert",
         "text",
+        'textShow',
         "html"
       ]
     },

+ 5 - 5
zkqy-ui/node_modules/k-form-design/packages/utils/index.js

@@ -1,11 +1,11 @@
 // 发布npm(npm publish 时) 需要切换到这个
-// export { pluginManager, revoke, nodeSchema, lazyLoadTick } from "k-form-design";
+export { pluginManager, revoke, nodeSchema, lazyLoadTick } from "k-form-design";
 
 // 本地测试
-export { pluginManager } from "./PluginManager";
-export { revoke } from "./Revoke";
-export { nodeSchema } from "./NodeSchema";
-export { lazyLoadTick } from "./LazyLoadTick";
+// export { pluginManager } from "./PluginManager";
+// export { revoke } from "./Revoke";
+// export { nodeSchema } from "./NodeSchema";
+// export { lazyLoadTick } from "./LazyLoadTick";
 
 /**
  * 生成一个用不重复的ID

+ 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 - 0
zkqy-ui/src/components/Breadcrumb/index.vue

@@ -35,6 +35,7 @@ export default {
       const first = matched[0]
 
       if (!this.isDashboard(first)) {
+        // this.$t('page.index')
         matched = [{ path: '/index', meta: { title: '首页' }}].concat(matched)
       }
 

+ 7 - 6
zkqy-ui/src/layout/components/TagsView/index.vue

@@ -31,22 +31,22 @@
       class="contextmenu"
     >
       <li @click="refreshSelectedTag(selectedTag)">
-        <i class="el-icon-refresh-right"></i> 刷新页面
+        <i class="el-icon-refresh-right"></i> {{ $t('tagsView.refresh') }}
       </li>
       <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">
-        <i class="el-icon-close"></i> 关闭当前
+        <i class="el-icon-close"></i> {{ $t('tagsView.closeCurrent') }}
       </li>
       <li @click="closeOthersTags">
-        <i class="el-icon-circle-close"></i> 关闭其他
+        <i class="el-icon-circle-close"></i> {{ $t('tagsView.closeOthers') }}
       </li>
       <li v-if="!isFirstView()" @click="closeLeftTags">
-        <i class="el-icon-back"></i> 关闭左侧
+        <i class="el-icon-back"></i> {{ $t('tagsView.closeLeft') }}
       </li>
       <li v-if="!isLastView()" @click="closeRightTags">
-        <i class="el-icon-right"></i> 关闭右侧
+        <i class="el-icon-right"></i> {{ $t('tagsView.closeRight') }}
       </li>
       <li @click="closeAllTags(selectedTag)">
-        <i class="el-icon-circle-close"></i> 全部关闭
+        <i class="el-icon-circle-close"></i> {{ $t('tagsView.closeAll') }}
       </li>
     </ul>
   </div>
@@ -158,6 +158,7 @@ export default {
           this.$store.dispatch("tagsView/addVisitedView", tag);
         }
       }
+    
     },
     addTags() {
       const { name } = this.$route;

+ 53 - 30
zkqy-ui/src/layout/index.vue

@@ -7,14 +7,18 @@
           <div class="logo-title">
             <img v-if="logo" :src="logo" alt="" class="imgg" />
             <!-- <img v-else src="../assets/images/mes412.svg" alt="" class="imgg" /> -->
-            <span class="title">{{ title || "工业应用引擎" }}</span>
+            <span class="title">{{ title || $t('login.title') }}</span>
           </div>
         </el-col>
         <el-col :span="4" :offset="8">
+          <div class="right-menu">
+          <div class="set-language"><lang-select /></div>
+
           <el-dropdown
-            class="avatar-container right-menu-item hover-effect"
-            trigger="click"
+              class="avatar-container right-menu-item hover-effect"
+              trigger="click"
           >
+
             <div class="avatar-wrapper">
               <span style="">
                 <span class="jianbiase">{{ username || "默认用户" }}</span>
@@ -24,39 +28,40 @@
             </div>
             <el-dropdown-menu slot="dropdown" style="margin-top: -20px">
               <router-link to="/user/profile">
-                <el-dropdown-item>个人中心</el-dropdown-item>
+                <el-dropdown-item>{{ $t('user.center') }}</el-dropdown-item>
               </router-link>
               <!-- <el-dropdown-item @click.native="setting = true">
                 <span>布局设置</span>
               </el-dropdown-item> -->
               <el-dropdown-item divided @click.native="logout">
-                <span>退出登录</span>
+                <span>{{ $t('user.logout') }}</span>
               </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
+        </div>
         </el-col>
       </el-row>
     </div>
     <div style="height: 100px"></div>
     <div
-      :class="classObj"
-      class="app-wrapper"
-      :style="{ '--current-color': theme }"
+        :class="classObj"
+        class="app-wrapper"
+        :style="{ '--current-color': theme }"
     >
       <div
-        v-if="device === 'mobile' && sidebar.opened"
-        class="drawer-bg"
-        @click="handleClickOutside"
+          v-if="device === 'mobile' && sidebar.opened"
+          class="drawer-bg"
+          @click="handleClickOutside"
       />
       <sidebar
-        v-if="!sidebar.hide"
-        class="sidebar-container"
-        :style="sidebar.opened ? '' : 'width:50px !important'"
+          v-if="!sidebar.hide"
+          class="sidebar-container"
+          :style="sidebar.opened ? '' : 'width:50px !important'"
       />
       <div
-        :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }"
-        class="main-container"
-        :style="sidebar.opened ? '' : 'margin-left: 50px !important'"
+          :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }"
+          class="main-container"
+          :style="sidebar.opened ? '' : 'margin-left: 50px !important'"
       >
         <div :class="{ 'fixed-header': fixedHeader }">
           <!-- <navbar /> -->
@@ -83,6 +88,8 @@ import mecLogoLogin from "@/assets/images/mec-logo-login.svg";
 import mecosLogo1 from "@/assets/images/mecosLogo1.svg";
 import comp from "@/assets/images/comp.svg";
 import mes412 from "@/assets/images/mes412.svg";
+import i18n from '@/lang/index.js'
+import LangSelect from '@/components/LangSelect'
 
 export default {
   name: "Layout",
@@ -93,6 +100,7 @@ export default {
     Settings,
     Sidebar,
     TagsView,
+    LangSelect,
   },
   data() {
     return {
@@ -139,19 +147,20 @@ export default {
   },
   methods: {
     async logout() {
-      this.$confirm("确定注销并退出系统吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
+      // this.tenantInfo.tenantClientLoginUrl 退出登录后跳转到登录页面
+      this.$alert( this.$t('logout.message'), this.$t('logout.alarm'), {
+        confirmButtonText: this.$t('logout.confirm'),
+        cancelButtonText: '取消',
         type: "warning",
       })
-        .then(() => {
-          // let tenantCode = this.tenantInfo.tenantCode;
-          this.$store.dispatch("LogOut");
-          //   .then(() => {
-          //   this.$router.push({path: "/login", query: {tenantCode: tenantCode}});
-          // });
-        })
-        .catch(() => {});
+          .then(() => {
+            // let tenantCode = this.tenantInfo.tenantCode;
+            this.$store.dispatch("LogOut");
+            //   .then(() => {
+            //   this.$router.push({path: "/login", query: {tenantCode: tenantCode}});
+            // });
+          })
+          .catch(() => {});
     },
     handleClickOutside() {
       this.$store.dispatch("app/closeSideBar", { withoutAnimation: false });
@@ -159,7 +168,7 @@ export default {
     getlogo() {
       let logo = sessionStorage.getItem("logo");
       // this.title = sessionStorage.getItem("title") || "智能制造平台"; //工联院
-      this.title = sessionStorage.getItem("title") || "工业应用引擎";
+      this.title = sessionStorage.getItem("title") || this.$t('login.title');
       if (logo) {
         this.logo = process.env.VUE_APP_BASE_API + logo;
       } else {
@@ -173,7 +182,12 @@ export default {
   mounted() {
     var user = sessionStorage.getItem("sessionObj");
     var user = JSON.parse(user);
-    this.userName = JSON.parse(user.data()).username;
+    console.log('[user]',JSON.parse(user.data))
+    if (typeof JSON.parse(user.data) === 'function') {
+      this.userName = JSON.parse(user.data()).username;
+  }else{
+      this.userName = JSON.parse(user.data).username;
+  }
     // this.userName =JSON.parse(user.data).databaseName;
   },
   created() {
@@ -362,4 +376,13 @@ export default {
 .mobile .fixed-header {
   width: 100%;
 }
+.set-language {
+  flex-shrink: 0; /* 防止语言选择器被压缩 */
+  margin-top: 18px;
+}
+.right-menu{
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
 </style>

+ 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

+ 5 - 3
zkqy-ui/src/router/index.js

@@ -3,6 +3,7 @@ import Router from 'vue-router'
 import { getQueryParams } from '@/utils/other'
 // import { name } from '@/store/getters'
 import store from '@/store'
+import i18n from '@/lang/index.js'
 
 Vue.use(Router)
 
@@ -341,7 +342,8 @@ export const constantRoutes = [
           }
         },
         name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
+        meta: {title: i18n.t('page.index')
+          , icon: 'dashboard', affix: true }
       },
       // {
       //   path: 'indexOld',
@@ -377,7 +379,7 @@ export const constantRoutes = [
         path: 'profile',
         component: () => import('@/views/system/user/profile/index'),
         name: 'Profile',
-        meta: { title: '个人中心', icon: 'user' }
+        meta: { title: i18n.t('user.center'), icon: 'user' }
       }
     ]
   },
@@ -426,7 +428,7 @@ export const dynamicRoutes = [
         path: 'fromModel/:index',
         component: () => import('@/views/system/fromModel/index'),
         // component: (resolve) => require(['@/views/system/fromModel/index'], resolve),
-        name: 'fromModel',  
+        name: 'fromModel',
         meta: { title: '表单建模', activeMenu: '/system/fromModel/index' }
       },
       // {

+ 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')
   },

+ 1 - 31
zkqy-ui/src/store/modules/permission.js

@@ -36,37 +36,7 @@ const permission = {
       return new Promise(resolve => {
         // 向后端请求路由数据
         getRouters().then(res => {
-          // console.log('[sdata]',sdata)
-          // 在这里处理sdata,查找path为"/system/fromModel/index"的路由,并添加子路由
-          // res.data.forEach(route => {
-          //   if (route.path === '/system/fromModel/index') {
-          //     route.children = route.children || []; // 确保children存在
-          //     route.children.push({
-          //       component: "treeTable/index",
-          //       hidden: false,
-          //       meta: {
-          //         title: "c",
-          //         icon: "tree",
-          //         noCache: false,
-          //         link: null
-          //       },
-          //       name: "TreeTable",
-          //       path: "treeTable"
-          //     });
-          //     route.children.push({
-          //       component: "treeTableMange/index",
-          //       hidden: true,
-          //       meta: {
-          //         title: "树形表格编辑",
-          //         icon: "tree",
-          //         noCache: false,
-          //         link: null
-          //       },
-          //       name: "TreeTableMange",
-          //       path: "treeTableMange"
-          //     });
-          //   }
-          // });
+          console.log('[res.data]',res.data)
           const sdata = JSON.parse(JSON.stringify(res.data))
           const rdata = JSON.parse(JSON.stringify(res.data))
           const sidebarRoutes = filterAsyncRouter(sdata)

+ 13 - 1
zkqy-ui/src/utils/request.js

@@ -23,6 +23,18 @@ const service = axios.create({
 
 // request拦截器
 service.interceptors.request.use(config => {
+  // 获取cookie中的language值,如果没有则默认为zh_CN
+  let language = 'zh_CN'
+  if (document.cookie.includes('language=')) {
+    const cookieValue = document.cookie
+      .split('; ')
+      .find(row => row.startsWith('language='))
+      .split('=')[1]
+    if (cookieValue) {
+      language = cookieValue
+    }
+  }
+  config.headers['language'] = language
   // 是否需要设置 token
   const isToken = (config.headers || {}).isToken === false
   // 是否需要防止数据重复提交
@@ -150,7 +162,7 @@ service.interceptors.response.use(res => {
 // 通用下载方法
 export function download(url, params, filename, config) {
   downloadLoadingInstance = Loading.service({
-    text: "正在下载数据,请稍候",
+    text:  this.$t('settings.downloadedLoading'),
     spinner: "el-icon-loading",
     background: "rgba(0, 0, 0, 0.7)",
   })

+ 55 - 38
zkqy-ui/src/views/adminLogin.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="login">
     <div class="page-description">
-      <span class="description">智能制造</span>
-      <span class="description">万物互联</span>
-      <span class="sub-description"> 登录并开始管理您的智能引擎账户 </span>
+      <span class="description">{{ $t('login.smartManufacturing') }}</span>
+      <span class="description">{{ $t('login.internetOfThings') }}</span>
+      <span class="sub-description">{{ $t('login.loginDescription') }}</span>
     </div>
     <el-form
       ref="loginForm"
@@ -13,47 +13,48 @@
     >
       <el-row>
         <el-col :span="12" class="comlogo"></el-col>
-        <el-col :span="12">
-          <div class="grid-content bg-purple-dark title">
-            · 工业应用引擎
-            <!-- 智能制造平台 工联院-->
-            <!-- 工业应用引擎 -->
+        <el-col :span="12" class="right-col">
+          <div class="grid-content bg-purple-dark title flexClass">
+            <div class="title-text">{{$t('login.title') }}</div>
+            <div class="set-language"><lang-select /></div>
           </div>
         </el-col>
       </el-row>
       <el-row class="rowww">
-        <el-col :span="12" class="text" prop="username">用户名</el-col>
+        <!--        {{$t('login.title')}}-->
+        <el-col :span="12" class="text" prop="username">{{$t('login.username')}}</el-col>
         <el-input
-          v-model="loginForm.username"
-          type="text"
-          auto-complete="off"
-          placeholder="账号"
-          class="inputt"
+            v-model="loginForm.username"
+            type="text"
+            auto-complete="off"
+            :placeholder="$t('login.username')"
+            class="input"
+            @blur="handleBlur"
         />
       </el-row>
       <el-row class="roww">
-        <el-col :span="12" class="text" prop="password">密码</el-col>
+        <el-col :span="12" class="text" prop="password">{{$t('login.password')}}</el-col>
         <el-input
-          v-model="loginForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleLogin"
-          show-password
-          class="inputt"
+            v-model="loginForm.password"
+            type="password"
+            auto-complete="off"
+            :placeholder="$t('login.password')"
+            @keyup.enter.native="handleLogin"
+            show-password
+            class="inputt"
         >
         </el-input>
       </el-row>
       <el-row class="roww">
         <el-row>
-          <el-col class="text" prop="code">验证码</el-col>
+          <el-col class="text" prop="code">{{$t('login.code')}}</el-col>
         </el-row>
         <el-row>
           <el-col :span="18">
             <el-input
               v-model="loginForm.code"
               auto-complete="off"
-              placeholder="验证码"
+              :placeholder="$t('login.code')"
               @keyup.enter.native="handleLogin"
               class="inputt"
             >
@@ -72,17 +73,17 @@
           <img :src="codeUrl" @click="getCode" class="login-code-img" />
         </div> -->
         <el-checkbox v-model="loginForm.rememberMe" class="aaa"
-          >在这个设备上记住我</el-checkbox
-        >
+        >{{$t('login.rememberMe')}}
+        </el-checkbox>
       </el-row>
 
       <el-row>
         <el-col
-          class="logg"
-          :loading="loading"
-          @click.native.prevent="handleLogin"
-          >登录</el-col
-        >
+            class="logg"
+            :loading="loading"
+            @click.native.prevent="handleLogin"
+        >{{$t('login.logIn')}}
+        </el-col>
       </el-row>
     </el-form>
 
@@ -103,7 +104,7 @@
           placeholder="账号"
           show-password
         >
-          
+
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
@@ -116,7 +117,7 @@
           @keyup.enter.native="handleLogin"
           show-password
         >
-         
+
         </el-input>
       </el-form-item>
 
@@ -158,7 +159,7 @@
         </div>
       </el-form-item>
     </el-form>
-  
+
     <div class="el-login-footer">
       <span>Copyright © 2018-2023 zkqy.vip All Rights Reserved.</span>
     </div> -->
@@ -170,10 +171,12 @@ import { getCodeImg } 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",
-  data() {
+  components: { LangSelect },
+    data() {
     return {
       codeUrl: "",
       loginForm: {
@@ -187,12 +190,12 @@ export default {
       },
       loginRules: {
         username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" },
+          { required: true, trigger: "blur", message: this.$t('login.pleaseEnterUsername') },
         ],
         password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" },
+          { required: true, trigger: "blur", message: this.$t('login.pleaseEnterPassword') },
         ],
-        code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
+        code: [{ required: true, trigger: "blur", message: this.$t('login.pleaseEnterCode') }],
       },
       loading: true,
       // 验证码开关
@@ -213,6 +216,7 @@ export default {
   created() {
     this.getCode();
     this.getCookie();
+    this.$i18n.locale =  Cookies.get('language') || 'zh_CN'
   },
   methods: {
     forgetEvent() {},
@@ -413,7 +417,20 @@ export default {
   vertical-align: top;
   float: left;
 }
+.flexClass {
+  display: flex;
+  align-items: center;
+  gap: 20px; /* 控制标题和语言选择器之间的间距 */
+  width: 100%; /* 确保容器占满父元素 */
+}
 
+.title-text {
+  white-space: nowrap; /* 防止标题换行 */
+}
+
+.set-language {
+  flex-shrink: 0; /* 防止语言选择器被压缩 */
+}
 .login-form {
   margin-left: 30%;
   margin-top: 48px;

+ 0 - 1
zkqy-ui/src/views/asEditor/App.vue

@@ -44,7 +44,6 @@ export default {
   methods: {
     // 刷新页面
     reload() {
-      console.log(111);
       this.isRouterAlive = false
       this.$nextTick(() => {
         this.isRouterAlive = true

+ 2 - 2
zkqy-ui/src/views/asEditor/components/realTimeView/index.vue

@@ -7,7 +7,7 @@
         ref="iframe"
         class="screen"
         :scrolling="false"
-        :src="`http://192.168.110.83:8088/system/mobilePageData/ + ${this.val.id}`"
+        :src="`http://192.168.10.103:8088/system/mobilePageData/ + ${this.val.id}`"
         @load="load"
       ></iframe>
       <van-loading v-if="loading" size="24px" vertical>加载中</van-loading>
@@ -39,7 +39,7 @@ export default {
     load() {
       this.loading = false
       console.log(this.val.id,11111111);
-      this.$refs["iframe"].contentWindow.postMessage(this.val, `http://192.168.110.83:8088/system/mobilePageData/+ ${this.val.id}`);
+      this.$refs["iframe"].contentWindow.postMessage(this.val, `http://192.168.10.103:8088/system/mobilePageData/+ ${this.val.id}`);
     },
   },
 }

+ 3 - 3
zkqy-ui/src/views/asEditor/components/uploadImg/index.vue

@@ -18,8 +18,8 @@
         name="file"
         :action="baseupload"
         list-type="picture-card"
-        :limit="1"  
-        :headers="headers"   
+        :limit="1"
+        :headers="headers"
         :on-success="onSuccess"
         :with-credentials="true"
         :on-error="uploadError"
@@ -148,7 +148,7 @@ export default {
       const formData = new FormData();
       formData.append('file', file);
 
-      axios.post('http://192.168.110.83:8066/common/upload', formData, {
+      axios.post('http://192.168.10.103:8066/common/upload', formData, {
         headers: {
           Authorization: "Bearer " + getToken(),
         },

+ 42 - 48
zkqy-ui/src/views/bpmprocess/index.vue

@@ -8,23 +8,23 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="流程名称:" prop="processName">
+      <el-form-item :label="$t('bpmprocess.processName')" prop="processName">
         <el-input
           v-model="queryParams.processName"
-          placeholder="请输入流程名称"
+          :placeholder="$t('bpmprocess.pleaseEnterProcessName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="流程别名:" prop="processKey">
+      <el-form-item :label="$t('bpmprocess.processKey')" prop="processKey">
         <el-input
           v-model="queryParams.processKey"
-          placeholder="请输入流程别名"
+          :placeholder="$t('bpmprocess.pleaseEnterProcessKey')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="流程类型:" prop="processType">
+      <el-form-item :label="$t('bpmprocess.processType')" prop="processType">
         <!-- <el-input
           v-model="queryParams.processType"
           placeholder="请输入流程别名"
@@ -35,13 +35,13 @@
           @change="handleQuery"
           v-model="queryParams.processType"
           label="0"
-          >生产流程</el-radio
+          >{{ $t('bpmprocess.productionProcess') }}</el-radio
         >
         <el-radio
           @change="handleQuery"
           v-model="queryParams.processType"
           label="1"
-          >审批流程</el-radio
+          >{{ $t('bpmprocess.approvalProcess') }}</el-radio
         >
       </el-form-item>
       <!-- <el-form-item
@@ -95,10 +95,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索
+          >{{ $t('normal.search') }}
         </el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置
+          >{{ $t('normal.reset') }}
         </el-button>
       </el-form-item>
     </el-form>
@@ -112,7 +112,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:process:add']"
-          >新增
+          >{{ $t('normal.insert') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -124,7 +124,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:process:remove']"
-          >删除
+          >{{ $t('normal.delete') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -136,7 +136,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:process:export']"
-          >导出所有
+          >{{ $t('bpmprocess.exportAll') }}
         </el-button>
         <ExcelDownLoad
           v-else
@@ -153,7 +153,7 @@
           size="mini"
           @click="handleFileExport"
           v-hasPermi="['system:process:export']"
-          >导出流程文件
+          >{{ $t('bpmprocess.exportProcessFile') }}
         </el-button>
       </el-col>
       <right-toolbar
@@ -169,15 +169,15 @@
       ref="tableRef"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="主键" align="center" prop="processId" />
-      <el-table-column label="流程名称" align="center" prop="processName">
+      <el-table-column :label="$t('bpmprocess.primaryKey')" align="center" prop="processId" />
+      <el-table-column :label="$t('bpmprocess.processName')" align="center" prop="processName">
         <template slot-scope="scope">
           <span class="process_name" @click="prviewHandle(scope.row)">{{
             scope.row.processName
           }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="流程别名" align="center" prop="processKey" />
+      <el-table-column :label="$t('bpmprocess.processKey')" align="center" prop="processKey" />
       <!-- <el-table-column label="流程状态" align="center" prop="processOpneState">
         <template slot-scope="scope">
           <span>{{
@@ -185,7 +185,7 @@
           }}</span>
         </template>
       </el-table-column> -->
-      <el-table-column label="流程类型" align="center" prop="processType">
+      <el-table-column :label="$t('bpmprocess.processType')" align="center" prop="processType">
         <template slot-scope="scope">
           <span>{{
             getDictLabel(scope.row.processType, dict.type.bpm_type)
@@ -205,7 +205,7 @@
         </template>
       </el-table-column> -->
       <el-table-column
-        label="启动事件类型"
+        :label="$t('bpmprocess.startEventType')"
         align="center"
         prop="startEventType"
       >
@@ -219,8 +219,8 @@
         </template>
       </el-table-column>
 
-      <el-table-column label="版本注释" align="center" prop="note" />
-      <el-table-column label="版本状态" align="center" prop="processVersion">
+      <el-table-column :label="$t('bpmprocess.versionNote')" align="center" prop="note" />
+      <el-table-column :label="$t('bpmprocess.versionStatus')" align="center" prop="processVersion">
         <template slot-scope="scope">
           <span
             style="color: #337ab7; cursor: pointer"
@@ -237,16 +237,16 @@
         align="center"
         prop="processXmlPath"
       /> -->
-      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column :label="$t('normal.remark')" align="center" prop="remark" />
       <el-table-column
-        label="操作"
+        :label="$t('normal.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('normal.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -256,7 +256,7 @@
                   icon="el-icon-edit"
                   @click="backupProcess(scope.row)"
                   v-hasPermi="['system:user:edit']"
-                  >备份流程图
+                  >{{ $t('bpmprocess.backupFlowChart') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -266,7 +266,7 @@
                   icon="el-icon-edit"
                   @click="handleEditbpmn(scope.row)"
                   v-hasPermi="['system:user:edit']"
-                  >设计流程图
+                  >{{ $t('bpmprocess.designFlowChart') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -276,7 +276,7 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:user:remove']"
-                  >删除
+                  >{{ $t('normal.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -302,44 +302,39 @@
       append-to-body
     >
       <Preview ref="previewRef" @preCloseHandler="preCloseHandler"></Preview>
-      <template #footer>
-        <!-- <span>
-          <el-button @click="preCloseHandler">关闭</el-button>
-        </span> -->
-      </template>
     </el-dialog>
 
     <!-- 版本状态对话框 -->
-    <el-dialog title="版本状态" width="800px" :visible.sync="isVersionsStatus">
+    <el-dialog :title="$t('bpmprocess.versionStatusDialog')" width="800px" :visible.sync="isVersionsStatus">
       <el-table :data="versionForm" style="width: 100%">
-        <el-table-column prop="processId" label="主键" align="center">
+        <el-table-column prop="processId" :label="$t('bpmprocess.primaryKey')" align="center">
         </el-table-column>
-        <el-table-column prop="processName" label="流程名称" align="center">
+        <el-table-column prop="processName" :label="$t('bpmprocess.processName')" align="center">
         </el-table-column>
-        <el-table-column prop="processKey" label="流程别名" align="center">
+        <el-table-column prop="processKey" :label="$t('bpmprocess.processKey')" align="center">
         </el-table-column>
-        <el-table-column prop="processType" label="流程类型" align="center">
+        <el-table-column prop="processType" :label="$t('bpmprocess.processType')" align="center">
         </el-table-column>
         <el-table-column
           prop="startEventType"
-          label="启动事件类型"
+          :label="$t('bpmprocess.startEventType')"
           align="center"
           width="100px"
         >
         </el-table-column>
-        <el-table-column prop="note" label="版本注释" align="center">
+        <el-table-column prop="note" :label="$t('bpmprocess.versionNote')" align="center">
         </el-table-column>
-        <el-table-column prop="remark" label="备注" align="center">
+        <el-table-column prop="remark" :label="$t('normal.remark')" align="center">
         </el-table-column>
         <el-table-column
-          label="操作"
+          :label="$t('normal.operation')"
           align="center"
           class-name="small-padding fixed-width"
         >
           <template slot-scope="scope">
             <el-dropdown>
               <el-button type="warning" plain size="small">
-                处理<i class="el-icon-arrow-down el-icon--right"></i>
+                {{ $t('normal.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
               </el-button>
               <el-dropdown-menu slot="dropdown">
                 <el-dropdown-item>
@@ -349,7 +344,7 @@
                     icon="el-icon-edit"
                     v-hasPermi="['system:user:edit']"
                     @click="statusStartHandle(scope.row)"
-                    >启用
+                    >{{ $t('bpmprocess.enable') }}
                   </el-button>
                 </el-dropdown-item>
               </el-dropdown-menu>
@@ -443,7 +438,6 @@ export default {
         processDeployTime: null,
         startEventType: null,
         note: null,
-        processVersion: null,
         processXml: null,
         processJson: null,
         processXmlContent: null,
@@ -676,13 +670,13 @@ export default {
     handleDelete(row) {
       const processIds = row.processId || this.ids;
       this.$modal
-        .confirm('是否确认删除流程定义编号为"' + processIds + '"的数据项?')
+        .confirm(this.$t('normal.isConfirmDelete') + processIds + '"的数据项?')
         .then(function () {
           return delProcess(processIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('normal.deleteSuccess'));
         })
         .catch(() => {});
     },
@@ -701,7 +695,7 @@ export default {
         exportFileProcess(this.ids).then((res) => {
           const content = res;
           const blob = new Blob([content], { type: "application/zip" });
-          const fileName = "流程文件";
+          const fileName = this.$t('bpmprocess.exportProcessFile');
           if ("download" in document.createElement("a")) {
             // 非IE下载
             const elink = document.createElement("a");
@@ -720,7 +714,7 @@ export default {
           }
         });
       } else {
-        this.$message.warning("请勾选流程数据条!");
+        this.$message.warning(this.$t('normal.pleaseSelectData'));
       }
     },
     // 获取字典对应label
@@ -765,7 +759,7 @@ export default {
       }).then((res) => {
         if (res.code == 200) {
           this.getList();
-          this.$message.success("启用成功");
+          this.$message.success(this.$t('bpmprocess.enableSuccess'));
           this.isVersionsStatus = false;
         }
       });

+ 85 - 88
zkqy-ui/src/views/bpmprocess/scriptManage.vue

@@ -8,10 +8,10 @@
       v-show="showSearch"
       label-width="88px"
     >
-      <el-form-item label="脚本编码" prop="scriptKey">
+      <el-form-item :label="$t('script.scriptKey')" prop="scriptKey">
         <el-input
           v-model="queryParams.scriptKey"
-          placeholder="请输入脚本编码"
+          :placeholder="$t('script.pleaseEnterScriptKey')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -24,18 +24,18 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item> -->
-      <el-form-item label="脚本名称" prop="scriptName">
+      <el-form-item :label="$t('script.scriptName')" prop="scriptName">
         <el-input
           v-model="queryParams.scriptName"
-          placeholder="请输入脚本名称"
+          :placeholder="$t('script.pleaseEnterScriptName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="脚本类型" prop="scriptType">
+      <el-form-item :label="$t('script.scriptType')" prop="scriptType">
         <el-select
           v-model="queryParams.scriptType"
-          placeholder="请选择脚本类型"
+          :placeholder="$t('script.pleaseSelectScriptType')"
           filterable
           clearable
         >
@@ -48,10 +48,10 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="行业类型:" prop="industryType">
+      <el-form-item :label="$t('script.industryType')" prop="industryType">
         <el-select
           v-model="queryParams.industryType"
-          placeholder="请选择行业类型"
+          :placeholder="$t('script.pleaseSelectIndustryType')"
           filterable
           clearable
         >
@@ -64,10 +64,10 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="租户:" prop="tenantId">
+      <el-form-item :label="$t('tenant.tenant')" prop="tenantId">
         <el-select
           v-model="queryParams.tenantId"
-          placeholder="请选择行业类型"
+          :placeholder="$t('script.pleaseSelectTenant')"
           filterable
           clearable
         >
@@ -94,10 +94,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索
+        >{{ $t('normal.search') }}
         </el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置
+        >{{ $t('normal.reset') }}
         </el-button>
       </el-form-item>
     </el-form>
@@ -111,7 +111,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:script:add']"
-        >新增
+        >{{ $t('normal.insert') }}
         </el-button>
       </el-col>
 
@@ -124,7 +124,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:script:remove']"
-        >删除
+        >{{ $t('normal.delete') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -136,7 +136,7 @@
           :disabled="multiple"
           @click="downloadTheNodeTemplate"
           v-hasPermi="['system:script:remove']"
-        >下载节点模版
+        >{{ $t('script.downloadNodeTemplate') }}
         </el-button>
       </el-col>
 
@@ -148,7 +148,7 @@
           size="mini"
           @click="uploadTheNodeTemplate"
           v-hasPermi="['system:script:remove']"
-        >上传脚本文件
+        >{{ $t('script.uploadScriptFile') }}
         </el-button>
       </el-col>
       <!-- <el-col :span="1.5">
@@ -189,45 +189,45 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <!--<el-table-column label="编号" align="center" prop="id" />-->
-      <el-table-column label="脚本编码" align="center" prop="scriptKey" />
+      <el-table-column :label="$t('script.scriptKey')" align="center" prop="scriptKey" />
       <!-- <el-table-column label="脚本方法名称" align="center" prop="scriptFunctionName" /> -->
-      <el-table-column label="脚本名称" align="center" prop="scriptName" />
+      <el-table-column :label="$t('script.scriptName')" align="center" prop="scriptName" />
       <!-- <el-table-column
         label="脚本方法体"
         align="center"
         prop="scriptFunctionCode"
       /> -->
-      <el-table-column label="脚本类型" align="center" prop="scriptType">
+      <el-table-column :label="$t('script.scriptType')" align="center" prop="scriptType">
         <template slot-scope="scope">
           {{ getDictLabel(scope.row.scriptType, dict.type.bpm_script_type) }}
         </template>
       </el-table-column>
-      <el-table-column label="行业类型" align="center" prop="industryType">
+      <el-table-column :label="$t('script.industryType')" align="center" prop="industryType">
         <template slot-scope="scope">
           {{ getDictLabel(scope.row.industryType, dict.type.industry_type) }}
         </template>
       </el-table-column>
 
-      <el-table-column label="脚本状态" align="center" prop="scriptState">
+      <el-table-column :label="$t('script.scriptState')" align="center" prop="scriptState">
         <template slot-scope="scope">
           {{ getDictLabel(scope.row.scriptState, dict.type.zkqy_jbzt) }}
         </template>
       </el-table-column>
 
-      <el-table-column label="组件状态" align="center" prop="pageUpload">
+      <el-table-column :label="$t('script.componentState')" align="center" prop="pageUpload">
         <template slot-scope="scope">
           {{ getDictLabel(scope.row.pageUpload, dict.type.isuploadpage) }}
         </template>
       </el-table-column>
       <el-table-column
-        label="脚本描述"
+        :label="$t('script.scriptDescription')"
         align="center"
         prop="scriptDescription"
       />
 
 
       <el-table-column
-        label="操作"
+        :label="$t('normal.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
@@ -240,7 +240,7 @@
         >
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('normal.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -250,7 +250,7 @@
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:script:edit']"
-                >修改
+                >{{ $t('normal.update') }}
                 </el-button>
               </el-dropdown-item>
 
@@ -261,7 +261,7 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:script:remove']"
-                >删除
+                >{{ $t('normal.delete') }}
                 </el-button>
               </el-dropdown-item>
 
@@ -272,7 +272,7 @@
                   icon="el-icon-edit"
                   @click="examine(scope.row)"
                   v-hasPermi="['system:script:edit']"
-                >审核
+                >{{ $t('script.examine') }}
                 </el-button>
               </el-dropdown-item>
 
@@ -283,7 +283,7 @@
                   icon="el-icon-edit"
                   @click="updateLoadPage(scope.row)"
                   v-hasPermi="['system:script:edit']"
-                >上传组件页面
+                >{{ $t('script.uploadComponentPage') }}
                 </el-button>
               </el-dropdown-item>
 
@@ -304,11 +304,11 @@
     <!-- 添加或修改流程节点脚本对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-        <el-form-item label="脚本编码:" prop="scriptKey">
+        <el-form-item :label="$t('script.scriptKey')" prop="scriptKey">
           <el-col :span="20">
             <el-input
               v-model="form.scriptKey"
-              placeholder="请输入脚本编码"
+              :placeholder="$t('script.pleaseEnterScriptKey')"
               :disabled="true"
             />
           </el-col>
@@ -321,14 +321,14 @@
             ></el-button>
           </el-col>
         </el-form-item>
-        <el-form-item label="脚本名称:" prop="scriptName">
-          <el-input v-model="form.scriptName" placeholder="请输入脚本名称" />
+        <el-form-item :label="$t('script.scriptName')" prop="scriptName">
+          <el-input v-model="form.scriptName" :placeholder="$t('script.pleaseEnterScriptName')" />
         </el-form-item>
-        <el-form-item label="脚本类型:" prop="scriptType">
+        <el-form-item :label="$t('script.scriptType')" prop="scriptType">
           <!-- <el-input v-model="form.scriptName" placeholder="请输入脚本名称" /> -->
           <el-select
             v-model="form.scriptType"
-            placeholder="请选择脚本类型"
+            :placeholder="$t('script.pleaseSelectScriptType')"
             filterable
           >
             <el-option
@@ -340,10 +340,10 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="行业类型:" prop="industryType">
+        <el-form-item :label="$t('script.industryType')" prop="industryType">
           <el-select
             v-model="form.industryType"
-            placeholder="请选择行业类型"
+            :placeholder="$t('script.pleaseSelectIndustryType')"
             filterable
           >
             <el-option
@@ -375,13 +375,13 @@
 
         <el-form-item
           v-show="form.scriptType != '2'"
-          label="数据表:"
+          :label="$t('script.tableName')"
           prop="tableName"
         >
           <el-select
             v-model="form.tableName"
             multiple
-            placeholder="请选择数据表"
+            :placeholder="$t('script.pleaseSelectTable')"
           >
             <el-option
               v-for="item in tableNameList"
@@ -392,16 +392,16 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="脚本描述:" prop="scriptDescription">
+        <el-form-item :label="$t('script.scriptDescription')" prop="scriptDescription">
           <el-input
             v-model="form.scriptDescription"
-            placeholder="请输入脚本描述"
+            :placeholder="$t('script.pleaseEnterScriptDescription')"
           />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">{{ $t('normal.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
 
@@ -409,19 +409,19 @@
     <!-- 审核脚本表单 -->
     <el-dialog :title="title" :visible.sync="openSH" width="500px" append-to-body>
       <el-form ref="form1" :model="form" :rules="rules" label-width="100px">
-        <el-form-item label="审核状态"  prop="scriptState">
+        <el-form-item :label="$t('script.examineState')" prop="scriptState">
           <el-radio-group v-model="form.scriptState">
-            <el-radio label="1">通过</el-radio>
-            <el-radio label="2">不通过</el-radio>
+            <el-radio label="1">{{ $t('script.pass') }}</el-radio>
+            <el-radio label="2">{{ $t('script.notPass') }}</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="操作"  prop="scriptState">
-          <el-button type="success" @click="xzcheck">下载脚本</el-button>
+        <el-form-item :label="$t('normal.operation')" prop="scriptState">
+          <el-button type="success" @click="xzcheck">{{ $t('script.downloadScript') }}</el-button>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm2">确 定</el-button>
-        <el-button @click="cancel1">取 消</el-button>
+        <el-button type="primary" @click="submitForm2">{{ $t('normal.confirm') }}</el-button>
+        <el-button @click="cancel1">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
 
@@ -453,11 +453,11 @@
         drag
       >
         <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__text">{{ $t('script.uploadTip') }}</div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">确 定</el-button>
-        <el-button @click="upload.open = false">取 消</el-button>
+        <el-button type="primary" @click="submitFileForm">{{ $t('normal.confirm') }}</el-button>
+        <el-button @click="upload.open = false">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
     <!--页面上传 -->
@@ -481,11 +481,11 @@
         drag
       >
         <i class="el-icon-upload"></i>
-        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__text">{{ $t('script.uploadTip') }}</div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm1">确 定</el-button>
-        <el-button @click="upload1.open = false">取 消</el-button>
+        <el-button type="primary" @click="submitFileForm1">{{ $t('normal.confirm') }}</el-button>
+        <el-button @click="upload1.open = false">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -604,7 +604,7 @@ export default {
       // 表单校验
       rules: {
         scriptName: [
-          { required: true, message: '请输入脚本名称', trigger: 'blur' }
+          { required: true, message: this.$t('script.pleaseEnterScriptName'), trigger: 'blur' }
         ],
         // scriptFunctionName: [
         //   { required: true, message: "请输入脚本函数名", trigger: "blur" },
@@ -613,13 +613,13 @@ export default {
         //   { required: true, message: "请输入脚本函数体", trigger: "blur" },
         // ],
         scriptType: [
-          { required: true, message: '请选择脚本类型', trigger: 'change' }
+          { required: true, message: this.$t('script.pleaseSelectScriptType'), trigger: 'change' }
         ],
         industryType: [
-          { required: true, message: '请选择脚本类型', trigger: 'change' }
+          { required: true,message: this.$t('script.pleaseSelectScriptType'), trigger: 'change' }
         ],
         scriptState: [
-          { required: true, message: "请选择审核状态", trigger: "change" },
+          { required: true,message: this.$t('script.pleaseSelectExamineState'), trigger: "change" },
         ],
       },
 
@@ -669,12 +669,11 @@ export default {
             // Step 3: 清理临时对象
             window.URL.revokeObjectURL(url)
             document.body.removeChild(a)
-
-            this.$message.success('下载成功!')
+            this.$message.success( this.$t('script.messages.downloadSuccessful'))
             this.openSH=false;
           } else {
-            console.error('响应数据不是有效的文件格式:', response.data)
-            this.$message.error('下载失败,请检查接口返回的数据格式!')
+            console.error(this.$t('script.messages.downloadError'), response.data)
+            this.$message.error(this.$t('script.messages.downloadError'))
           }
         })
         .catch(error => {
@@ -685,14 +684,14 @@ export default {
     //上传组件页面
     updateLoadPage(row){
       this.upload1.open=true;
-      this.upload1.title = '节点组件上传'
+      this.upload1.title = this.$t('script.titles.uploadComponent')
       this.uploadObj.id="";
       this.uploadObj.id=row.id
-      console.log("上传组件页面",this.uploadObj)
+      console.log(this.$t('script.comments.uploadComponent'), this.uploadObj)
     },
     //上传节点模版
     uploadTheNodeTemplate () {
-      this.upload.title = '租户脚本上传'
+      this.upload.title = this.$t('script.titles.uploadTenant')
       this.upload.open = true
     },
     // 文件上传中处理
@@ -704,7 +703,7 @@ export default {
       this.upload.open = false
       this.upload.isUploading = false
       this.$refs.upload.clearFiles()
-      this.$modal.msgSuccess('文件上传成功')
+      this.$modal.msgSuccess(this.$t('script.messages.uploadSuccess'))
       this.getList();
     },
     // 文件上传成功处理
@@ -712,7 +711,7 @@ export default {
       this.upload1.isUploading = false
       this.upload1.open=false;
       this.$refs.upload1.clearFiles()
-      this.$modal.msgSuccess('文件上传成功')
+      this.$modal.msgSuccess(this.$t('script.messages.uploadSuccess'))
       this.getList();
     },
     // 提交上传文件
@@ -738,11 +737,11 @@ export default {
     },
     // 复制成功
     onCopy () {
-      this.$modal.msgSuccess('脚本编码已成功复制到剪贴板')
+      this.$modal.msgSuccess(this.$t('script.messages.copySuccess'))
     },
     //复制失败
     onError () {
-      this.$modal.msgError('脚本编码复制失败')
+      this.$modal.msgError(this.$t('script.messages.copyError'))
     },
     /** 查询流程节点脚本列表 */
     getList () {
@@ -833,15 +832,15 @@ export default {
             window.URL.revokeObjectURL(url)
             document.body.removeChild(a)
 
-            this.$message.success('下载成功!')
+            this.$message.success(this.$t('script.messages.downloadSuccessful'))
           } else {
-            console.error('响应数据不是有效的文件格式:', response.data)
-            this.$message.error('下载失败,请检查接口返回的数据格式!')
+            console.error(this.$t('script.messages.responseDataNotValidFileFormat'), response.data)
+            this.$message.error(this.$t('script.messages.downloadError'))
           }
         })
         .catch(error => {
           console.error('下载失败:', error)
-          this.$message.error('下载失败,请稍后再试!')
+          this.$message.error(this.$t('script.messages.downloadRetry'))
         })
     },
 
@@ -854,7 +853,7 @@ export default {
         this.$set(this.form, 'scriptKey', 'script_'+newScriptKey)
         console.log('Generated scriptKey:', this.form.scriptKey)
         this.open = true
-        this.title = '添加流程节点脚本'
+        this.title = this.$t('script.titles.addScript')
       });
     },
     /** 修改按钮操作 */
@@ -874,17 +873,17 @@ export default {
         console.log(response.data.tableName)
         this.form = response.data
         this.open = true
-        this.title = '修改流程节点脚本'
+        this.title = this.$t('script.titles.updateScript')
       })
     },
     examine(row){
-      console.log("审核",row.scriptState);
+      console.log(this.$t('script.comments.examine'), row.scriptState);
       this.dqRow=row;
       // this.form.id=row.id;
       this.$set(this.form,'scriptState',"1")
       this.$set(this.form,'id',row.id)
       this.openSH=true;
-      this.title="审核节点信息"
+      this.title = this.$t('script.titles.examineScript')
       this.$nextTick(() => {
         console.log(this.$refs['form1'])
         this.$refs['form1'].resetFields()
@@ -898,7 +897,7 @@ export default {
           this.form.tableName = this.form.tableName?.join(',')
           if (this.form.id != null) {
             updateScript(this.form).then(response => {
-              this.$modal.msgSuccess('修改成功')
+              this.$modal.msgSuccess(this.$t('script.messages.updateSuccess'))
               this.open = false
               this.openSH=false;
               this.getList()
@@ -906,7 +905,7 @@ export default {
           } else {
             addScript(this.form).then(response => {
               console.log(this.form)
-              this.$modal.msgSuccess('新增成功')
+              this.$modal.msgSuccess(this.$t('script.messages.addSuccess'))
               this.open = false
               this.getList()
             })
@@ -922,7 +921,7 @@ export default {
           // this.form.tableName = this.form.tableName?.join(',')
           if (this.form.id != null) {
             updateScript(this.form).then(response => {
-              this.$modal.msgSuccess('修改成功')
+              this.$modal.msgSuccess(this.$t('script.messages.updateSuccess'))
               this.open = false
               this.openSH=false;
               this.getList()
@@ -930,7 +929,7 @@ export default {
           } else {
             addScript(this.form).then(response => {
               console.log(this.form)
-              this.$modal.msgSuccess('新增成功')
+              this.$modal.msgSuccess(this.$t('script.messages.addSuccess'))
               this.open = false
               this.getList()
             })
@@ -942,13 +941,13 @@ export default {
     handleDelete (row) {
       const ids = row.id || this.ids
       this.$modal
-        .confirm('是否确认删除流程节点脚本编号为"' + ids + '"的数据项?')
+        .confirm(this.$t('script.messages.deleteConfirm') + ids + this.$t('script.messages.dataItem'))
         .then(function () {
           return delScript(ids)
         })
         .then(() => {
           this.getList()
-          this.$modal.msgSuccess('删除成功')
+          this.$modal.msgSuccess(this.$t('script.messages.deleteSuccess'))
         })
         .catch(() => {})
     },
@@ -984,15 +983,13 @@ export default {
     },
     // 抽屉关闭前回调
     drawerHandleClose (done) {
-      this.$confirm('即将关闭编辑器,是否保存代码?')
+      this.$confirm(this.$t('script.messages.closeEditorConfirm'))
         .then(
           val => {
             this.form.scriptFunctionCode = this.monacoEditor?.getValue()
-            // this.drawer = false;
             done()
           },
           res => {
-            // this.drawer = false;
             done()
           }
         )

+ 67 - 67
zkqy-ui/src/views/dataEngine/datamodeling/index.vue

@@ -1,39 +1,39 @@
 <template>
   <div class="app-container">
     <el-form
-      :model="queryParams"
-      ref="queryForm"
-      size="small"
-      :inline="true"
-      v-show="showSearch"
-      label-width="68px"
+        :model="queryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="68px"
     >
-      <el-form-item label="表名称" prop="tableName">
+      <el-form-item :label="$t('dataModeling.tableName')" prop="tableName">
         <el-input
-          v-model="queryParams.tableName"
-          placeholder="请输入表名称"
-          clearable
-          @keyup.enter.native="handleQuery"
+            v-model="queryParams.tableName"
+            :placeholder="$t('pleaseEnter') + $t('dataModeling.tableName') "
+            clearable
+            @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="表描述" prop="tableComment">
+      <el-form-item :label="$t('dataModeling.tableDescription')" prop="tableComment">
         <el-input
-          v-model="queryParams.tableComment"
-          placeholder="请输入表描述"
-          clearable
-          @keyup.enter.native="handleQuery"
+            v-model="queryParams.tableComment"
+            :placeholder="$t('pleaseEnter') + $t('dataModeling.tableDescription')"
+            clearable
+            @keyup.enter.native="handleQuery"
         />
       </el-form-item>
       <el-form-item>
         <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
-          >搜索</el-button
+            type="primary"
+            icon="el-icon-search"
+            size="mini"
+            @click="handleQuery"
+        >{{ $t('search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+        >{{ $t('reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -41,53 +41,53 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          >新增</el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="mini"
+            @click="handleAdd"
+        >{{ $t('insert') }}</el-button
         >
       </el-col>
       <right-toolbar
-        :showSearch.sync="showSearch"
-        @queryTable="getList"
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
       ></right-toolbar>
     </el-row>
 
     <el-table v-loading="loading" :data="aaaList">
-      <el-table-column label="表名称" align="center" prop="tableName" />
-      <el-table-column label="表描述" align="center" prop="tableComment" />
-      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column :label="$t('dataModeling.tableName')" align="center" prop="tableName" />
+      <el-table-column :label="$t('dataModeling.tableDescription')" align="center" prop="tableComment" />
+      <el-table-column :label="$t('dataModeling.createTime')" align="center" prop="createTime" />
       <el-table-column
-        label="操作"
-        align="center"
-        class-name="small-padding fixed-width"
+          :label="$t('operation')"
+          align="center"
+          class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
                 <el-button
-                size="mini"
-                type="text"
-                icon="el-icon-edit"
-                @click="handleUpdate(scope.row)"
-                >修改
-              </el-button>
-            </el-dropdown-item>
-            <el-dropdown-item>
-              <el-button
-                size="mini"
-                type="text"
-                icon="el-icon-delete"
-                @click="handleDelete(scope.row)"
-                >删除
-              </el-button>
-            </el-dropdown-item>
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    @click="handleUpdate(scope.row)"
+                >{{ $t('update') }}
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    @click="handleDelete(scope.row)"
+                >{{ $t('delete') }}
+                </el-button>
+              </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
 
@@ -98,11 +98,11 @@
     </el-table>
 
     <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
     />
   </div>
 </template>
@@ -165,15 +165,15 @@ export default {
         databaseName: this.$store.state.user.dataSource.databaseName,
       };
       this.$modal
-        .confirm('是否确认删除"' + tableNames + '"表?')
-        .then(function () {
-          return removeTable(data);
-        })
-        .then(() => {
-          this.getList();
-          this.$modal.msgSuccess("删除成功");
-        })
-        .catch(() => {});
+          .confirm(this.$t('isConfirmDelete')+"\"" + tableNames +"\""+ this.$t('dataModeling.table'))
+          .then(function () {
+            return removeTable(data);
+          })
+          .then(() => {
+            this.getList();
+            this.$modal.msgSuccess(this.$t('deleteSuccess'));
+          })
+          .catch(() => {});
     },
     handleUpdate(row) {
       this.$router.push({

+ 8 - 8
zkqy-ui/src/views/dialogMange/index.vue

@@ -825,7 +825,7 @@ export default {
       statusFieldList: [], //状态按钮 字段数据
       // 依赖表名称
       // relytableName: '',
-      staictitle: "添加统计数据字段",
+      staictitle: this.$t('dialog.addStatisticField'),
       isInputInvalid: false,
       // 修改表格时的menuId
       menuId: "",
@@ -858,12 +858,12 @@ export default {
       relyOptions: [
         {
           value: "0",
-          label: "自定义依赖值",
+          label: this.$t('dialog.customDependency'),
         },
         {
           value: "1",
-          label: "依赖其他表字段",
-        },
+          label: this.$t('dialog.dependOnOtherField'),
+        }
       ],
       // 依赖值
       relayValue: "",
@@ -871,17 +871,17 @@ export default {
       relyFileds: {},
       relaTypeList: [
         {
-          label: "等值连接",
+          label: this.$t('dialog.equalJoin'),
           value: "INNER JOIN",
         },
         {
-          label: "左连接",
+          label: this.$t('dialog.leftJoin'),
           value: "LEFT JOIN",
         },
         {
-          label: "右连接",
+          label: this.$t('dialog.rightJoin'),
           value: "RIGHT JOIN",
-        },
+        }
       ],
       headerList: [
         {

+ 8 - 8
zkqy-ui/src/views/dialogMange/relayTableMange/tablelist.vue

@@ -198,7 +198,7 @@ export default {
   data() {
     return {
       row: {}, //记录当前行
-      staictitle: "添加统计数据字段",
+      staictitle: this.$t('dialog.addStatisticField'),
       isInputInvalid: false,
       // 修改表格时的menuId
       menuId: "",
@@ -229,27 +229,27 @@ export default {
       relyOptions: [
         {
           value: "0",
-          label: "自定义依赖值",
+          label: this.$t('dialog.customDependency'),
         },
         {
           value: "1",
-          label: "依赖其他字段",
-        },
+          label: this.$t('dialog.dependOnOtherField'),
+        }
       ],
       relyFileds: {},
       relaTypeList: [
         {
-          label: "等值连接",
+          label: this.$t('dialog.equalJoin'),
           value: "INNER JOIN",
         },
         {
-          label: "左连接",
+          label: this.$t('dialog.leftJoin'),
           value: "LEFT JOIN",
         },
         {
-          label: "右连接",
+          label: this.$t('dialog.rightJoin'),
           value: "RIGHT JOIN",
-        },
+        }
       ],
       headerList: [
         {

+ 62 - 75
zkqy-ui/src/views/dragform/index.vue

@@ -8,24 +8,18 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="表单名称" prop="dfName">
+      <el-form-item :label="$t('dragform.formName')" prop="dfName">
         <el-input
           v-model="queryParams.dfName"
-          placeholder="请输入表单名称
-"
+          :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item
-        label="表单别名
-"
-        prop="dfNickname"
-      >
+      <el-form-item :label="$t('dragform.formNickname')" prop="dfNickname">
         <el-input
           v-model="queryParams.dfNickname"
-          placeholder="请输入表单别名
-"
+          :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formNickname')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -46,30 +40,26 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item> -->
-      <el-form-item
-        label="数据源名称
-"
-        prop="dfDatabase"
-      >
+      <el-form-item :label="$t('dragform.databaseName')" prop="dfDatabase">
         <el-input
           v-model="queryParams.dfDatabase"
-          placeholder="请输入数据源名称"
+          :placeholder="$t('dragform.pleaseEnter') + $t('dragform.databaseName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="绑定表名称" prop="dfTableName">
+      <el-form-item :label="$t('dragform.tableName')" prop="dfTableName">
         <el-input
           v-model="queryParams.dfTableName"
-          placeholder="请输入绑定表名称"
+          :placeholder="$t('dragform.pleaseEnter') + $t('dragform.tableName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="表单描述" prop="dfNotes">
+      <el-form-item :label="$t('dragform.formDescription')" prop="dfNotes">
         <el-input
           v-model="queryParams.dfNotes"
-          placeholder="请输入表单描述"
+          :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formDescription')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -81,14 +71,14 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('dragform.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('dragform.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
-    <!--  v-hasPermi="['dragform:form:add']" 
+    <!--  v-hasPermi="['dragform:form:add']"
           v-hasPermi="['dragform:form:edit']"
           v-hasPermi="['dragform:form:remove']"
           v-hasPermi="['dragform:form:export']"
@@ -101,7 +91,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          >新增
+          >{{ $t('dragform.add') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -112,7 +102,7 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          >修改
+          >{{ $t('dragform.edit') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -123,7 +113,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          >删除
+          >{{ $t('dragform.delete') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -134,7 +124,7 @@
           icon="el-icon-download"
           size="mini"
           @click="handleExport"
-          >导出
+          >{{ $t('dragform.export') }}
         </el-button>
         <ExcelDownLoad
           v-else
@@ -163,64 +153,61 @@
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单主键"
+        :label="$t('dragform.formId')"
         align="center"
         prop="fId"
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单名称
-"
+        :label="$t('dragform.formName')"
         align="center"
         prop="dfName"
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单别名
-"
+        :label="$t('dragform.formNickname')"
         align="center"
         prop="dfNickname"
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单vue模版"
+        :label="$t('dragform.formVueTemplate')"
         align="center"
         prop="dfVueTemplate"
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单html模版"
+        :label="$t('dragform.formHtmlTemplate')"
         align="center"
         prop="dfHtmlTemplate"
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单sql"
+        :label="$t('dragform.formSql')"
         align="center"
         prop="dfFormSql"
         show-overflow-tooltip
       />
       <el-table-column
-        label="节点ID"
+        :label="$t('dragform.nodeId')"
         align="center"
         prop="dfNodeId"
         show-overflow-tooltip
       />
       <el-table-column
-        label="数据源名称
-"
+        :label="$t('dragform.databaseName')"
         align="center"
         prop="dfDatabase"
         show-overflow-tooltip
       />
       <el-table-column
-        label="绑定表名称"
+        :label="$t('dragform.tableName')"
         align="center"
         prop="dfTableName"
         show-overflow-tooltip
       />
       <el-table-column
-        label="表单描述"
+        :label="$t('dragform.formDescription')"
         align="center"
         prop="dfNotes"
         show-overflow-tooltip
@@ -244,14 +231,14 @@
         show-overflow-tooltip
       /> -->
       <el-table-column
-        label="操作"
+        :label="$t('dragform.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('dragform.handle') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -260,7 +247,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
-                  >修改
+                  >{{ $t('dragform.edit') }}
                 </el-button></el-dropdown-item
               >
               <el-dropdown-item>
@@ -269,7 +256,7 @@
                   type="text"
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
-                  >删除
+                  >{{ $t('dragform.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -283,7 +270,7 @@
             >修改
           </el-button> -->
           <!--  v-hasPermi="['dragform:form:edit']"
-            
+
 
           -->
           <!-- <el-button
@@ -309,54 +296,54 @@
 对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="表单名" prop="dfName">
-          <el-input v-model="form.dfName" placeholder="请输入表单名称" />
+        <el-form-item :label="$t('dragform.formName')" prop="dfName">
+          <el-input v-model="form.dfName" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formName')" />
         </el-form-item>
-        <el-form-item label="表单别名" prop="dfNickname">
-          <el-input v-model="form.dfNickname" placeholder="请输入表单别名" />
+        <el-form-item :label="$t('dragform.formNickname')" prop="dfNickname">
+          <el-input v-model="form.dfNickname" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formNickname')" />
         </el-form-item>
-        <el-form-item label="表单vue模版" prop="dfVueTemplate">
+        <el-form-item :label="$t('dragform.formVueTemplate')" prop="dfVueTemplate">
           <el-input
             v-model="form.dfVueTemplate"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('dragform.pleaseEnterContent')"
           />
         </el-form-item>
-        <el-form-item label="表单html模版" prop="dfHtmlTemplate">
+        <el-form-item :label="$t('dragform.formHtmlTemplate')" prop="dfHtmlTemplate">
           <el-input
             v-model="form.dfHtmlTemplate"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('dragform.pleaseEnterContent')"
           />
         </el-form-item>
-        <el-form-item label="表单sql" prop="dfFormSql">
-          <el-input v-model="form.dfFormSql" placeholder="请输入表单sql" />
+        <el-form-item :label="$t('dragform.formSql')" prop="dfFormSql">
+          <el-input v-model="form.dfFormSql" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formSql')" />
         </el-form-item>
-        <el-form-item label="节点ID" prop="dfNodeId">
-          <el-input v-model="form.dfNodeId" placeholder="请输入节点ID" />
+        <el-form-item :label="$t('dragform.nodeId')" prop="dfNodeId">
+          <el-input v-model="form.dfNodeId" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.nodeId')" />
         </el-form-item>
-        <el-form-item label="数据源名称" prop="dfDatabase">
-          <el-input v-model="form.dfDatabase" placeholder="请输入数据源名称" />
+        <el-form-item :label="$t('dragform.databaseName')" prop="dfDatabase">
+          <el-input v-model="form.dfDatabase" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.databaseName')" />
         </el-form-item>
-        <el-form-item label="绑定表名称" prop="dfTableName">
-          <el-input v-model="form.dfTableName" placeholder="请输入绑定表名称" />
+        <el-form-item :label="$t('dragform.tableName')" prop="dfTableName">
+          <el-input v-model="form.dfTableName" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.tableName')" />
         </el-form-item>
-        <el-form-item label="逻辑删除" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入逻辑删除" />
+        <el-form-item :label="$t('dragform.logicalDelete')" prop="delFlag">
+          <el-input v-model="form.delFlag" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.logicalDelete')" />
         </el-form-item>
-        <el-form-item label="表单描述" prop="dfNotes">
-          <el-input v-model="form.dfNotes" placeholder="请输入表单描述" />
+        <el-form-item :label="$t('dragform.formDescription')" prop="dfNotes">
+          <el-input v-model="form.dfNotes" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.formDescription')" />
         </el-form-item>
-        <el-form-item label="备用列" prop="spare">
-          <el-input v-model="form.spare" placeholder="请输入备用列" />
+        <el-form-item :label="$t('dragform.spareColumn')" prop="spare">
+          <el-input v-model="form.spare" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.spareColumn')" />
         </el-form-item>
-        <el-form-item label="备用列" prop="spare1">
-          <el-input v-model="form.spare1" placeholder="请输入备用列" />
+        <el-form-item :label="$t('dragform.spareColumn')" prop="spare1">
+          <el-input v-model="form.spare1" :placeholder="$t('dragform.pleaseEnter') + $t('dragform.spareColumn')" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">{{ $t('dragform.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('dragform.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -520,13 +507,13 @@ export default {
           console.log(this.form);
           if (this.form.fId != null) {
             updateForm(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('dragform.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addForm(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('dragform.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -538,13 +525,13 @@ export default {
     handleDelete(row) {
       const fIds = row.fId || this.ids;
       this.$modal
-        .confirm('是否确认删除动态单编号为"' + fIds + '"的数据项?')
+        .confirm(this.$t('dragform.confirmDelete', [fIds]))
         .then(function () {
           return delForm(fIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('dragform.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 52 - 74
zkqy-ui/src/views/dragform/tableList.vue

@@ -8,18 +8,18 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="表格名称" prop="dtName">
+      <el-form-item :label="$t('tableList.tableName')" prop="dtName">
         <el-input
           v-model="queryParams.dtName"
-          placeholder="请输入表格名称"
+          :placeholder="$t('tableList.tableNamePlaceholder')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="绑定表名称" prop="dtTableName" label-width="100px">
+      <el-form-item :label="$t('tableList.boundTableName')" prop="dtTableName" label-width="100px">
         <el-input
           v-model="queryParams.dtTableName"
-          placeholder="请输入绑定表名称"
+          :placeholder="$t('tableList.boundTableNamePlaceholder')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -30,10 +30,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('tableList.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('tableList.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -46,7 +46,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          >新增</el-button
+          >{{ $t('tableList.add') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -57,7 +57,7 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          >修改</el-button
+          >{{ $t('tableList.edit') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -68,7 +68,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          >删除</el-button
+          >{{ $t('tableList.delete') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -79,7 +79,7 @@
           icon="el-icon-download"
           size="mini"
           @click="handleExport"
-          >导出</el-button
+          >{{ $t('tableList.export') }}</el-button
         >
         <ExcelDownLoad
           v-else
@@ -101,39 +101,23 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="表格主键" align="center" prop="tId" />
-      <el-table-column label="表格名称" align="center" prop="dtName" />
-      <el-table-column label="表格别名" align="center" prop="dtNickname" />
-      <el-table-column label="table编号" align="center" prop="tableKey" />
-      <el-table-column label="sql编号" align="center" prop="sqlKey" />
-      <el-table-column label="绑定表名称" align="center" prop="dtTableName" />
-      <el-table-column label="表格描述" align="center" prop="dtNotes" />
-      <el-table-column label="时间格式" align="center" prop="timeFormat" />
+      <el-table-column :label="$t('tableList.tablePrimaryKey')" align="center" prop="tId" />
+      <el-table-column :label="$t('tableList.tableName')" align="center" prop="dtName" />
+      <el-table-column :label="$t('tableList.tableAlias')" align="center" prop="dtNickname" />
+      <el-table-column :label="$t('tableList.tableNumber')" align="center" prop="tableKey" />
+      <el-table-column :label="$t('tableList.sqlNumber')" align="center" prop="sqlKey" />
+      <el-table-column :label="$t('tableList.boundTableName')" align="center" prop="dtTableName" />
+      <el-table-column :label="$t('tableList.tableDescription')" align="center" prop="dtNotes" />
+      <el-table-column :label="$t('tableList.timeFormat')" align="center" prop="timeFormat" />
       <el-table-column
-        label="操作"
+        :label="$t('tableList.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
-          <!-- 修改样式 -->
-          <!-- <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            >修改</el-button
-          >
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            >删除</el-button
-          > -->
-
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('tableList.handle') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -142,7 +126,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
-                  >修改
+                  >{{ $t('tableList.edit') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -151,7 +135,7 @@
                   type="text"
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
-                  >删除
+                  >{{ $t('tableList.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -168,63 +152,62 @@
       @pagination="getList"
     />
 
-    <!-- 添加或修改动态格对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="表格名称" prop="dtName">
-          <el-input v-model="form.dtName" placeholder="请输入表格名称" />
+        <el-form-item :label="$t('tableList.tableName')" prop="dtName">
+          <el-input v-model="form.dtName" :placeholder="$t('tableList.tableNamePlaceholder')" />
         </el-form-item>
-        <el-form-item label="表格别名" prop="dtNickname">
-          <el-input v-model="form.dtNickname" placeholder="请输入表格别名" />
+        <el-form-item :label="$t('tableList.tableAlias')" prop="dtNickname">
+          <el-input v-model="form.dtNickname" :placeholder="$t('tableList.tableAliasPlaceholder')" />
         </el-form-item>
-        <el-form-item label="table编号" prop="tableKey">
-          <el-input v-model="form.tableKey" placeholder="请输入table编号" />
+        <el-form-item :label="$t('tableList.tableNumber')" prop="tableKey">
+          <el-input v-model="form.tableKey" :placeholder="$t('tableList.tableNumberPlaceholder')" />
         </el-form-item>
-        <el-form-item label="sql编号" prop="sqlKey">
-          <el-input v-model="form.sqlKey" placeholder="请输入sql编号" />
+        <el-form-item :label="$t('tableList.sqlNumber')" prop="sqlKey">
+          <el-input v-model="form.sqlKey" :placeholder="$t('tableList.sqlNumberPlaceholder')" />
         </el-form-item>
-        <el-form-item label="绑定表名称" prop="dtTableName">
-          <el-input v-model="form.dtTableName" placeholder="请输入绑定表名称" />
+        <el-form-item :label="$t('tableList.boundTableName')" prop="dtTableName">
+          <el-input v-model="form.dtTableName" :placeholder="$t('tableList.boundTableNamePlaceholder')" />
         </el-form-item>
-        <el-form-item label="表格描述" prop="dtNotes">
-          <el-input v-model="form.dtNotes" placeholder="请输入表格描述" />
+        <el-form-item :label="$t('tableList.tableDescription')" prop="dtNotes">
+          <el-input v-model="form.dtNotes" :placeholder="$t('tableList.tableDescriptionPlaceholder')" />
         </el-form-item>
-        <el-form-item label="列字段标题名称" prop="dtColumnName">
+        <el-form-item :label="$t('tableList.columnTitle')" prop="dtColumnName">
           <el-input
             v-model="form.dtColumnName"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('tableList.columnTitlePlaceholder')"
           />
         </el-form-item>
-        <el-form-item label="时间格式" prop="timeFormat">
+        <el-form-item :label="$t('tableList.timeFormat')" prop="timeFormat">
           <el-input
             v-model="form.timeFormat"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('tableList.timeFormatPlaceholder')"
           />
         </el-form-item>
-        <el-form-item label="备用列" prop="spare">
-          <el-input v-model="form.spare" placeholder="请输入备用列" />
+        <el-form-item :label="$t('tableList.spareColumn')" prop="spare">
+          <el-input v-model="form.spare" :placeholder="$t('tableList.spareColumnPlaceholder')" />
         </el-form-item>
-        <el-form-item label="备用列" prop="spare1">
-          <el-input v-model="form.spare1" placeholder="请输入备用列" />
+        <el-form-item :label="$t('tableList.spareColumn')" prop="spare1">
+          <el-input v-model="form.spare1" :placeholder="$t('tableList.spareColumnPlaceholder')" />
         </el-form-item>
-        <el-form-item label="逻辑删除" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入逻辑删除" />
+        <el-form-item :label="$t('tableList.logicalDelete')" prop="delFlag">
+          <el-input v-model="form.delFlag" :placeholder="$t('tableList.logicalDeletePlaceholder')" />
         </el-form-item>
         <el-form-item
-          label="是否显示列表复选框(0:显示;1;不显示)"
+          :label="$t('tableList.showCheckbox')"
           prop="isSelection"
         >
           <el-input
             v-model="form.isSelection"
-            placeholder="请输入是否显示列表复选框(0:显示;1;不显示)"
+            :placeholder="$t('tableList.showCheckboxPlaceholder')"
           />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">{{ $t('tableList.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('tableList.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -418,13 +401,13 @@ export default {
         if (valid) {
           if (this.form.tId != null) {
             updateTable(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('tableList.editSuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addTable(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('tableList.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -447,14 +430,9 @@ export default {
         data.sqlKeys = this.Keys;
         menuIdList = this.menuIds;
       }
-      // console.log(data);
 
       this.$modal
-        .confirm(
-          '是否确认删除动态格编号为"' +
-            data.tIds.join(",") +
-            '"的数据项?删除后菜单中相关数据也将删除!'
-        )
+        .confirm(this.$t('tableList.confirmDelete', [data.tIds.join(",")]))
         .then(async function () {
           let res = await delMenu(menuIdList);
           if (res.code == 200) {
@@ -467,7 +445,7 @@ export default {
           this.getList();
           this.tempSelection = [];
           this.reloadRouter();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('tableList.deleteSuccess'));
         })
         .catch((e) => {
           console.log(e);

+ 63 - 11
zkqy-ui/src/views/formCreate/components/FcDesigner.vue

@@ -217,6 +217,7 @@
                                 @change="formOptChange" v-model="form.api">
                                 <template #title="scope">
                                     <template v-if="scope.rule.warning">
+                                        
                                         <Warning :tooltip="scope.rule.warning">
                                             {{ scope.rule.title }}
                                         </Warning>
@@ -234,6 +235,7 @@
                             </div>
                             <template
                                 v-if="activeRule || (customForm?.config && (customForm?.config?.name || customForm?.config?.label))">
+          
                                 <p class="_fc-r-title">{{ t('designer.type') }}</p>
                                 <TypeSelect></TypeSelect>
                                 <template v-if="(activeRule && activeRule?.name && config.showComponentName !== false)">
@@ -252,7 +254,8 @@
                                     </el-input>
                                 </template>
                             </template>
-                            <div class="_fc-r-config" :style="{ 'grid-template-areas': configFormOrderStyle }">
+                           
+                            <div  :class="['_fc-r-config', activeRule?._menu?.name]" :style="{ 'grid-template-areas': configFormOrderStyle }">
                                 <div style="grid-area: base;">
                                     <el-divider v-if="baseForm.isShow">{{ t('designer.rule') }}</el-divider>
                                     <DragForm v-show="baseForm.isShow" v-model="baseForm.api" :rule="baseForm.rule"
@@ -269,7 +272,7 @@
                                         </template>
                                     </DragForm>
                                 </div>
-                                <div style="grid-area: props;">
+                                <div style="grid-area: props;" :class="[activeRule?._menu?.name +'_props']">
                                     <el-divider v-if="propsForm.isShow">{{ t('designer.props') }} <PropsInput
                                             v-if="activeRule && getConfig('showCustomProps', true)"></PropsInput>
                                         </el-divider>
@@ -371,6 +374,7 @@ import {
     copyTextToClipboard,
     formTemplate,
     htmlTemplate,
+    htmlTemplateY,
     getFormRuleDescription,
     getRuleDescription,
     getRuleTree,
@@ -1027,17 +1031,25 @@ 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;
+                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 +1128,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 };
@@ -2316,4 +2346,26 @@ export default defineComponent({
 .xg_fc-l-menu {
     width: 40px !important;
 }
+/* 选择最后两个 .zkqyTable_props 元素 */
+>>> .zkqyTable .zkqyTable_props form .fc-form-row .el-col:nth-last-child(2),
+>>> .zkqyTable .zkqyTable_props form .fc-form-row .el-col:nth-last-child(1) {
+    /* background-color: lightblue !important; */
+    display: none
+}
+>>> .tree .tree_props form .fc-form-row .el-col:nth-child(1),
+>>> .tree .tree_props form .fc-form-row .el-col:nth-child(2),
+>>> .elTransfer .elTransfer_props form .fc-form-row .el-col:nth-child(1),
+>>> .elTransfer .elTransfer_props form .fc-form-row .el-col:nth-child(2),
+>>> .cascader .cascader_props form .fc-form-row .el-col:nth-child(1),
+>>> .cascader .cascader_props form .fc-form-row .el-col:nth-child(2),
+>>> .select .select_props form .fc-form-row .el-col:nth-child(1),
+>>> .select .select_props form .fc-form-row .el-col:nth-child(2),
+>>> .checkbox .checkbox_props form .fc-form-row .el-col:nth-child(1),
+>>> .checkbox .checkbox_props form .fc-form-row .el-col:nth-child(2),
+>>> .radio .radio_props form .fc-form-row .el-col:nth-child(1),
+>>> .radio .radio_props form .fc-form-row .el-col:nth-child(2)
+{
+    display: none
+}
+
 </style>

+ 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">

+ 253 - 104
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: [],
@@ -231,6 +243,7 @@ export default {
         fieldReadonly: false,  //配置field是否可以编辑,字段id,zh-cn.js的
         showSaveBtn: true,
         appendConfigData: ['formCreateTableName', 'formCreateZkqyYMLX', 'formCreateZkqyAN', 'formCreateShowValue', 'addZkqyTableRow', 'updateZkqyTableRow'],
+        showControl: false, // 隐藏组件的联动数据配置
         formRule: {
           prepend: true,
           rule() {
@@ -249,20 +262,6 @@ export default {
             ]
           }
         },
-        // baseRule: {
-        //   prepend: true,
-        //   rule: function () { // 改为普通函数
-        //     return [
-        //       {
-        //         type: 'select',
-        //         field: 'formCreateFieldLM',
-        //         title: '列名',
-        //         value: '',
-        //         options: []
-        //       },
-        //     ];
-        //   }
-        // },
         componentRule: {
           zkqyTable: {
             prepend: true,
@@ -308,8 +307,9 @@ export default {
             }
           },
         },
-        hiddenItem: ['fcEditor'],
-        hiddenMenu: ['subform', 'layout']
+        hiddenItem: ['fcEditor','elButton'],
+        hiddenMenu: ['subform', 'layout'],
+
       },
       handle: [
         {
@@ -348,10 +348,6 @@ export default {
     // 可用的主表展示列(过滤已选的)
     availableMainColumns() {
       const selectedColumns = this.mainDisplayColumns.map(c => c.selectedColumn).filter(Boolean);
-      // console.log('==========this.mainTableColumns',this.mainTableColumns)
-      // return this.mainTableColumns.filter(col =>
-      //   !selectedColumns.includes(col.value)
-      // );
       return this.mainTableColumns
     },
 
@@ -508,38 +504,90 @@ export default {
         // action: 'http://192.168.10.103:8088/system/mobilePageDesignData/normal/updateData',
         // 构建完整的onSubmit函数
         pageOptions.onSubmit = `[[FORM-CREATE-PREFIX-function onSubmit(formData, api) {
-          const dataMap  = {};
-          api.rule.forEach(item => {
-            if (item.searchValue && item.value !== undefined) {
-              dataMap[item.searchValue] = item.value;
-            }else{
-              console.log('item', item)
-            }
-          });
-          let pageId = localStorage.getItem('sharedPageId');
-          let data = {pageId:pageId,dataMap:dataMap}
-          console.log(data)
-            api.fetch({
-              action: "${url}api/mobilePageDesignData/normal/insertData",
-              method: 'post',
-              data: data,
-              dataType: 'json',
-              headers: {
-                dbname:"${dataSource}",
-            },
-          }).then(res=>{
-          });
-          }-FORM-CREATE-SUFFIX]]`;
+         const dataMap  = {};
+         api.rule.forEach(item => {
+           if (item.searchValue && item.value !== undefined) {
+             if(item.type == 'upload'){
+              const uploadRecords = JSON.parse(sessionStorage.getItem('upload_row')) || [];
+              const urlToFileNameMap = {};
+              uploadRecords.forEach(record => {
+               if (record.url && record.fileName) {
+                  urlToFileNameMap[record.url] = record.fileName;
+               }
+              });
+              if (Array.isArray(item.value)) {
+               item.value = item.value.map(url => urlToFileNameMap[url] || url);
+              } else if (item.value && urlToFileNameMap[item.value]) {
+               item.value = [urlToFileNameMap[item.value]];
+                }
+             }
+             dataMap[item.searchValue] = item.value;
+           }else{
+             console.log('item1', item)
+           }
+         });
+         let pageId = localStorage.getItem('sharedPageId');
+         let data = {pageId:pageId,dataMap:dataMap}
+         console.log(data)
+           api.fetch({
+             action: "${url}api/mobilePageDesignData/normal/insertData",
+             method: 'post',
+             data: data,
+             dataType: 'json',
+             headers: {
+             dbname:"${dataSource}",
+           },
+         }).then(res=>{
+         });
+         }-FORM-CREATE-SUFFIX]]`;
       } else if (formCreateZkqyYMLX === 'update') {
         // 构建完整的onSubmit函数
         pageOptions.onSubmit = `[[FORM-CREATE-PREFIX-function onSubmit(formData, api) {
           const dataMap  = {};
+          const baseUrl = '${url}'.endsWith('/') ?'${url}'.slice(0, -1) : '${url}'; 
           api.rule.forEach(item => {
             if (item.searchValue && item.value !== undefined) {
               dataMap[item.searchValue] = item.value;
             }
           });
-          
+           api.rule.forEach(item => {
+           if (item.searchValue && item.value !== undefined) {
+             if(item.type == 'upload'){
+              const uploadRecords = JSON.parse(sessionStorage.getItem('upload_row')) || [];
+              const urlToFileNameMap = {};
+              uploadRecords.forEach(record => {
+               if (record.url && record.fileName) {
+                  urlToFileNameMap[record.url] = record.fileName;
+               }
+              });
+              if (Array.isArray(item.value)) {
+               item.value = item.value.map(url => urlToFileNameMap[url] || url);
+              } else if (item.value && urlToFileNameMap[item.value]) {
+               item.value = [urlToFileNameMap[item.value]];
+                }
+                
+             console.log('--item.value-',item.value)
+             let newValue = item.value;
+        if (Array.isArray(newValue)) {
+          newValue = newValue.map(url => {
+            if (typeof url === 'string') {
+              return url.startsWith(baseUrl) ? url.slice(baseUrl.length) : url;
+            }
+            return url;
+          });
+        } else if (typeof newValue === 'string') {
+          newValue = newValue.startsWith(baseUrl) ? newValue.slice(baseUrl.length) : newValue;
+        }
+
+        // 更新 item.value
+        item.value = newValue;
+
+             }
+             dataMap[item.searchValue] = item.value;
+           }else{
+             console.log('item1', item)
+           }
+         });
           let pageId = localStorage.getItem('sharedPageId');
           let data = {pageId:pageId,dataMap:dataMap}
 
@@ -556,7 +604,6 @@ export default {
           });
           }-FORM-CREATE-SUFFIX]]`;
       }
-
       this.$refs.designer.setOption(pageOptions);
     },
     // 保存调用的方法
@@ -564,7 +611,6 @@ export default {
       let dataSource = sessionStorage.getItem("dataSource");
       let optionsJP = JSON.parse(options)
       let ruleJP = JSON.parse(rule)
-      // console.log(ruleJP, optionsJP) // 表单规则和表单配置option
       let pageJson = ''//组件生成规则, 页面json数据
       let pageOptions = ''// 表单配置规则, 页面options数据
       let pageLink = ''// 预览链接
@@ -616,7 +662,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() 调用
@@ -624,8 +669,6 @@ export default {
             /Vue\.use\(ELEMENT\);\s*Vue\.use\(formCreate\);\s*/g,
             ""
           );
-          // let columns = this.$store.state.formCreate.labelData || []
-          // console.log(' this.zkqyTableColumns', this.zkqyTableColumns)
           let columns = this.zkqyTableColumns.map(item => ({
             prop: item.searchValue,
             label: item.columnName
@@ -633,33 +676,39 @@ 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){
+            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()
-
-          htmlData = htmlDataMb
+          htmlDataMbZkqyData = htmlDataMb
+          }
+          htmlData = htmlDataMbZkqyData
         }
         console.log('========encodeURIComponent前===================', htmlData)
         htmlData = encodeURIComponent(htmlData); // 关键编码步骤
         name = optionsJP.form.formName
+        console.log('JSON.stringify(pageJson)------------------',formCreate.toJson(pageJson))
         let data = {
-          pageJson: JSON.stringify(pageJson),
-          pageOptions: JSON.stringify(pageOptions),
+          pageJson: formCreate.toJson(pageJson),
+          pageOptions: formCreate.toJson(pageOptions),
           pageLink,
           componentData,
           htmlData,
-          name
+          name,
+          multipleTreeParam: JSON.stringify(this.multipleTables)
         };
         let res;
         if (this.mode == 3) {
@@ -679,7 +728,6 @@ export default {
             path: "/ydyq/formCreate",
           });
         } else {
-          console.err('----')
         }
       }
     },
@@ -688,15 +736,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 +770,6 @@ export default {
         opt,
         rule: formCreate.toJson(rule)
       }));
-
     },
     showTemplate() {
       this.state = true;
@@ -827,6 +880,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[]
             {
@@ -848,8 +922,56 @@ export default {
         )
       });
     },
+    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)
+      console.log('e---------',e,gLSJB)
       if (gLSJB) {
         let data = {
           databaseName: this.databaseName,
@@ -931,43 +1053,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 +1122,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 +1399,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 +1575,6 @@ body {
   flex-direction: column !important;
 }
 
-/* #app {
-    display: flex;
-    flex-direction: column;
-    flex: 1;
-} */
 
 ._fc-copyright {
   display: flex;
@@ -1601,4 +1741,13 @@ body {
   flex: 1;
   margin-right: 10px;
 }
+</style>
+<style scoped>
+.optionDataDisplay>>>.el-dialog__body {
+  padding-top: 0px !important;
+}
+
+.optionDataDisplay>>>.el-dialog {
+  width: 80%;
+}
 </style>

+ 19 - 18
zkqy-ui/src/views/formCreate/layout/home/index.vue

@@ -7,25 +7,25 @@
     <!-- 中间渲染 -->
     <el-table v-loading="loading" :data="tableList" ref="tableRef" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="页面主键" align="center" prop="id" />
-      <el-table-column label="页面名称" align="center" prop="name" />
-      <el-table-column label="页面Vue模板" align="center" prop="pageJson" show-overflow-tooltip />
-      <el-table-column label="页面Html模板" align="center" prop="htmlData" show-overflow-tooltip />
-      <el-table-column label="页面选项" align="center" prop="pageOptions" show-overflow-tooltip />
-      <el-table-column label="绑定表名" align="center" prop="table_name" show-overflow-tooltip />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column :label="$t('formCreate.pageKey')" align="center" prop="id" />
+      <el-table-column :label="$t('formCreate.pageName')" align="center" prop="name" />
+      <el-table-column :label="$t('formCreate.pageJson')" align="center" prop="pageJson" show-overflow-tooltip />
+      <el-table-column :label="$t('formCreate.htmlTemplate')" align="center" prop="htmlData" show-overflow-tooltip />
+      <el-table-column :label="$t('formCreate.pageOptions')" align="center" prop="pageOptions" show-overflow-tooltip />
+      <el-table-column :label="$t('formCreate.boundTable')" align="center" prop="table_name" show-overflow-tooltip />
+      <el-table-column :label="$t('formCreate.operation')" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('formCreate.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
-                <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改
+                <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">{{ $t('formCreate.modify') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
-                <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除
+                <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">{{ $t('formCreate.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -56,10 +56,10 @@ export default {
     return {
       //输入框配置
       formItems: [{
-        label: '页面名称',
+        label: this.$t('formCreate.pageName'),
         prop: 'name',
         attrs: {
-          placeholder: '请输入页面名称',
+          placeholder: this.$t('formCreate.pleaseEnterPageName'),
           clearable: true,
         },
       }],
@@ -78,6 +78,7 @@ export default {
       // 选中数组(包含所有数据)
       selection: [],
       // 标记,判断是编辑还是新增跳转,2增加3修改
+      mode: 4,
       // 表格 start
       loading: true,
       tableList: [],
@@ -94,7 +95,7 @@ export default {
     buttons() {
       return [
         {
-          label: '新增',
+          label: this.$t('formCreate.add'),
           type: 'primary',
           plain: true,
           icon: 'el-icon-plus',
@@ -102,7 +103,7 @@ export default {
           click: this.handleAdd,
         },
         {
-          label: '修改',
+          label: this.$t('formCreate.modify'),
           type: 'success',
           plain: true,
           icon: 'el-icon-edit',
@@ -111,7 +112,7 @@ export default {
           click: this.handleUpdate,
         },
         {
-          label: '删除',
+          label: this.$t('formCreate.delete'),
           type: 'danger',
           plain: true,
           icon: 'el-icon-delete',
@@ -172,7 +173,7 @@ export default {
     /* 删除 */
     handleBatchDelete() {
       if (this.selection.length === 0) {
-        this.$message.warning('请先选择要删除的记录');
+        this.$message.warning(this.$t('formCreate.pleaseSelectDelete'));
         return;
       }
       let str = this.selection.map(item => item.id).join(',');
@@ -183,7 +184,7 @@ export default {
       console.log('menuIds', menuIds)
       this.$modal
         .confirm(
-          '是否确认删除编号为"' +
+          this.$t('formCreate.confirmDelete') +
           str +
           '"的数据项?'
         )
@@ -213,7 +214,7 @@ export default {
       console.log('删除按钮被点击', row.id, row);
       this.$modal
         .confirm(
-          '是否确认删除编号为"' +
+          this.$t('formCreate.confirmDelete') +
           row.id +
           '"的数据项?'
         )

+ 39 - 45
zkqy-ui/src/views/formCreate/layout/home/navigationBar.vue

@@ -11,23 +11,23 @@
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="主键" align="center" prop="id" />
 <!--      <el-table-column label="绑定页面id" align="center" prop="pageId" />-->
-      <el-table-column label="导航条名称" align="center" prop="name" />
-      <el-table-column label="绑定页面名称" align="center" prop="pageName" />
-      <el-table-column label="导航条顺序" align="center" prop="barOrder" />
+      <el-table-column :label="$t('navigationBar.name')" align="center" prop="name" />
+      <el-table-column :label="$t('navigationBar.pageName')" align="center" prop="pageName" />
+      <el-table-column :label="$t('navigationBar.barOrder')" align="center" prop="barOrder" />
 <!--      <el-table-column label="绑定页面类型" align="center" prop="type" />-->
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column :label="$t('normal.operation')" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('navigationBar.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
-                <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改
+                <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">{{ $t('navigationBar.modify') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
-                <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除
+                <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">{{ $t('navigationBar.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -41,26 +41,26 @@
 
     <el-dialog :title="title" :visible.sync="open" width="550px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" class="dialog_form">
-        <el-form-item label="导航条名称" prop="name">
-          <el-input v-model="form.name" placeholder="请输入导航条名称" />
+        <el-form-item :label="$t('navigationBar.name')" prop="name">
+          <el-input v-model="form.name" :placeholder="$t('navigationBar.pleaseEnterName')" />
         </el-form-item>
-        <el-form-item label="绑定页面" prop="pageId">
-          <el-select v-model="form.pageId" placeholder="请选择绑定页面">
+        <el-form-item :label="$t('navigationBar.pageId')" prop="pageId">
+          <el-select v-model="form.pageId" :placeholder="$t('navigationBar.pleaseSelectPage')">
             <el-option v-for="item in listAllMobilePageDesignData" :key="item.value" :label="item.label"
               :value="item.value">
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="导航条顺序" prop="barOrder">
-          <el-input v-model.number="form.barOrder" type="number" min="1" placeholder="请输入导航条顺序" />
+        <el-form-item :label="$t('navigationBar.barOrder')" prop="barOrder">
+          <el-input v-model.number="form.barOrder" type="number" min="1" :placeholder="$t('navigationBar.pleaseEnterBarOrder')" />
         </el-form-item>
 <!--        <el-form-item label="绑定页面类型" prop="type">-->
 <!--          <el-input v-model="form.type" placeholder="请输入绑定页面类型" />-->
 <!--        </el-form-item>-->
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">{{ $t('normal.save') }}</el-button>
+        <el-button @click="cancel">{{ $t('normal.close') }}</el-button>
       </div>
     </el-dialog>
 
@@ -82,17 +82,17 @@ export default {
     return {
       //上层输入框配置
       formItems: [{
-        label: '导航条名称',
+        label: this.$t('navigationBar.name'),
         prop: 'name',
         attrs: {
-          placeholder: '请输入导航条名称',
+          placeholder: this.$t('navigationBar.pleaseEnterName'),
           clearable: true,
         },
       }, {
-        label: '页面名称',
+        label: this.$t('navigationBar.pageName'),
         prop: 'pageName',
         attrs: {
-          placeholder: '请输入页面名称',
+          placeholder: this.$t('navigationBar.pleaseEnterPageName'),
           clearable: true,
         },
       }],
@@ -138,17 +138,17 @@ export default {
       // 表单校验
       rules: {
         pageId: [
-          { required: true, message: "页面id不能为空", trigger: "blur" },
+          { required: true, message: this.$t('navigationBar.pageIdRequired'), trigger: "blur" },
         ],
         name: [
-          { required: true, message: "导航条名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('navigationBar.nameRequired'), trigger: "blur" },
         ],
         barOrder: [
-          { required: true, message: "导航条顺序不能为空", trigger: "blur" },
+          { required: true, message: this.$t('navigationBar.barOrderRequired'), trigger: "blur" },
           {
             validator: (rule, value, callback) => {
               if (value <= 0) {
-                callback(new Error("导航条顺序必须大于 0"));
+                callback(new Error(this.$t('navigationBar.barOrderMustGreaterThanZero')));
               } else {
                 callback();
               }
@@ -165,7 +165,7 @@ export default {
     buttons() {
       return [
         {
-          label: '新增',
+          label: this.$t('navigationBar.add'),
           type: 'primary',
           plain: true,
           icon: 'el-icon-plus',
@@ -173,7 +173,7 @@ export default {
           click: this.handleAdd,
         },
         {
-          label: '修改',
+          label: this.$t('navigationBar.edit'),
           type: 'success',
           plain: true,
           icon: 'el-icon-edit',
@@ -182,7 +182,7 @@ export default {
           click: this.handleUpdate,
         },
         {
-          label: '删除',
+          label: this.$t('navigationBar.delete'),
           type: 'danger',
           plain: true,
           icon: 'el-icon-delete',
@@ -191,7 +191,7 @@ export default {
           click: this.handleBatchDelete,
         },
         {
-          label: '导出',
+          label: this.$t('navigationBar.export'),
           type: 'warning',
           plain: true,
           icon: 'el-icon-download',
@@ -289,7 +289,7 @@ export default {
     /* 删除 */
     handleBatchDelete() {
       if (this.selection.length === 0) {
-        this.$message.warning('请先选择要删除的记录');
+        this.$message.warning(this.$t('navigationBar.pleaseSelectRecord'));
         return;
       }
       let str = this.selection.map(item => item.id).join(',');
@@ -300,19 +300,17 @@ export default {
       console.log('menuIds', menuIds)
       this.$modal
         .confirm(
-          '是否确认删除编号为"' +
-          str +
-          '"的数据项?'
+          this.$t('navigationBar.confirmDelete') + '"' + str + '"的数据项?'
         )
         .then(async () => {
-          for (let item of strList) { // 使用 for...of 循环
+          for (let item of strList) {
             try {
               let res = await delMobilePageNavigationBar(item);
               console.log('[res]', res)
               if (res.code == 200) {
-                this.$modal.msgSuccess("删除成功");
+                this.$modal.msgSuccess(this.$t('navigationBar.deleteSuccess'));
               } else {
-                this.$modal.msgSuccess("删除失败");
+                this.$modal.msgSuccess(this.$t('navigationBar.deleteFailed'));
               }
               this.getList();
             } catch (error) {
@@ -320,8 +318,7 @@ export default {
               return Promise.reject(error); // 错误发生时抛出异常
             }
           }
-        }
-        ).catch((e) => {
+        }).catch((e) => {
           console.log(e);
         });
     },
@@ -329,20 +326,17 @@ export default {
       console.log('删除按钮被点击', row.id, row);
       this.$modal
         .confirm(
-          '是否确认删除编号为"' +
-          row.id +
-          '"的数据项?'
+          this.$t('navigationBar.confirmDelete') + '"' + row.id + '"的数据项?'
         )
         .then(async () => {
           let res = await delMobilePageNavigationBar(row.id);
           if (res.code == 200) {
-            this.$modal.msgSuccess("删除成功");
+            this.$modal.msgSuccess(this.$t('navigationBar.deleteSuccess'));
           } else {
-            this.$modal.msgSuccess("删除失败");
+            this.$modal.msgSuccess(this.$t('navigationBar.deleteFailed'));
           }
           this.getList();
-        }
-        )
+        })
         .catch((e) => {
           console.log(e);
         });
@@ -374,13 +368,13 @@ export default {
           this.form.pageName = select
           if (this.form.id != null) {
             updateMobilePageNavigationBar(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('navigationBar.editSuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addMobilePageNavigationBar(this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('navigationBar.addSuccess'));
               this.open = false;
               this.getList();
             });

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

@@ -226,19 +226,15 @@ var zkqyTable = {
             await this.fetchGet(endpoint , params,(data) => {
                 if (data.code === 200) {
                         const decodedHtml = decodeURIComponent(data.data.htmlData);
-                
-                        // 创建全屏 iframe
                         const iframe = document.createElement('iframe');
                         iframe.srcdoc = decodedHtml;
                         iframe.style.width = '100%';
                         iframe.style.height = '100vh';
                         iframe.style.border = 'none';
-                        
-                        // 清空页面并插入 iframe
                         document.body.innerHTML = '';
                         document.body.appendChild(iframe);
                         // 将 pageId 存储到 localStorage
-                        localStorage.setItem('sharedPageId', pageId);   
+                        localStorage.setItem('sharedPageId', this.pageId);   
                     }
             });
         },

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

@@ -406,7 +406,173 @@ export default {
 <\/script>`;
 }
 
-export function htmlTemplate(json, options) {
+export function htmlTemplate(json, options, zkqyData,dataSource,url) {
+// console.log(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},
+                        zkqyUpload:[],
+                    };
+                },
+                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();
+                            const targetRule = this.rule.find(item => item._fc_id === id);
+                              if (type === 'tree') {
+                                 this.$set(targetRule?.props, 'data', result.data);
+                              }
+                              else if(type === 'cascader'){
+                                this.$set(targetRule.props, 'options', result.data);
+
+                              }else if(type === 'elTransfer'){
+                                this.$set(targetRule.props, 'data', result.data);
+                              }else {
+                                this.$set(targetRule, 'options', result.data);
+                              }
+                              this.rule =formCreate.parseJson(formCreate.toJson([...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() {
+                    if (sessionStorage.getItem('upload_row')) {
+                        sessionStorage.removeItem('upload_row');
+                        console.log('已清空 sessionStorage 中的 upload_row');
+                    }
+                    this.rule.forEach(ruleItem => {
+                        if(ruleItem.type=="upload"){
+                          console.log('ruleItem',ruleItem)
+                          console.log('this.rule ',this.rule )
+                          if(ruleItem?.value?.length>0){
+                            const processedUrl = '${url}'.endsWith('/') ?'${url}'.slice(0, -1) : '${url}'; // 如果 url 最后一个字符是斜杠,则去掉它
+                            console.log('processedUrl',processedUrl)
+                            ruleItem.value = ruleItem?.value.map(
+                                item => processedUrl+item
+                              );
+                          }
+                          console.log(' ruleItem.value ', ruleItem.value  )
+
+                        //   this.rule =formCreate.parseJson(formCreate.toJson([...this.rule])); // 触发重新渲染
+                          ruleItem.props.onSuccess="[[FORM-CREATE-PREFIX-function onSuccess(res, file){const key='upload_row';const existingData=sessionStorage.getItem(key);let fileList=existingData?JSON.parse(existingData):[];if(!Array.isArray(fileList)){fileList=[];}const newItem={fileName: file.response.fileName, url: file.url};fileList.push(newItem);sessionStorage.setItem(key,JSON.stringify(fileList));}-FORM-CREATE-SUFFIX]]"
+                        }
+                      })
+                    let zkqyData = this.zkqyData
+                    if(zkqyData && zkqyData?.length>0){
+                        console.log('[this.rule]',this.rule)
+                        this.rule.forEach(ruleItem => {
+                        const matchedData = zkqyData.find(dataItem => dataItem._fc_id === ruleItem._fc_id);
+                        if (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 +612,6 @@ export function htmlTemplate(json, options) {
     </body>
 </html>`
 }
-
 export function escapeRegExp(str) {
     return str.replace(/[\ .*+?^${}()|[\]\\]/g, '\\$&');
 }

+ 79 - 35
zkqy-ui/src/views/index.vue

@@ -1,5 +1,6 @@
 <template>
   <div class="app-container home">
+
     <!-- <el-row :gutter="20"></el-row>
     <el-row :gutter="20"></el-row>
     <el-divider/>
@@ -50,7 +51,7 @@
     </el-row> -->
     <div class="info-content">
       <!-- <div class="header" @click="toPersonalCenter"> -->
-        <!-- <img :src="avatar" class="user-avatar" /> -->
+      <!-- <img :src="avatar" class="user-avatar" /> -->
       <!-- </div> -->
       <!-- <div class="name">{{ nickName }}</div>
       <div class="tenant-name">{{ tenantName }}</div>
@@ -61,9 +62,9 @@
       <div class="echarts1">
         <div class="pieChart" ref="pieChart"></div>
         <div
-          :class="'describe' + (parseInt(index) + 1)"
-          v-for="(item, index) in processList"
-          :key="index"
+            :class="'describe' + (parseInt(index) + 1)"
+            v-for="(item, index) in processList"
+            :key="index"
         >
           <P class="text">{{ item.name }}</P>
           <P class="num">{{ item.value }}</P>
@@ -73,9 +74,9 @@
         <div class="lineChart" ref="lineChart"></div>
       </div>
       <div class="echarts3">
-        <p class="title">操作日志</p>
+        <p class="title">{{ $t('statistics.operationLog') }}</p>
         <div class="text">
-          <span class="peo">操作人</span>
+          <span class="peo">{{ $t('statistics.operator') }}</span>
           <span class="add">ip</span>
         </div>
         <div class="swiper-container">
@@ -113,6 +114,7 @@ import {
   getTabular,
   getData,
 } from "@/api/homePage/index";
+import Cookies from 'js-cookie'
 
 export default {
   name: "Index",
@@ -203,13 +205,30 @@ export default {
 
       //登录次数统计
       getLogin().then(response => {
-        if(response.code == 200){
-          let xAxisData = response.data[0].date
+        if (response.code == 200) {
+          let xAxisData = response.data[0].date;
+
           xAxisData = xAxisData.map(function (dateStr) {
-            var date = new Date(dateStr);
-            return date.getMonth() + 1 + "月" + date.getDate() + "日";
+            const date = new Date(dateStr);
+            const language = Cookies.get("language") || 'zh_CN'; // 默认 zh_CN
+
+            // 手动格式化日期
+            const month = date.getMonth() + 1; // 月份(0-11 → 1-12)
+            const day = date.getDate();        // 日(1-31)
+
+            // 根据不同语言返回不同格式
+            switch (language) {
+              case 'zh_CN':
+                return `${month}月${day}日`;   // 1月1日
+              case 'en_US':
+                return `${month}/${day}`;      // 1/1
+              default:
+                return `${month}/${day}`;      // 默认英文格式
+            }
           });
-          let loginList = response.data.map((item)  => item.name);
+
+          // 更新图表数据
+          let loginList = response.data.map(item => item.name);
           this.chartObj.myChart2.setOption({
             xAxis: {
               data: xAxisData
@@ -218,12 +237,12 @@ export default {
               data: loginList
             },
             series: response.data
-          })
+          });
         } else {
           console.log(response);
           this.$message.error("获取数据失败");
         }
-      })
+      });
 
       //登录统计信息
       getOperation().then(response => {
@@ -256,7 +275,7 @@ export default {
       getTabular().then(response => {
         if(response.code == 200){
           let tabularList = response.data
-          tabularList.push({ name: '多表数量', value: 30 })
+          tabularList.push({ name: this.$t('statistics.multiTableQuantity'), value: 30 })
           let labelList = response.data.map((item) => item.name)
           this.chartObj.myChart3.setOption({
             yAxis: {
@@ -298,7 +317,7 @@ export default {
       let option = {
         color: ["#9370db", "#ffd700", "#00ccff", "#ff6600", "#ff9900"],
         title: {
-          text: '流程统计',
+          text: this.$t('statistics.workflowStatistics'),
           left: 'left',
           textStyle: {
             fontSize: 16,
@@ -326,8 +345,8 @@ export default {
             right: '40%',
             top: '50%',
             data: [
-              { value: 10, name: '工艺流' },
-              { value: 20, name: '审批流' },
+              { value: 10, name: this.$t('statistics.processFlow') },
+              { value: 20, name: this.$t('statistics.approvalFlow') },
             ],
             label: {
               show: false,
@@ -349,12 +368,12 @@ export default {
       this.chartObj.myChart1.setOption(option);
     },
 
-    initChart2(){
+    initChart2() {
       this.chartObj.myChart2 = this.$echarts.init(this.$refs.lineChart);
       let option = {
         color: ["#FF88E0", "#9FE080"],
         title: {
-          text: '用户登录统计',
+          text: this.$t('statistics.userLoginStatistics'),
           textStyle: {
             fontSize: 16,
             fontWeight: 'normal',
@@ -365,7 +384,7 @@ export default {
           trigger: 'axis'
         },
         legend: {
-          data: ['客户端11', '工具端11']
+          data: [this.$t('statistics.client'), this.$t('statistics.toolEnd')]
         },
         grid: {
           left: '3%',
@@ -390,13 +409,13 @@ export default {
         },
         series: [
           {
-            name: '客户端',
+            name: this.$t('statistics.client'),
             type: 'line',
             smooth: true,
             data: [10, 23, 42, 13, 30, 25, 40, 30, 42, 55, 40, 28, 20, 30, 45, 25, 20, 30, 40, 33, 35, 40, 46, 31, 13, 34, 20, 10, 36, 43]
           },
           {
-            name: '工具端',
+            name: this.$t('statistics.toolEnd'),
             type: 'line',
             smooth: true,
             data: [20, 30, 29, 40, 55, 33, 30, 26, 36, 45, 50, 34, 38, 25, 28, 43, 16, 30, 45, 52, 40, 46, 33, 57, 50, 33, 40, 59, 56, 56]
@@ -406,12 +425,12 @@ export default {
       this.chartObj.myChart2.setOption(option);
     },
 
-    initChart3(){
+    initChart3() {
       this.chartObj.myChart3 = this.$echarts.init(this.$refs.gaugeChart);
       let option = {
-        color: ["#00ccff", "#ff6600", "#ff9900","#9370db", "#ffd700"],
+        color: ["#00ccff", "#ff6600", "#ff9900", "#9370db", "#ffd700"],
         title: {
-          text: '表格统计',
+          text: this.$t('statistics.tableStatistics'),
           left: 'left',
           textStyle: {
             fontSize: 16,
@@ -470,12 +489,12 @@ export default {
       this.chartObj.myChart3.setOption(option);
     },
 
-    initChart4(){
+    initChart4() {
       this.chartObj.myChart4 = this.$echarts.init(this.$refs.barChart);
       let option = {
         color: ["#5D84FE"],
         title: {
-          text: '数据建模统计',
+          text: this.$t('statistics.dataModelingStatistics'),
           textStyle: {
             fontSize: 16,
             fontWeight: 'normal',
@@ -490,7 +509,7 @@ export default {
         },
         xAxis: {
           type: 'category',
-          data: ['数据建模'],
+          data: [this.$t('statistics.dataModeling')],
         },
         yAxis: {
           type: 'value',
@@ -523,7 +542,6 @@ export default {
       this.chartObj.myChart4.setOption(option);
     },
 
-
     /** 导入按钮操作 */
     handleImport() {
       this.upload.title = "用户导入";
@@ -532,9 +550,9 @@ export default {
     /** 下载模板操作 */
     importTemplate() {
       this.download(
-        "system/user/importTemplate",
-        {},
-        `user_template_${new Date().getTime()}.xlsx`
+          "system/user/importTemplate",
+          {},
+          `user_template_${new Date().getTime()}.xlsx`
       );
     },
     // 文件上传中处理
@@ -547,11 +565,11 @@ export default {
       this.upload.isUploading = false;
       this.$refs.upload.clearFiles();
       this.$alert(
-        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+          "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
           response.msg +
           "</div>",
-        "导入结果",
-        { dangerouslyUseHTMLString: true }
+          "导入结果",
+          { dangerouslyUseHTMLString: true }
       );
       this.getList();
     },
@@ -595,6 +613,7 @@ export default {
     display: flex;
     flex-direction: row;
     flex-wrap: wrap;
+
     .echarts1 {
       position: relative;
       width: 20%;
@@ -604,16 +623,19 @@ export default {
       box-shadow: 10px 10px 5px #E0E0E0;
       background-color: #fff;
       border-radius: 10px;
+
       .pieChart {
         width: 100%;
         height: 100%;
       }
+
       .describe1 {
         .text {
           position: absolute;
           left: 50px;
           top: 90px;
         }
+
         .num {
           position: absolute;
           font-size: 20px;
@@ -622,12 +644,14 @@ export default {
           top: 55px;
         }
       }
+
       .describe2 {
         .text {
           position: absolute;
           left: 157px;
           top: 90px;
         }
+
         .num {
           position: absolute;
           font-size: 20px;
@@ -637,6 +661,7 @@ export default {
         }
       }
     }
+
     .echarts2 {
       width: 76%;
       height: 280px;
@@ -646,11 +671,13 @@ export default {
       background-color: #fff;
       border-radius: 10px;
       margin-right: 30px;
+
       .lineChart {
         width: 100%;
         height: 100%;
       }
     }
+
     .echarts3 {
       width: 23%;
       height: 200px;
@@ -660,17 +687,21 @@ export default {
       background-color: #fff;
       border-radius: 10px;
       margin-top: 20px;
+
       p {
         margin: 0;
       }
+
       .title {
         font-size: 16px;
         color: '#696969'
       }
+
       .text {
         display: flex;
         flex-direction: row;
         margin-top: 10px;
+
         .peo {
           font-size: 14px;
           color: black;
@@ -678,12 +709,14 @@ export default {
           margin-left: 20px;
           margin-right: 120px;
         }
+
         .add {
           font-size: 14px;
           color: black;
           font-weight: bold;
         }
       }
+
       .swiper-container {
         display: flex;
         flex-direction: row;
@@ -692,18 +725,21 @@ export default {
         height: 80px;
         /* overflow: auto; */
         margin-top: 10px;
+
         .name {
           text-align: center;
           font-size: 16px;
           margin-left: 2px;
           margin-right: 59px;
         }
+
         .ip {
           text-align: center;
           font-size: 16px;
         }
       }
     }
+
     .echarts4 {
       width: 48%;
       height: 200px;
@@ -713,11 +749,13 @@ export default {
       background-color: #fff;
       border-radius: 10px;
       margin-top: 20px;
+
       .gaugeChart {
         width: 100%;
         height: 100%;
       }
     }
+
     .echarts5 {
       width: 25%;
       height: 200px;
@@ -728,11 +766,13 @@ export default {
       border-radius: 10px;
       margin-top: 20px;
       margin-right: 30px;
+
       .barChart {
         width: 100%;
         height: 100%;
       }
     }
+
     /* .header {
       white-space: nowrap;
       margin-bottom: 5px;
@@ -746,18 +786,22 @@ export default {
       font-size: 30px;
       margin-bottom: 5px;
     }
+
     .tenant-name {
       font-size: 20px;
     }
+
     .date {
       margin-bottom: 10px;
     }
+
     .title {
       /* // font-size: 16px; */
       font-size: 20px;
     }
   }
 }
+
 .home {
   blockquote {
     padding: 10px 20px;

+ 1 - 1
zkqy-ui/src/views/loading.vue

@@ -4,7 +4,7 @@
       <div id="loader"></div>
       <div class="loader-section section-left"></div>
       <div class="loader-section section-right"></div>
-      <div class="load_title">正在加载系统资源,请耐心等待</div>
+      <div class="load_title">正在加载系统资源,请耐心等待123</div>
     </div>
   </div>
 </template>

+ 86 - 58
zkqy-ui/src/views/login.vue

@@ -2,60 +2,62 @@
   <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">{{ $t('login.loginDescription') }}</span>
     </div>
+
     <el-form
-      ref="loginForm"
-      :model="loginForm"
-      :rules="loginRules"
-      class="login-form"
+        ref="loginForm"
+        :model="loginForm"
+        :rules="loginRules"
+        class="login-form"
     >
       <el-row>
         <el-col :span="12" class="comlogo"></el-col>
-        <el-col :span="12">
-          <div class="grid-content bg-purple-dark title">
-            · {{ config.loginPageTitle || "工业应用引擎" }}
-            <!-- 智能制造平台  工联院-->
-            <!-- 工业应用引擎  -->
+        <el-col :span="12" class="right-col">
+          <div class="grid-content bg-purple-dark title flexClass">
+            <div class="title-text">{{ config.loginPageTitle || $t('login.title') }}</div>
+            <div class="set-language"><lang-select /></div>
           </div>
         </el-col>
       </el-row>
+
       <el-row class="rowww">
-        <el-col :span="12" class="text" prop="username">用户名</el-col>
+        <!--        {{$t('login.title')}}-->
+        <el-col :span="12" class="text" prop="username">{{$t('login.username')}}</el-col>
         <el-input
-          v-model="loginForm.username"
-          type="text"
-          auto-complete="off"
-          placeholder="账号"
-          class="inputt"
-          @blur="handleBlur"
+            v-model="loginForm.username"
+            type="text"
+            auto-complete="off"
+            :placeholder="$t('login.username')"
+            class="input"
+            @blur="handleBlur"
         />
       </el-row>
       <el-row class="roww">
-        <el-col :span="12" class="text" prop="password">密码</el-col>
+        <el-col :span="12" class="text" prop="password">{{$t('login.password')}}</el-col>
         <el-input
-          v-model="loginForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleLogin"
-          show-password
-          class="inputt"
+            v-model="loginForm.password"
+            type="password"
+            auto-complete="off"
+            :placeholder="$t('login.password')"
+            @keyup.enter.native="handleLogin"
+            show-password
+            class="inputt"
         >
         </el-input>
       </el-row>
       <el-row class="roww">
         <el-row>
-          <el-col class="text" prop="code">验证码</el-col>
+          <el-col class="text" prop="code">{{$t('login.code')}}</el-col>
         </el-row>
         <el-row>
           <el-col :span="18">
             <el-input
-              v-model="loginForm.code"
-              auto-complete="off"
-              placeholder="验证码"
-              @keyup.enter.native="handleLogin"
-              class="inputt"
+                v-model="loginForm.code"
+                auto-complete="off"
+                :placeholder="$t('login.code')"
+                @keyup.enter.native="handleLogin"
+                class="inputt"
             >
             </el-input>
           </el-col>
@@ -72,16 +74,16 @@
           <img :src="codeUrl" @click="getCode" class="login-code-img" />
         </div> -->
         <el-checkbox v-model="loginForm.rememberMe" class="aaa"
-          >在这个设备上记住我
+        >{{$t('login.rememberMe')}}
         </el-checkbox>
       </el-row>
 
       <el-row>
         <el-col
-          class="logg"
-          :loading="loading"
-          @click.native.prevent="handleLogin"
-          >登录
+            class="logg"
+            :loading="loading"
+            @click.native.prevent="handleLogin"
+        >{{$t('login.logIn')}}
         </el-col>
       </el-row>
     </el-form>
@@ -93,9 +95,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: "",
@@ -113,12 +116,12 @@ export default {
       },
       loginRules: {
         username: [
-          { required: true, trigger: "blur", message: "请输入您的账号" },
+          { required: true, trigger: "blur", message: this.$t('login.pleaseEnterUsername') },
         ],
         password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" },
+          { required: true, trigger: "blur", message: this.$t('login.pleaseEnterPassword') },
         ],
-        code: [{ required: true, trigger: "blur", message: "请输入验证码" }],
+        code: [{ required: true, trigger: "blur", message: this.$t('login.pleaseEnterCode') }],
       },
       loading: true,
       // 验证码开关
@@ -142,6 +145,8 @@ export default {
     this.clearSession();
     this.validateTenantId();
     this.getCode();
+    this.$i18n.locale =  Cookies.get('language') || 'zh_CN'
+    // this.$i18n.locale = "en"
   },
   methods: {
     clearSession() {
@@ -199,7 +204,7 @@ export default {
         let loginBgDom = document.getElementsByClassName("login");
         if (loginBgDom.length > 0) {
           loginBgDom[0].style.backgroundImage = `url(${
-            process.env.VUE_APP_BASE_IMG_API + loginPageBackgroundImage
+              process.env.VUE_APP_BASE_IMG_API + loginPageBackgroundImage
           })`;
         }
       }
@@ -209,7 +214,7 @@ export default {
         let loginLogoDom = document.getElementsByClassName("comlogo");
         if (loginLogoDom.length > 0) {
           loginLogoDom[0].style.backgroundImage = `url(${
-            process.env.VUE_APP_BASE_IMG_API + loginPageLogo
+              process.env.VUE_APP_BASE_IMG_API + loginPageLogo
           })`;
         }
         window.sessionStorage.setItem("logo", loginPageLogo);
@@ -236,7 +241,7 @@ export default {
     getCode() {
       getCodeImg().then((res) => {
         this.captchaEnabled =
-          res.captchaEnabled === undefined ? true : res.captchaEnabled;
+            res.captchaEnabled === undefined ? true : res.captchaEnabled;
         if (this.captchaEnabled) {
           this.codeUrl = "data:image/gif;base64," + res.img;
           this.loginForm.uuid = res.uuid;
@@ -250,7 +255,7 @@ export default {
       this.loginForm = {
         username: username === undefined ? this.loginForm.username : username,
         password:
-          password === undefined ? this.loginForm.password : decrypt(password),
+            password === undefined ? this.loginForm.password : decrypt(password),
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
       };
     },
@@ -277,17 +282,17 @@ export default {
             tenantID: this.tenantId,
           };
           this.$store
-            .dispatch("Login", form)
-            .then(() => {
-              // changeDatasource(); //切换数据源
-              this.$router.push({ path: this.redirect || "/" }).catch(() => {});
-            })
-            .catch(() => {
-              this.loading = false;
-              if (this.captchaEnabled) {
-                this.getCode();
-              }
-            });
+              .dispatch("Login", form)
+              .then(() => {
+                // changeDatasource(); //切换数据源
+                this.$router.push({ path: this.redirect || "/" }).catch(() => {});
+              })
+              .catch(() => {
+                this.loading = false;
+                if (this.captchaEnabled) {
+                  this.getCode();
+                }
+              });
         }
       });
     },
@@ -345,9 +350,9 @@ export default {
   opacity: 1;
   border-radius: 27px;
   background: linear-gradient(
-    135deg,
-    rgba(79, 138, 255, 1) 0%,
-    rgba(75, 94, 255, 1) 100%
+          135deg,
+          rgba(79, 138, 255, 1) 0%,
+          rgba(75, 94, 255, 1) 100%
   );
   box-shadow: 0px 4px 16px rgba(179, 192, 231, 1);
   color: #fff;
@@ -453,6 +458,7 @@ export default {
   height: 35px;
   margin-top: 70px;
   margin-left: 8px;
+  //margin-right: 20px;
   font-size: 22px;
   font-weight: 400;
   letter-spacing: 2px;
@@ -467,6 +473,26 @@ export default {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+.right-col {
+  display: flex;
+  justify-content: flex-end; /* 或 center 根据需求调整 */
+  width: auto;
+}
+
+.flexClass {
+  display: flex;
+  align-items: center;
+  gap: 20px; /* 控制标题和语言选择器之间的间距 */
+  width: 100%; /* 确保容器占满父元素 */
+}
+
+.title-text {
+  white-space: nowrap; /* 防止标题换行 */
+}
+
+.set-language {
+  flex-shrink: 0; /* 防止语言选择器被压缩 */
+}
 
 .login-form {
   margin-left: 44%;
@@ -485,7 +511,9 @@ export default {
   opacity: 1;
 }
 
+
 .el-col-18 {
   width: 66%;
 }
+
 </style>

+ 92 - 102
zkqy-ui/src/views/relateTable/index.vue

@@ -9,10 +9,10 @@
       label-width="68px"
       @submit.native.prevent
     >
-      <el-form-item label="表格组名" prop="dtName">
+      <el-form-item :label="$t('relateTable.tableGroupName')" prop="dtName">
         <el-input
           v-model="queryParams.dtName"
-          placeholder="请输入表格组名"
+          :placeholder="$t('relateTable.enterTableGroupName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -23,10 +23,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('relateTable.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('relateTable.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -39,7 +39,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          >新增</el-button
+          >{{ $t('relateTable.add') }}</el-button
         >
       </el-col>
 
@@ -51,7 +51,7 @@
           size="mini"
           :disabled="multiple"
           @click="DeleteTableGroup"
-          >删除</el-button
+          >{{ $t('relateTable.delete') }}</el-button
         >
       </el-col>
       <!-- <el-col :span="1.5">
@@ -68,11 +68,11 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="表格主键" align="center" prop="id" />
-      <el-table-column label="表格组名" align="center" prop="groupName" />
-      <el-table-column label="描述" align="center" prop="groupDescription" />
-      <el-table-column label="表格数" align="center" prop="groupCount" />
-      <el-table-column label="成员表格" width="180">
+      <el-table-column :label="$t('relateTable.tablePrimaryKey')" align="center" prop="id" />
+      <el-table-column :label="$t('relateTable.tableGroupName')" align="center" prop="groupName" />
+      <el-table-column :label="$t('relateTable.description')" align="center" prop="groupDescription" />
+      <el-table-column :label="$t('relateTable.tableCount')" align="center" prop="groupCount" />
+      <el-table-column :label="$t('relateTable.memberTables')" width="180">
         <template slot-scope="scope">
           <el-popover trigger="hover" placement="top">
             <p v-for="(item, index) in scope.row.groupTableInfo" :key="index">
@@ -89,14 +89,14 @@
       </el-table-column>
 
       <el-table-column
-        label="操作"
+        :label="$t('relateTable.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('relateTable.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -105,7 +105,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="UpdateTableGroup(scope.row)"
-                  >修改
+                  >{{ $t('relateTable.modify') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -114,7 +114,7 @@
                   type="text"
                   icon="el-icon-delete"
                   @click="DeleteTableGroup(scope.row)"
-                  >删除
+                  >{{ $t('relateTable.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -133,7 +133,7 @@
 
     <!-- 新增联动表格组弹窗 -->
     <el-dialog
-      :title="groupTitle ? '新增动态表格组' : '修改动态表格组'"
+      :title="groupTitle ? $t('relateTable.addDynamicTableGroup') : $t('relateTable.updateDynamicTableGroup')"
       :visible.sync="isShowTable"
     >
       <div class="dialog_wrap">
@@ -143,7 +143,7 @@
           icon="el-icon-plus"
           @click="addOneTable"
           class="mb10"
-          >新增</el-button
+          >{{ $t('relateTable.add') }}</el-button
         >
         <el-form
           :model="groupForm"
@@ -152,20 +152,20 @@
           label-width="100px"
           class="demo-ruleForm"
         >
-          <el-form-item label="菜单名称" prop="groupName">
+          <el-form-item :label="$t('relateTable.menuName')" prop="groupName">
             <el-input
               v-model="groupForm.groupName"
-              placeholder="请输入菜单名称"
+              :placeholder="$t('relateTable.enterMenuName')"
               @input="iptChange()"
             ></el-input>
           </el-form-item>
-          <el-form-item label="菜单描述" prop="groupDescription">
+          <el-form-item :label="$t('relateTable.menuDescription')" prop="groupDescription">
             <el-input
               v-model="groupForm.groupDescription"
-              placeholder="请输入菜单描述"
+              :placeholder="$t('relateTable.enterMenuDescription')"
             ></el-input>
           </el-form-item>
-          <el-form-item label="菜单路由" prop="routePath">
+          <el-form-item :label="$t('relateTable.menuRoute')" prop="routePath">
             <div class="treeselect">
               <treeselect
                 :append-to-body="true"
@@ -173,7 +173,7 @@
                 :options="menus"
                 :normalizer="normalizer"
                 :show-count="true"
-                placeholder="请选择父级路由"
+                :placeholder="$t('relateTable.selectParentRoute')"
               />
             </div>
           </el-form-item>
@@ -184,27 +184,24 @@
               stripe
               @selection-change="handleSelectionChange"
             >
-              <el-table-column label="序号" type="index" />
-              <el-table-column label="表格标题" prop="dtName" />
+              <el-table-column :label="$t('relateTable.serialNumber')" type="index" />
+              <el-table-column :label="$t('relateTable.tableTitle')" prop="dtName" />
               <el-table-column
-                label="表格名称"
+                :label="$t('relateTable.tableName')"
                 prop="dtTableName"
               ></el-table-column>
-              <el-table-column label="表格主键" prop="primaryKey">
-                <!-- <template slot-scope="scope" v-for="item in conditionDefaultValueMap ">
-              {{ item }}
-            </template> -->
+              <el-table-column :label="$t('relateTable.tablePrimaryKey')" prop="primaryKey">
               </el-table-column>
 
               <el-table-column
-                label="操作"
+                :label="$t('relateTable.operation')"
                 align="center"
                 class-name="small-padding fixed-width"
               >
                 <template slot-scope="scope">
                   <el-dropdown>
                     <el-button type="warning" plain size="small">
-                      处理<i class="el-icon-arrow-down el-icon--right"></i>
+                      {{ $t('relateTable.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
                     </el-button>
                     <el-dropdown-menu slot="dropdown">
                       <el-dropdown-item>
@@ -213,7 +210,7 @@
                           type="text"
                           icon="el-icon-edit"
                           @click="relateOne(scope.row, scope.$index)"
-                          >修改
+                          >{{ $t('relateTable.modify') }}
                         </el-button>
                       </el-dropdown-item>
                       <el-dropdown-item>
@@ -222,7 +219,7 @@
                           type="text"
                           icon="el-icon-delete"
                           @click="handleDelete(scope.row)"
-                          >删除
+                          >{{ $t('relateTable.delete') }}
                         </el-button>
                       </el-dropdown-item>
                     </el-dropdown-menu>
@@ -233,9 +230,9 @@
           </el-form-item>
 
           <el-form-item class="btn">
-            <el-button @click="cancelGroup">取消</el-button>
+            <el-button @click="cancelGroup">{{ $t('relateTable.cancel') }}</el-button>
             <el-button type="primary" @click="addTableGroup('groupForm')"
-              >确认</el-button
+              >{{ $t('relateTable.confirm') }}</el-button
             >
           </el-form-item>
         </el-form>
@@ -244,7 +241,7 @@
 
     <!-- 编辑某一条表格数据弹窗 -->
     <el-dialog
-      :title="relateTitle ? '添加关联表格' : '修改关联表格'"
+      :title="relateTitle ? $t('relateTable.addRelateTable') : $t('relateTable.updateRelateTable')"
       :visible.sync="isShowForm"
     >
       <div class="formWrap">
@@ -255,7 +252,7 @@
           :model="tableItemForm"
           label-width="100px"
         >
-          <el-form-item label="表格标题:" prop="title">
+          <el-form-item :label="$t('relateTable.tableTitle')" prop="title">
             <el-input
               v-model="tableItemForm.title"
               style="max-width: 221px"
@@ -263,11 +260,11 @@
               @input="iptChange()"
             ></el-input>
           </el-form-item>
-          <el-form-item label="表格名称:" prop="tableName">
+          <el-form-item :label="$t('relateTable.tableName')" prop="tableName">
             <el-select
               v-model="tableItemForm.tableName"
               @change="getList()"
-              placeholder="请选择表格名称"
+              :placeholder="$t('relateTable.selectTableName')"
               @input="iptChange()"
               :filterable="true"
             >
@@ -286,10 +283,10 @@
               </el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="表格主键:" prop="selectFields">
+          <el-form-item :label="$t('relateTable.tablePrimaryKey')" prop="selectFields">
             <el-select
               v-model="tableItemForm.selectFields"
-              placeholder="请选择表格主键"
+              :placeholder="$t('relateTable.selectTablePrimaryKey')"
               @input="iptChange()"
               :filterable="true"
             >
@@ -306,10 +303,10 @@
               </el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="时间格式" prop="timeFormat">
+          <el-form-item :label="$t('relateTable.timeFormat')" prop="timeFormat">
             <el-select
               v-model="tableItemForm.timeFormat"
-              placeholder="请选择时间格式"
+              :placeholder="$t('relateTable.selectTimeFormat')"
               @input="iptChange()"
               :filterable="true"
             >
@@ -321,10 +318,10 @@
               ></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="排序依赖字段">
+          <el-form-item :label="$t('relateTable.sortDependency')">
             <el-select
               v-model="tableItemForm.orderByColumn"
-              placeholder="请选择排序依赖"
+              :placeholder="$t('relateTable.selectSortDependency')"
               @input="iptChange()"
               :filterable="true"
             >
@@ -336,15 +333,15 @@
               ></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="排序方式" v-show="tableItemForm.orderByColumn">
+          <el-form-item :label="$t('relateTable.sortMethod')" v-show="tableItemForm.orderByColumn">
             <el-radio v-model="tableItemForm.isAsc" :label="false"
-              >升序</el-radio
+              >{{ $t('relateTable.ascending') }}</el-radio
             >
             <el-radio v-model="tableItemForm.isAsc" :label="true"
-              >降序</el-radio
+              >{{ $t('relateTable.descending') }}</el-radio
             >
           </el-form-item>
-          <el-form-item label="展示字段:" prop="FieldList">
+          <el-form-item :label="$t('relateTable.displayField')" prop="FieldList">
             <el-table
               :data="tableFieldList"
               border
@@ -355,16 +352,16 @@
             >
               <el-table-column
                 type="index"
-                label="序号"
+                :label="$t('relateTable.serialNumber')"
                 width="50"
                 class-name="allowDrag"
               >
               </el-table-column>
               <el-table-column
                 prop="fieldName"
-                label="数据字段"
+                :label="$t('relateTable.dataField')"
               ></el-table-column>
-              <el-table-column prop="fieldDescription" label="字段描述">
+              <el-table-column prop="fieldDescription" :label="$t('relateTable.fieldDescription')">
                 <template slot-scope="scope">
                   <input
                     :class="{
@@ -380,7 +377,7 @@
                   />
                 </template>
               </el-table-column>
-              <el-table-column width="95px" prop="relationTable" label="关联表">
+              <el-table-column width="95px" prop="relationTable" :label="$t('relateTable.relateTable')">
                 <template slot-scope="scope">
                   <el-select
                     v-model="scope.row.relationTable"
@@ -388,7 +385,7 @@
                       !scope.row.relationTableList ||
                       !scope.row.relationTableList.length
                     "
-                    placeholder="请选择关联的表"
+                    :placeholder="$t('relateTable.selectRelateTable')"
                     clearable
                     filterable
                     @change="ralationTableChange(scope.row)"
@@ -411,14 +408,14 @@
               <el-table-column
                 width="95px"
                 prop="relationFieldName"
-                label="关联条件字段"
+                :label="$t('relateTable.relateConditionField')"
               >
                 <template slot-scope="scope">
                   <el-select
                     v-model="scope.row.relationFieldName"
                     @change="relationFieldChange(scope.row)"
                     :disabled="!scope.row.disableRelaFieldName"
-                    placeholder="关联字段"
+                    :placeholder="$t('relateTable.selectRelateField')"
                     filterable
                   >
                     <el-option
@@ -434,12 +431,12 @@
               <el-table-column
                 width="95px"
                 prop="relationType"
-                label="关联方式"
+                :label="$t('relateTable.relateMethod')"
               >
                 <template slot-scope="scope">
                   <el-select
                     v-model="scope.row.relationType"
-                    placeholder="请选择关联方式"
+                    :placeholder="$t('relateTable.selectRelateMethod')"
                     :disabled="!scope.row.disableRelaType"
                     @change="relationTypeChangeHandler(scope.row)"
                     filterable
@@ -454,12 +451,12 @@
                   </el-select>
                 </template>
               </el-table-column>
-              <el-table-column prop="isShow" label="是否显示">
+              <el-table-column prop="isShow" :label="$t('relateTable.isShow')">
                 <template slot-scope="scope">
                   <el-switch v-model="scope.row.isShow"> </el-switch>
                 </template>
               </el-table-column>
-              <el-table-column prop="isSearch" label="是否包含查询">
+              <el-table-column prop="isSearch" :label="$t('relateTable.isSearch')">
                 <template slot-scope="scope">
                   <el-switch
                     v-model="scope.row.isSearch"
@@ -471,11 +468,11 @@
             </el-table>
           </el-form-item>
           <el-form-item class="btn">
-            <el-button @click="cancelAddHandler">取消</el-button>
+            <el-button @click="cancelAddHandler">{{ $t('relateTable.cancel') }}</el-button>
             <el-button
               type="primary"
               @click="confirmAddHandler('tableItemForm')"
-              >确认</el-button
+              >{{ $t('relateTable.confirm') }}</el-button
             >
           </el-form-item>
         </el-form>
@@ -484,8 +481,8 @@
 
     <!-- 是否包含查询字段依赖值对话框 -->
     <div class="isSearch">
-      <el-dialog title="包含查询依赖值" :visible.sync="isSearchDialog">
-        <el-select v-model="relyOption" placeholder="请选择依赖方式">
+      <el-dialog :title="$t('relateTable.searchDependency')" :visible.sync="isSearchDialog">
+        <el-select v-model="relyOption" :placeholder="$t('relateTable.selectDependencyMethod')">
           <el-option
             v-for="item in relyOptions"
             :key="item.value"
@@ -497,13 +494,13 @@
         <el-input
           v-show="relyOption === '0'"
           v-model="conditionDefaultValueMap"
-          placeholder="请输入依赖值"
+          :placeholder="$t('relateTable.enterDependencyValue')"
         ></el-input>
 
         <el-select
           v-show="relyOption === '1'"
           v-model="conditionDefaultValueMap"
-          placeholder="请选择依赖字段"
+          :placeholder="$t('relateTable.selectDependencyField')"
         >
           <el-option
             v-for="item in relyFileds.tableFieldList"
@@ -514,8 +511,8 @@
           </el-option>
         </el-select>
         <span slot="footer" class="dialog-footer">
-          <el-button @click="isSearchCancel">取 消</el-button>
-          <el-button type="primary" @click="isSearchBtn">确 定</el-button>
+          <el-button @click="isSearchCancel">{{ $t('relateTable.cancel') }}</el-button>
+          <el-button type="primary" @click="isSearchBtn">{{ $t('relateTable.confirm') }}</el-button>
         </span>
       </el-dialog>
     </div>
@@ -561,12 +558,12 @@ export default {
       relyOptions: [
         {
           value: "0",
-          label: "自定义依赖值",
+          label: this.$t('relateTable.customDependency')
         },
         {
           value: "1",
-          label: "依赖其他字段",
-        },
+          label: this.$t('relateTable.dependencyOtherField')
+        }
       ],
       // 依赖值
       conditionDefaultValueMap: "",
@@ -581,9 +578,9 @@ export default {
       menus: [], //路由列表数据
       // 添加关联表格校验规则
       tableItemRules: {
-        // title:[{ required: true, message: '请输入表格标题', trigger: 'blur' }],
-        // tableName:[{ required: true, message: '请选择表格名称', trigger: 'change' }],
-        // selectFields: [{ required: true, message: '请选择关联字段', trigger: 'change' }],
+        // title:[{ required: true, message: this.$t('relateTable.pleaseEnterTableTitle'), trigger: 'blur' }],
+        // tableName:[{ required: true, message: this.$t('relateTable.pleaseSelectTableName'), trigger: 'change' }],
+        // selectFields: [{ required: true, message: this.$t('relateTable.pleaseSelectRelateField'), trigger: 'change' }],
       },
       groupForm: {
         groupName: "",
@@ -592,30 +589,30 @@ export default {
       },
       grouprules: {
         groupName: [
-          { required: true, message: "请输入表格组名", trigger: "blur" },
+          { required: true, message: this.$t('relateTable.pleaseEnterTableGroupName'), trigger: 'blur' }
         ],
         groupDescription: [
-          { required: true, message: "请输入表格描述", trigger: "blur" },
+          { required: true, message: this.$t('relateTable.pleaseEnterTableDescription'), trigger: 'blur' }
         ],
         routePath: [
-          { required: true, message: "请选择路由", trigger: "change" },
-        ],
+          { required: true, message: this.$t('relateTable.pleaseSelectRoute'), trigger: 'change' }
+        ]
       },
       menuOrderNum: 0,
       // 关联方式
       relaTypeList: [
         {
-          label: "等值连接",
-          value: "INNER JOIN",
+          label: this.$t('relateTable.equalJoin'),
+          value: "INNER JOIN"
         },
         {
-          label: "左连接",
-          value: "LEFT JOIN",
+          label: this.$t('relateTable.leftJoin'),
+          value: "LEFT JOIN"
         },
         {
-          label: "右连接",
-          value: "RIGHT JOIN",
-        },
+          label: this.$t('relateTable.rightJoin'),
+          value: "RIGHT JOIN"
+        }
       ],
       searchFieldList: [],
       // 依赖字段
@@ -812,10 +809,10 @@ export default {
       this.relyFileds.tableName = "";
     },
     // 获取路由表单数据
-    async getMenuList() {
-      let res = await listGroup();
-      this.menus = this.handleTree(res.data, "menuId");
-    },
+    // async getMenuList() {
+    //   let res = await listGroup();
+    //   this.menus = this.handleTree(res.data, "menuId");
+    // },
     // 递归拼接查询语句
     getSQLString(tableFieldList, fieldArr, tableArr, sqlType = "mysql") {
       let prefix = "{DBNAME}.";
@@ -985,13 +982,6 @@ export default {
       });
       row.disableRelaFieldName = true;
     },
-    // 关联类型变化回调
-    relationTypeChangeHandler(row) {
-      let tempRelationFieldList = row.relationFieldList.filter((item) => {
-        return !this.tableFieldList.find((val) => val.id === item.id);
-      });
-      this.tableFieldList = [...this.tableFieldList, ...tempRelationFieldList];
-    },
     // 关联字段回调
     relationFieldChange(row) {
       if (!row.relationFieldName) {
@@ -1315,11 +1305,11 @@ export default {
       this.tableFieldList = [...this.tableFieldList, ...tempRelationFieldList];
     },
     // 更新路由
-    reloadRouter() {
-      this.$store.dispatch("GenerateRoutes").then((accessRoutes) => {
-        this.$router.addRoutes(accessRoutes); // 动态添加可访问路由表
-      });
-    },
+    // reloadRouter() {
+    //   this.$store.dispatch("GenerateRoutes").then((accessRoutes) => {
+    //     this.$router.addRoutes(accessRoutes); // 动态添加可访问路由表
+    //   });
+    // },
     // 获取目标menu
     getTargetMenu(menus) {
       for (let i = 0; i < menus.length; i++) {

+ 24 - 19
zkqy-ui/src/views/system/engineeringManage/index.vue

@@ -93,7 +93,7 @@
           size="mini"
           @click="handleDownloadEnd"
           v-hasPermi="['system:engineering:download']"
-          >工程下载
+          >{{ $t('engineering.download') }}
         </el-button>
       </el-col>
       <right-toolbar
@@ -110,9 +110,9 @@
       <el-table-column type="selection" width="55" align="center" />
       <!-- <el-table-column label="编号" align="center" prop="id" /> -->
       <!-- <el-table-column label="工程key" align="center" prop="engineeringKey" /> -->
-      <el-table-column label="工程名称" align="center" prop="engineeringName" />
+      <el-table-column :label="$t('engineering.engineeringName')" align="center" prop="engineeringName" />
       <!-- <el-table-column label="下载次数" align="center" prop="downloadNumber" /> -->
-      <el-table-column label="下载时间" align="center" prop="downloadTime">
+      <el-table-column :label="$t('engineering.downloadTime')" align="center" prop="downloadTime">
         <template slot-scope="scope">
           <span>{{
             parseTime(scope.row.downloadTime, "{y}-{m}-{d} {h}:{i}:{s}")
@@ -175,30 +175,30 @@
         <!-- <el-form-item label="工程key" prop="engineeringKey">
           <el-input v-model="form.engineeringKey" placeholder="请输入工程key" />
         </el-form-item> -->
-        <el-form-item label="工程名称" prop="engineeringName">
+        <el-form-item :label="$t('engineering.engineeringName')" prop="engineeringName">
           <el-input
             v-model="form.engineeringName"
-            placeholder="请输入工程名称"
+            :placeholder="$t('engineering.pleaseEnterEngineeringName')"
           />
         </el-form-item>
-        <el-form-item label="下载次数" prop="downloadNumber">
+        <el-form-item :label="$t('engineering.downloadNumber')" prop="downloadNumber">
           <el-input
             v-model="form.downloadNumber"
-            placeholder="请输入下载次数"
+            :placeholder="$t('engineering.pleaseEnterDownloadNumber')"
           />
         </el-form-item>
-        <el-form-item label="下载时间" prop="downloadTime">
+        <el-form-item :label="$t('engineering.downloadTime')" prop="downloadTime">
           <el-date-picker
             clearable
             v-model="form.downloadTime"
             type="date"
             value-format="yyyy-MM-dd"
-            placeholder="请选择下载时间"
+            :placeholder="$t('engineering.pleaseSelectDownloadTime')"
           >
           </el-date-picker>
         </el-form-item>
-        <el-form-item label="更新时间" prop="updateTime">
-          <el-input v-model="form.updateTime" placeholder="请输入修改时间" />
+        <el-form-item :label="$t('engineering.updateTime')" prop="updateTime">
+          <el-input v-model="form.updateTime" :placeholder="$t('engineering.pleaseEnterUpdateTime')" />
         </el-form-item>
         <!-- <el-form-item label="租户编号" prop="tenantId">
           <el-input v-model="form.tenantId" placeholder="请输入租户编号" />
@@ -206,8 +206,8 @@
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
         </el-form-item> -->
-        <el-form-item label="是否删除" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入是否删除" />
+        <el-form-item :label="$t('engineering.delFlag')" prop="delFlag">
+          <el-input v-model="form.delFlag" :placeholder="$t('engineering.pleaseEnterDelFlag')" />
         </el-form-item>
         <!--  <el-form-item label="创建者ID" prop="createById">
           <el-input v-model="form.createById" placeholder="请输入创建者ID" />
@@ -217,8 +217,8 @@
         </el-form-item> -->
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">{{ $t('normal.save') }}</el-button>
+        <el-button @click="cancel">{{ $t('normal.close') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -303,13 +303,18 @@ export default {
             URL.revokeObjectURL(elink.href); // 释放URL 对象
             document.body.removeChild(elink);
             this.loading = false;
+            this.$modal.msgSuccess(this.$t('engineering.downloadSuccess'));
           } else {
             // IE10+下载
             navigator.msSaveBlob(blob, fileName);
             this.loading = false;
+            this.$modal.msgSuccess(this.$t('engineering.downloadSuccess'));
           }
           this.getList();
         }
+      }).catch(() => {
+        this.$modal.msgError(this.$t('engineering.downloadError'));
+        this.loading = false;
       });
     },
     /** 查询工程部署列表 */
@@ -402,13 +407,13 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$modal
-        .confirm('是否确认删除工程部署编号为"' + ids + '"的数据项?')
+        .confirm(this.$t('engineering.confirmDelete') + ids + '"的数据项?')
         .then(function () {
           return delEngineering(ids);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('engineering.deleteSuccess'));
         })
         .catch(() => {});
     },
@@ -433,7 +438,7 @@ export default {
       // );
       let downloadLoadingInstance;
       downloadLoadingInstance = Loading.service({
-        text: "正在下载数据,请稍候",
+        text:  this.$t('settings.downloadedLoading'),
         spinner: "el-icon-loading",
         background: "rgba(0, 0, 0, 0.7)",
       });
@@ -473,7 +478,7 @@ export default {
       console.log(filename);
       let downloadLoadingInstance;
       downloadLoadingInstance = Loading.service({
-        text: "正在下载数据,请稍候",
+        text:  this.$t('settings.downloadedLoading'),
         spinner: "el-icon-loading",
         background: "rgba(0, 0, 0, 0.7)",
       });

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 132 - 268
zkqy-ui/src/views/system/excuteBtnMange/index.vue


+ 71 - 71
zkqy-ui/src/views/system/formGroupMange/index.vue

@@ -8,10 +8,10 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label-width="100px" label="动态组名称" prop="fGName">
+      <el-form-item label-width="100px" :label="$t('formGroup.fGName')" prop="fGName">
         <el-input
           v-model="queryParams.fGName"
-          placeholder="请输入动态组名称"
+          :placeholder="$t('formGroup.fGNamePlaceholder')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -24,10 +24,10 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item> -->
-      <el-form-item label="主表名称" prop="mainTable">
+      <el-form-item :label="$t('formGroup.mainTable')" prop="mainTable">
         <el-input
           v-model="queryParams.mainTable"
-          placeholder="请输入表单组主表名称"
+          :placeholder="$t('formGroup.mainTablePlaceholder')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -54,10 +54,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('formGroup.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('formGroup.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -71,7 +71,7 @@
           size="mini"
           @click="addHandler"
           v-hasPermi="['system:formGroup:add']"
-          >新增</el-button
+          >{{ $t('formGroup.add') }}</el-button
         >
       </el-col>
       <!-- <el-col :span="1.5">
@@ -95,7 +95,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:formGroup:remove']"
-          >删除</el-button
+          >{{ $t('formGroup.delete') }}</el-button
         >
       </el-col>
       <!-- <el-col :span="1.5">
@@ -121,15 +121,15 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="主键" align="center" prop="id" />
-      <el-table-column label="动态组名称" align="center" prop="fGName" />
-      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column :label="$t('formGroup.id')" align="center" prop="id" />
+      <el-table-column :label="$t('formGroup.fGName')" align="center" prop="fGName" />
+      <el-table-column :label="$t('formGroup.remark')" align="center" prop="remark" />
       <el-table-column
-        label="当前表单组中所绑定的表单"
+        :label="$t('formGroup.formKeys')"
         align="center"
         prop="formKeys"
       />
-      <el-table-column label="表单组主表名称" align="center" prop="mainTable" />
+      <el-table-column :label="$t('formGroup.mainTable')" align="center" prop="mainTable" />
       <!-- <el-table-column
         label="各个表单之间的关系"
         align="center"
@@ -139,14 +139,14 @@
       <el-table-column label="更新人编号" align="center" prop="updateById" />
       <el-table-column label="创建人编号" align="center" prop="createById" /> -->
       <el-table-column
-        label="操作"
+        :label="$t('formGroup.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('formGroup.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -155,7 +155,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
-                  >修改
+                  >{{ $t('formGroup.edit') }}
                 </el-button></el-dropdown-item
               >
               <el-dropdown-item
@@ -164,7 +164,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="handlePosition(scope.row)"
-                  >设置布局
+                  >{{ $t('formGroup.setLayout') }}
                 </el-button></el-dropdown-item
               >
               <el-dropdown-item>
@@ -173,7 +173,7 @@
                   type="text"
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
-                  >删除
+                  >{{ $t('formGroup.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -207,7 +207,7 @@
     />
     <!-- 表格组新增或编辑弹窗 -->
     <el-dialog
-      :title="isEdit ? '修改表单组' : '新增表单组'"
+      :title="isEdit ? $t('formGroup.dialogTitle.edit') : $t('formGroup.dialogTitle.add')"
       :visible.sync="isShow"
     >
       <el-form
@@ -218,16 +218,16 @@
         :inline="true"
         size="normal"
       >
-        <el-form-item prop="fGName" label="组名称:">
+        <el-form-item prop="fGName" :label="$t('formGroup.form.groupName') + ':'">
           <el-input v-model="groupForm.fGName"></el-input>
         </el-form-item>
-        <el-form-item prop="groupDesc" label="组描述:">
+        <el-form-item prop="groupDesc" :label="$t('formGroup.form.groupDesc') + ':'">
           <el-input v-model="groupForm.groupDesc"></el-input>
         </el-form-item>
-        <el-form-item prop="mainFormName" label="主表单:">
+        <el-form-item prop="mainFormName" :label="$t('formGroup.form.mainForm') + ':'">
           <el-select
             v-model="groupForm.mainFormName"
-            placeholder="请选择主表单"
+            :placeholder="$t('formGroup.form.mainFormPlaceholder')"
             clearable
             filterable
             @change="mainFormChange"
@@ -247,10 +247,10 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label-width="100px" prop="mainFormItem" label="表单主键:">
+        <el-form-item label-width="100px" prop="mainFormItem" :label="$t('formGroup.form.formPrimaryKey') + ':'">
           <el-select
             v-model="groupForm.mainFormItem"
-            placeholder="请选择表单主键"
+            :placeholder="$t('formGroup.form.formPrimaryKeyPlaceholder')"
             clearable
             filterable
           >
@@ -267,25 +267,25 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="是否显示" prop="isShow" size="normal">
+        <el-form-item :label="$t('formGroup.form.isShow')" prop="isShow" size="normal">
           <el-switch
             v-model="groupForm.isShow"
             active-color="#13ce66"
             inactive-color="#ff4949"
-            active-text="是"
-            inactive-text="否"
+            :active-text="$t('normal.yes')"
+            :inactive-text="$t('normal.no')"
           >
           </el-switch>
         </el-form-item>
       </el-form>
-      <el-divider content-position="center">从表单数据</el-divider>
+      <el-divider content-position="center">{{ $t('formGroup.form.subFormData') }}</el-divider>
       <el-table :data="subFormList" border stripe>
         <el-table-column type="index" width="50" />
-        <el-table-column prop="formKey" label="从表单">
+        <el-table-column prop="formKey" :label="$t('formGroup.form.subForm')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.formKey"
-              placeholder="请选择表单"
+              :placeholder="$t('formGroup.form.mainFormPlaceholder')"
               clearable
               filterable
               @change="subFormChangeHandler(scope.row)"
@@ -306,11 +306,11 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="formItem" label="子表单键">
+        <el-table-column prop="formItem" :label="$t('formGroup.form.subFormKey')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.formItem"
-              placeholder="请选择子表单键"
+              :placeholder="$t('formGroup.condition.fieldNamePlaceholder')"
               clearable
               filterable
               @change="subFormItemChangeHandler(scope.row)"
@@ -331,11 +331,11 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="mainFormItem" label="依赖的主表单键">
+        <el-table-column prop="mainFormItem" :label="$t('formGroup.form.dependMainFormKey')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.relateMainItem"
-              placeholder="请选择表单主键"
+              :placeholder="$t('formGroup.form.formPrimaryKeyPlaceholder')"
               clearable
               filterable
             >
@@ -355,41 +355,41 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="isShow" label="是否展示">
+        <el-table-column prop="isShow" :label="$t('formGroup.form.isDisplay')">
           <template slot-scope="scope">
             <el-switch
               v-model="scope.row.isShow"
               active-color="#13ce66"
               inactive-color="#ff4949"
-              active-text="是"
-              inactive-text="否"
+              :active-text="$t('normal.yes')"
+              :inactive-text="$t('normal.no')"
             >
             </el-switch>
           </template>
         </el-table-column>
-        <el-table-column prop="queryMap" label="查询条件">
+        <el-table-column prop="queryMap" :label="$t('formGroup.form.queryCondition')">
           <template slot-scope="scope">
             <el-button
               type="info"
               size="small"
               @click="editHandler(scope.row, 'query', scope.$index)"
             >
-              编辑条件
+              {{ $t('formGroup.form.editCondition') }}
             </el-button>
           </template>
         </el-table-column>
-        <el-table-column prop="queryMap" label="插入条件">
+        <el-table-column prop="queryMap" :label="$t('formGroup.form.insertCondition')">
           <template slot-scope="scope">
             <el-button
               type="info"
               size="small"
               @click="editHandler(scope.row, 'insert', scope.$index)"
             >
-              编辑条件
+              {{ $t('formGroup.form.editCondition') }}
             </el-button>
           </template>
         </el-table-column>
-        <el-table-column label="操作">
+        <el-table-column :label="$t('formGroup.operation')">
           <template slot-scope="scope">
             <el-button
               type="danger"
@@ -397,7 +397,7 @@
               size="small"
               @click="handleRemove(scope.$index, scope.row)"
             >
-              删除
+              {{ $t('formGroup.delete') }}
             </el-button>
           </template>
         </el-table-column>
@@ -409,13 +409,13 @@
         size="mini"
         @click="addOne"
       >
-        新增
+        {{ $t('formGroup.form.add') }}
       </el-button>
 
       <template #footer>
         <span>
-          <el-button @click="cancelHandler">取消</el-button>
-          <el-button type="primary" @click="confirmHandler">确认</el-button>
+          <el-button @click="cancelHandler">{{ $t('formGroup.form.cancel') }}</el-button>
+          <el-button type="primary" @click="confirmHandler">{{ $t('formGroup.form.confirm') }}</el-button>
         </span>
       </template>
     </el-dialog>
@@ -429,11 +429,11 @@
         stripe
       >
         <el-table-column type="index" width="50" />
-        <el-table-column prop="fieldName" label="子表单键">
+        <el-table-column prop="fieldName" :label="$t('formGroup.condition.fieldName')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.fieldName"
-              placeholder="请选择子表单键"
+              :placeholder="$t('formGroup.condition.fieldNamePlaceholder')"
               clearable
               filterable
             >
@@ -453,11 +453,11 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="type" label="类型">
+        <el-table-column prop="type" :label="$t('formGroup.condition.type')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.type"
-              placeholder="请选择类型"
+              :placeholder="$t('formGroup.condition.typePlaceholder')"
               filterable
               @change="changeType(scope.row)"
             >
@@ -471,11 +471,11 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="tableName" label="依赖表单">
+        <el-table-column prop="tableName" :label="$t('formGroup.condition.dependForm')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.formKey"
-              placeholder="请选择依赖表单"
+              :placeholder="$t('formGroup.condition.dependFormPlaceholder')"
               clearable
               filterable
               @change="changeTableName(scope.row)"
@@ -497,11 +497,11 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="relaField" label="依赖字段">
+        <el-table-column prop="relaField" :label="$t('formGroup.condition.dependField')">
           <template slot-scope="scope">
             <el-select
               v-model="scope.row.relaField"
-              placeholder="请选择依赖字段"
+              :placeholder="$t('formGroup.condition.dependFieldPlaceholder')"
               clearable
               filterable
               :disabled="scope.row.type === 'defaultValue'"
@@ -522,44 +522,44 @@
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column prop="refValue" label="默认值">
+        <el-table-column prop="refValue" :label="$t('formGroup.condition.defaultValue')">
           <template slot-scope="scope">
             <el-input
               :disabled="scope.row.type === 'relateValue'"
               v-model="scope.row.refValue"
-              placeholder="请输入默认值"
+              :placeholder="$t('formGroup.condition.defaultValuePlaceholder')"
               clearable
             />
           </template>
         </el-table-column>
-        <el-table-column label="操作">
+        <el-table-column :label="$t('formGroup.operation')">
           <template slot-scope="scope">
             <el-button
               type="danger"
               size="mini"
               @click="handleRemove(scope.$index, scope.row)"
             >
-              删除
+              {{ $t('formGroup.delete') }}
             </el-button>
           </template>
         </el-table-column>
       </el-table>
       <div class="btn-wrap">
         <el-button type="primary" size="mini" @click="addCondition">
-          新增条件
+          {{ $t('formGroup.condition.addCondition') }}
         </el-button>
       </div>
       <template #footer>
         <span>
-          <el-button @click="queryShow = false">取消</el-button>
+          <el-button @click="queryShow = false">{{ $t('formGroup.form.cancel') }}</el-button>
           <el-button type="primary" @click="conditionConfirmHandler"
-            >确认</el-button
+            >{{ $t('formGroup.form.confirm') }}</el-button
           >
         </span>
       </template>
     </el-dialog>
     <!-- 布局弹窗 -->
-    <el-dialog title="布局" :visible.sync="layoutShow" fullscreen>
+    <el-dialog :title="$t('formGroup.dialogTitle.layout')" :visible.sync="layoutShow" fullscreen>
       <DragPosition
         ref="DragPositionRef"
         :formGroupData="formGroupData"
@@ -653,15 +653,15 @@ export default {
       form: {},
       // 表单校验
       rules: {
-        fGName: [{ required: true, message: "请输入组名称", trigger: "blur" }],
+        fGName: [{ required: true, message: this.$t('rules.formGroup.groupName') + this.$t('normal.pleaseEnter'), trigger: "blur" }],
         groupDesc: [
-          { required: true, message: "请输入组描述", trigger: "blur" },
+          { required: true, message: this.$t('rules.formGroup.groupDesc') + this.$t('normal.pleaseEnter'), trigger: "blur" },
         ],
         mainFormName: [
-          { required: true, message: "请选择主表表单", trigger: "change" },
+          { required: true, message: this.$t('rules.formGroup.mainForm') + this.$t('normal.pleaseSelect'), trigger: "change" },
         ],
         mainFormItem: [
-          { required: true, message: "请选择表单主键", trigger: "change" },
+          { required: true, message: this.$t('rules.formGroup.formPrimaryKey') + this.$t('normal.pleaseSelect'), trigger: "change" },
         ],
       },
       //  查询条件数据
@@ -676,11 +676,11 @@ export default {
       relaTableOptions: [], //依赖
       typeOptions: [
         {
-          label: "自定义值",
+          label: this.$t('formGroup.condition.customValue'),
           value: "defaultValue",
         },
         {
-          label: "依赖值",
+          label: this.$t('formGroup.condition.dependValue'),
           value: "relateValue",
         },
       ],
@@ -1167,13 +1167,13 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$modal
-        .confirm('是否确认删除动态表单组编号为"' + ids + '"的数据项?')
+        .confirm(this.$t('formGroup.message.deleteConfirm', [ids]))
         .then(function () {
           return delFormGroup(ids);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('formGroup.message.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 99 - 205
zkqy-ui/src/views/system/tenant/tenantIndex.vue

@@ -8,42 +8,42 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="租户名称" prop="tenantName">
+      <el-form-item :label="$t('tenant.tenantName')" prop="tenantName">
         <el-input
           v-model="queryParams.tenantName"
-          placeholder="请输入租户名称"
+          :placeholder="$t('tenant.pleaseEnterTenantName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="租户编号" prop="tenantCode">
+      <el-form-item :label="$t('tenant.tenantCode')" prop="tenantCode">
         <el-input
           v-model="queryParams.tenantCode"
-          placeholder="请输入租户编号"
+          :placeholder="$t('tenant.pleaseEnterTenantCode')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="负责人" prop="owner">
+      <el-form-item :label="$t('tenant.owner')" prop="owner">
         <el-input
           v-model="queryParams.owner"
-          placeholder="请输入负责人"
+          :placeholder="$t('tenant.pleaseEnterOwner')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="联系方式" prop="contactInfo">
+      <el-form-item :label="$t('tenant.contactInfo')" prop="contactInfo">
         <el-input
           v-model="queryParams.contactInfo"
-          placeholder="请输入联系方式"
+          :placeholder="$t('tenant.pleaseEnterContactInfo')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="地址" prop="address">
+      <el-form-item :label="$t('tenant.address')" prop="address">
         <el-input
           v-model="queryParams.address"
-          placeholder="请输入地址"
+          :placeholder="$t('tenant.pleaseEnterAddress')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -54,10 +54,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索
+        >{{ $t('normal.search') }}
         </el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置
+        >{{ $t('normal.reset') }}
         </el-button>
       </el-form-item>
     </el-form>
@@ -71,7 +71,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:tenant:add']"
-        >新增
+        >{{ $t('normal.insert') }}
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -83,7 +83,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:tenant:export']"
-        >导出
+        >{{ $t('normal.export') }}
         </el-button>
         <ExcelDownLoad
           v-else
@@ -107,42 +107,42 @@
       :load="load"
       :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
     >
-      <el-table-column label="租户ID" align="center" prop="tenantId" />
-      <el-table-column label="租户名称" align="center" prop="tenantName" />
-      <el-table-column label="租户编号" align="center" prop="tenantCode" />
-      <el-table-column label="负责人" align="center" prop="owner" />
-      <el-table-column label="联系方式" align="center" prop="contactInfo" />
-      <el-table-column label="地址" align="center" prop="address" />
+      <el-table-column :label="$t('tenant.tenantId')" align="center" prop="tenantId" />
+      <el-table-column :label="$t('tenant.tenantName')" align="center" prop="tenantName" />
+      <el-table-column :label="$t('tenant.tenantCode')" align="center" prop="tenantCode" />
+      <el-table-column :label="$t('tenant.owner')" align="center" prop="owner" />
+      <el-table-column :label="$t('tenant.contactInfo')" align="center" prop="contactInfo" />
+      <el-table-column :label="$t('tenant.address')" align="center" prop="address" />
       <el-table-column
-        label="租户父级ID"
+        :label="$t('tenant.tenantParentId')"
         align="center"
         prop="tenantParentId"
       />
       <el-table-column
-        label="客户端访问地址"
+        :label="$t('tenant.tenantClientLoginUrl')"
         align="center"
         prop="tenantClientLoginUrl"
       />
       <el-table-column
-        label="工具端访问地址"
+        :label="$t('tenant.tenantToolLoginUrl')"
         align="center"
         prop="tenantToolLoginUrl"
       />
-      <el-table-column label="租户等级" align="center" prop="tenantGrade" />
+      <el-table-column :label="$t('tenant.tenantGrade')" align="center" prop="tenantGrade" />
       <el-table-column
-        label="到期天数"
+        :label="$t('tenant.tenantExpirationTime')"
         align="center"
         prop="tenantExpirationTime"
       />
       <el-table-column
-        label="操作"
+        :label="$t('normal.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('normal.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -152,7 +152,7 @@
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:tenant:edit']"
-                >修改
+                >{{ $t('normal.update') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -162,7 +162,7 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:tenant:remove']"
-                >删除
+                >{{ $t('normal.delete') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -172,7 +172,7 @@
                   icon="el-icon-position"
                   @click="bindDatasource(scope.row)"
                   v-show="scope.row.datasourceId == null"
-                >绑定数据源
+                >{{ $t('tenant.bindDatasource') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -182,7 +182,7 @@
                   icon="el-icon-s-custom"
                   @click="openTenantExpirationTime(scope.row)"
                   v-hasPermi="['system:tenant:remove']"
-                >激活租户
+                >{{ $t('tenant.activateTenant') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -192,7 +192,7 @@
                   icon="el-icon-s-open"
                   @click="openLoginConfig(scope.row)"
                   v-hasPermi="['system:tenant:remove']"
-                >配置登录页
+                >{{ $t('tenant.configLoginPage') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -201,106 +201,6 @@
       </el-table-column>
     </el-table>
 
-    <!-- <el-table
-      v-loading="loading"
-      :data="tenantList"
-      @selection-change="handleSelectionChange"
-    >
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="租户ID" align="center" prop="tenantId" />
-      <el-table-column label="租户名称" align="center" prop="tenantName" />
-      <el-table-column label="租户编号" align="center" prop="tenantCode" />
-      <el-table-column label="负责人" align="center" prop="owner" />
-      <el-table-column label="联系方式" align="center" prop="contactInfo" />
-      <el-table-column label="地址" align="center" prop="address" />
-      <el-table-column
-        label="租户父级ID"
-        align="center"
-        prop="tenantParentId"
-      />
-      <el-table-column
-        label="客户端访问地址"
-        align="center"
-        prop="tenantClientLoginUrl"
-      />
-      <el-table-column
-        label="工具端访问地址"
-        align="center"
-        prop="tenantToolLoginUrl"
-      />
-      <el-table-column label="租户等级" align="center" prop="tenantGrade" />
-      <el-table-column
-        label="到期天数"
-        align="center"
-        prop="tenantExpirationTime"
-      />
-      <el-table-column
-        label="操作"
-        align="center"
-        class-name="small-padding fixed-width"
-      >
-        <template slot-scope="scope">
-          <el-dropdown>
-            <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
-            </el-button>
-            <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item>
-                <el-button
-                  size="mini"
-                  type="text"
-                  icon="el-icon-edit"
-                  @click="handleUpdate(scope.row)"
-                  v-hasPermi="['system:tenant:edit']"
-                  >修改
-                </el-button>
-              </el-dropdown-item>
-              <el-dropdown-item>
-                <el-button
-                  size="mini"
-                  type="text"
-                  icon="el-icon-delete"
-                  @click="handleDelete(scope.row)"
-                  v-hasPermi="['system:tenant:remove']"
-                  >删除
-                </el-button>
-              </el-dropdown-item>
-              <el-dropdown-item>
-                <el-button
-                  size="mini"
-                  type="text"
-                  icon="el-icon-position"
-                  @click="bindDatasource(scope.row)"
-                  v-show="scope.row.datasourceId == null"
-                  >绑定数据源
-                </el-button>
-              </el-dropdown-item>
-              <el-dropdown-item>
-                <el-button
-                  size="mini"
-                  type="text"
-                  icon="el-icon-s-custom"
-                  @click="openTenantExpirationTime(scope.row)"
-                  v-hasPermi="['system:tenant:remove']"
-                  >激活租户
-                </el-button>
-              </el-dropdown-item>
-              <el-dropdown-item>
-                <el-button
-                  size="mini"
-                  type="text"
-                  icon="el-icon-s-open"
-                  @click="openLoginConfig(scope.row)"
-                  v-hasPermi="['system:tenant:remove']"
-                  >配置登录页
-                </el-button>
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown>
-        </template>
-      </el-table-column>
-    </el-table> -->
-
     <pagination
       v-show="total > 0"
       :total="total"
@@ -312,7 +212,7 @@
     <!-- 添加或修改租户信息对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
-        <el-form-item label="选择上级租户" prop="tenantParentId">
+        <el-form-item :label="$t('tenant.selectParentTenant')" prop="tenantParentId">
           <el-cascader
             v-model="form.tenantParentId"
             :options="tenantAllList"
@@ -325,8 +225,8 @@
           ></el-cascader>
         </el-form-item>
 
-        <el-form-item label="租户类型" prop="tenantProfession" >
-          <el-select v-model="form.tenantProfession" placeholder="请选择租户类型" style="width: 250px">
+        <el-form-item :label="$t('tenant.tenantProfession')" prop="tenantProfession" >
+          <el-select v-model="form.tenantProfession" :placeholder="$t('tenant.pleaseSelectTenantProfession')" style="width: 250px">
             <el-option
               v-for="item in tenantProfessionList"
               :key="item.dictValue"
@@ -336,41 +236,41 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="租户名称" prop="tenantName">
-          <el-input v-model="form.tenantName" placeholder="请输入租户名称" />
+        <el-form-item :label="$t('tenant.tenantName')" prop="tenantName">
+          <el-input v-model="form.tenantName" :placeholder="$t('tenant.pleaseEnterTenantName')" />
         </el-form-item>
-        <el-form-item label="租户编号" prop="tenantCode">
-          <el-input v-model="form.tenantCode" placeholder="请输入租户编号" />
+        <el-form-item :label="$t('tenant.tenantCode')" prop="tenantCode">
+          <el-input v-model="form.tenantCode" :placeholder="$t('tenant.pleaseEnterTenantCode')" />
         </el-form-item>
-        <el-form-item label="负责人" prop="owner">
-          <el-input v-model="form.owner" placeholder="请输入负责人" />
+        <el-form-item :label="$t('tenant.owner')" prop="owner">
+          <el-input v-model="form.owner" :placeholder="$t('tenant.pleaseEnterOwner')" />
         </el-form-item>
-        <el-form-item label="联系方式" prop="contactInfo">
-          <el-input v-model="form.contactInfo" placeholder="请输入联系方式" />
+        <el-form-item :label="$t('tenant.contactInfo')" prop="contactInfo">
+          <el-input v-model="form.contactInfo" :placeholder="$t('tenant.pleaseEnterContactInfo')" />
         </el-form-item>
-        <el-form-item label="地址" prop="address">
-          <el-input v-model="form.address" placeholder="请输入地址" />
+        <el-form-item :label="$t('tenant.address')" prop="address">
+          <el-input v-model="form.address" :placeholder="$t('tenant.pleaseEnterAddress')" />
         </el-form-item>
 
-        <el-form-item label="客户端访问地址" prop="tenantClientLoginUrl">
+        <el-form-item :label="$t('tenant.tenantClientLoginUrl')" prop="tenantClientLoginUrl">
           <el-input
             v-model="form.tenantClientLoginUrl"
-            placeholder="请输入客户端访问地址"
+            :placeholder="$t('tenant.pleaseEnterTenantClientLoginUrl')"
           />
         </el-form-item>
-        <el-form-item label="工具端访问地址" prop="tenantToolLoginUrl">
+        <el-form-item :label="$t('tenant.tenantToolLoginUrl')" prop="tenantToolLoginUrl">
           <el-input
             v-model="form.tenantToolLoginUrl"
-            placeholder="请输入工具端访问地址"
+            :placeholder="$t('tenant.pleaseEnterTenantToolLoginUrl')"
           />
         </el-form-item>
-        <el-form-item label="租户等级" prop="tenantGrade">
-          <el-input v-model="form.tenantGrade" placeholder="请输入租户等级" />
+        <el-form-item :label="$t('tenant.tenantGrade')" prop="tenantGrade">
+          <el-input v-model="form.tenantGrade" :placeholder="$t('tenant.pleaseEnterTenantGrade')" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">{{ $t('normal.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
 
@@ -387,8 +287,8 @@
         class="mb5"
         @input="dataSourceTypeChange"
       >
-        <el-radio-button :label="true">公网</el-radio-button>
-        <el-radio-button :label="false">内网</el-radio-button>
+        <el-radio-button :label="true">{{ $t('tenant.publicNetwork') }}</el-radio-button>
+        <el-radio-button :label="false">{{ $t('tenant.privateNetwork') }}</el-radio-button>
       </el-radio-group>
       <el-form
         ref="dataSourceForm"
@@ -396,7 +296,7 @@
         :rules="dataSourceFormRules"
         label-width="120px"
       >
-        <el-form-item label="数据源类型" prop="databaseType">
+        <el-form-item :label="$t('tenant.datasourceType')" prop="databaseType">
           <el-select
             v-model="dataSourceForm.databaseType"
             :placeholder="palcemsg"
@@ -411,47 +311,46 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="数据库名称" prop="databaseName">
+        <el-form-item :label="$t('tenant.databaseName')" prop="databaseName">
           <el-input
             v-model="dataSourceForm.databaseName"
-            placeholder="请输入数据库名称"
+            :placeholder="$t('tenant.pleaseEnterDatabaseName')"
           />
         </el-form-item>
-        <el-form-item label="租户管理员账号" prop="tenantAccount">
+        <el-form-item :label="$t('tenant.tenantAccount')" prop="tenantAccount">
           <el-input
             v-model="dataSourceForm.tenantAccount"
-            placeholder="请输入租户管理员账号"
+            :placeholder="$t('tenant.pleaseEnterTenantAccount')"
           />
         </el-form-item>
 
-        <!-- !dataSourceType -->
         <el-form-item
-          label="数据库IP"
+          :label="$t('tenant.databaseIp')"
           v-show="!dataSourceType"
           prop="databaseIp"
         >
           <el-input
             v-model="dataSourceForm.databaseIp"
-            placeholder="请输数据库IP"
+            :placeholder="$t('tenant.pleaseEnterDatabaseIp')"
           />
         </el-form-item>
-        <el-form-item label="用户名" v-show="!dataSourceType" prop="username">
+        <el-form-item :label="$t('tenant.username')" v-show="!dataSourceType" prop="username">
           <el-input
             v-model="dataSourceForm.username"
-            placeholder="请输入用户名"
+            :placeholder="$t('tenant.pleaseEnterUsername')"
           />
         </el-form-item>
-        <el-form-item label="密码" v-show="!dataSourceType" prop="password">
+        <el-form-item :label="$t('tenant.password')" v-show="!dataSourceType" prop="password">
           <el-input
             v-model="dataSourceForm.password"
-            placeholder="请输入密码"
+            :placeholder="$t('tenant.pleaseEnterPassword')"
           />
         </el-form-item>
 
-        <el-form-item label="端口号" v-show="!dataSourceType" prop="portNumber">
+        <el-form-item :label="$t('tenant.portNumber')" v-show="!dataSourceType" prop="portNumber">
           <el-input
             v-model="dataSourceForm.portNumber"
-            placeholder="请输入端口号"
+            :placeholder="$t('tenant.pleaseEnterPortNumber')"
           />
         </el-form-item>
       </el-form>
@@ -461,15 +360,15 @@
           @click="submitForm1"
           :disabled="dialogLoading"
           :loading="dialogLoading"
-        >{{ dialogLoading ? "绑定中" : "确 定" }}
+        >{{ dialogLoading ? $t('tenant.binding') : $t('normal.confirm') }}
         </el-button>
-        <el-button @click="cancel1">取 消</el-button>
+        <el-button @click="cancel1">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
 
     <!-- 激活租户弹出层-->
     <el-dialog
-      title="激活租户"
+      :title="$t('tenant.activateTenant')"
       :visible.sync="tenantExpirationTimeOpen"
       width="500px"
       append-to-body
@@ -481,28 +380,28 @@
         label-width="80px"
       >
         <el-form-item
-          label="激活租户"
+          :label="$t('tenant.activateTenant')"
           prop="tenantExpirationTime"
           label-width="110px"
         >
           <el-input
             v-model="tenantExpirationTimeFrom.tenantExpirationTime"
-            placeholder="请输入激活码"
+            :placeholder="$t('tenant.pleaseEnterActivationCode')"
           />
         </el-form-item>
         <el-form-item class="btn">
           <el-button
             type="primary"
             @click="activationOperationMethod('tenantExpirationTimeFrom')"
-          >确 定
+          >{{ $t('normal.confirm') }}
           </el-button>
-          <el-button @click="tanentCancel">取 消</el-button>
+          <el-button @click="tanentCancel">{{ $t('normal.cancel') }}</el-button>
         </el-form-item>
       </el-form>
     </el-dialog>
     <!-- 登录页面配置信息列表 -->
     <el-dialog
-      title="配置登录页"
+      :title="$t('tenant.configLoginPage')"
       width="800px"
       :visible.sync="loginOpen"
       append-to-body
@@ -517,71 +416,62 @@
         <el-form-item prop="loginPageNumber">
           <span slot="label">
             <el-tooltip
-              content="请在登录时的url后拼接参数:tenantId={编号}"
+              :content="$t('tenant.loginUrlTip')"
               placement="top"
             >
               <i class="el-icon-question"></i>
             </el-tooltip>
-            编号:
+            {{ $t('tenant.number') }}:
           </span>
           <el-input
             v-model="loginForm.loginPageNumber"
-            placeholder="请输入登录页面编号"
+            :placeholder="$t('tenant.pleaseEnterLoginPageNumber')"
             disabled
           />
         </el-form-item>
-        <!-- <el-col :span="8"> -->
-        <el-form-item label="标题:" prop="loginPageTitle">
+        <el-form-item :label="$t('tenant.title')" prop="loginPageTitle">
           <el-input
             v-model="loginForm.loginPageTitle"
-            placeholder="请输入登录页面标题"
+            :placeholder="$t('tenant.pleaseEnterLoginPageTitle')"
           />
         </el-form-item>
-        <!-- </el-col> -->
-        <!-- <el-col :span="8"> -->
-        <el-form-item label="描述:" prop="loginPageDescription">
+        <el-form-item :label="$t('tenant.description')" prop="loginPageDescription">
           <span slot="label">
             <el-tooltip
-              content="推荐长度为8个汉字,可使用<br/>换行"
+              :content="$t('tenant.descriptionTip')"
               placement="top"
             >
               <i class="el-icon-question"></i>
             </el-tooltip>
-            描述:
+            {{ $t('tenant.description') }}:
           </span>
           <el-input
             v-model="loginForm.loginPageDescription"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('tenant.pleaseEnterContent')"
           />
         </el-form-item>
-        <!-- </el-col>
-        <el-col :span="8"> -->
-        <el-form-item label="窗口标题:" prop="windowTitle">
+        <el-form-item :label="$t('tenant.windowTitle')" prop="windowTitle">
           <el-input
             v-model="loginForm.windowTitle"
-            placeholder="请输入窗口标题"
+            :placeholder="$t('tenant.pleaseEnterWindowTitle')"
           />
         </el-form-item>
-        <!-- </el-col> -->
-        <!-- <el-col :span="8"> -->
         <el-form-item prop="loginPageLogo">
           <span slot="label">
-            <el-tooltip content="推荐图片大小为194*64px" placement="top">
+            <el-tooltip :content="$t('tenant.logoTip')" placement="top">
               <i class="el-icon-question"></i>
             </el-tooltip>
-            logo:
+            {{ $t('tenant.logo') }}:
           </span>
           <image-upload :limit="1" v-model="loginForm.loginPageLogo" />
         </el-form-item>
-        <!-- </el-col> -->
-        <!-- <el-col :span="8"> -->
         <el-form-item prop="loginPageBackgroundImage">
           <span slot="label">
-            <el-tooltip content="推荐图片大小为1400*900px" placement="top">
+            <el-tooltip :content="$t('tenant.backgroundImageTip')" placement="top">
               <i class="el-icon-question"></i>
             </el-tooltip>
-            背景图:
+            {{ $t('tenant.backgroundImage') }}:
           </span>
           <image-upload
             :limit="1"
@@ -601,8 +491,8 @@
         <!-- </el-col> -->
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitLoginForm">确 定</el-button>
-        <el-button @click="cancelLoginForm">取 消</el-button>
+        <el-button type="primary" @click="submitLoginForm">{{ $t('normal.confirm') }}</el-button>
+        <el-button @click="cancelLoginForm">{{ $t('normal.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -828,6 +718,7 @@ export default {
     this.getList();
     // this.selectAllUser();
     this.getTenantTypeList();
+    this.getTenantAllList();
   },
   methods: {
     load(tree, treeNode, resolve) {
@@ -850,6 +741,7 @@ export default {
     // 查询所有平台所有租户
     getTenantAllList() {
       tenantTree().then((response) => {
+        console.log("response", response);
         let tenantAllListOne = this.handleTree(
           response.data,
           "tenantId",
@@ -859,6 +751,7 @@ export default {
           // { tenantId: 0, tenantName: "顶级租户" },
           ...tenantAllListOne,
         ];
+        console.log('tenantAllList', this.tenantAllList)
       });
     },
     buildTree(data, parentId = null) {
@@ -1052,6 +945,7 @@ export default {
     getList() {
       this.loading = true;
       this.currentPage = this.queryParams.pageNum;
+      console.log('this.userInfo',this.userInfo);
       this.queryParams.tenantParentId = this.userInfo.user.tenant.tenantId;
       getTenantAllList(this.queryParams).then((response) => {
         this.tenantList = response.rows;
@@ -1273,13 +1167,13 @@ export default {
     handleDelete(row) {
       const tenantIds = row.tenantId || this.ids;
       this.$modal
-        .confirm('是否确认删除租户信息编号为"' + tenantIds + '"的数据项?')
+        .confirm(this.$t('normal.isConfirmDelete') + tenantIds + '"的数据项?')
         .then(function () {
           return delTenant(tenantIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('normal.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 19 - 11
zkqy-ui/src/views/system/user/profile/index.vue

@@ -4,7 +4,7 @@
       <el-col :span="6" :xs="24">
         <el-card class="box-card">
           <div slot="header" class="clearfix">
-            <span>个人信息</span>
+            <span>{{ $t('user.info') }}</span>
           </div>
           <div>
             <div class="text-center">
@@ -12,43 +12,50 @@
             </div>
             <ul class="list-group list-group-striped">
               <li class="list-group-item">
-                <svg-icon icon-class="user" />用户名称
+                <svg-icon icon-class="user" />
+                {{ $t('user.name') }}
                 <div class="pull-right">{{ user.userName }}</div>
               </li>
               <li class="list-group-item">
-                <svg-icon icon-class="phone" />手机号码
+                <svg-icon icon-class="phone" />
+                {{ $t('user.phone') }}
                 <div class="pull-right">{{ user.phonenumber }}</div>
               </li>
               <li class="list-group-item">
-                <svg-icon icon-class="email" />用户邮箱
+                <svg-icon icon-class="email" />
+                {{ $t('user.email') }}
                 <div class="pull-right">{{ user.email }}</div>
               </li>
               <li class="list-group-item">
-                <svg-icon icon-class="tree" />所属部门
+                <svg-icon icon-class="tree" />{{ $t('user.dept') }}
                 <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
               </li>
               <li class="list-group-item">
-                <svg-icon icon-class="peoples" />所属角色
+                <svg-icon icon-class="peoples" />{{ $t('user.role') }}
                 <div class="pull-right">{{ roleGroup }}</div>
               </li>
               <li class="list-group-item">
-                <svg-icon icon-class="date" />创建日期
+                <svg-icon icon-class="date" />{{ $t('user.createDay') }}
                 <div class="pull-right">{{ user.createTime }}</div>
               </li>
             </ul>
+            <div style="display: flex; justify-content: space-between; align-items: center;">
+              {{ $t('user.languageSelect') }}
+              <lang-select />
+            </div>
           </div>
         </el-card>
       </el-col>
       <el-col :span="18" :xs="24">
         <el-card>
           <div slot="header" class="clearfix">
-            <span>基本资料</span>
+            <span>{{ $t('user.profile') }}</span>
           </div>
           <el-tabs v-model="activeTab">
-            <el-tab-pane label="基本资料" name="userinfo">
+            <el-tab-pane :label="$t('user.profile')" name="userinfo">
               <userInfo :user="user" />
             </el-tab-pane>
-            <el-tab-pane label="修改密码" name="resetPwd">
+            <el-tab-pane :label="$t('user.updatePassword')" name="resetPwd">
               <resetPwd />
             </el-tab-pane>
           </el-tabs>
@@ -63,10 +70,11 @@ import userAvatar from "./userAvatar";
 import userInfo from "./userInfo";
 import resetPwd from "./resetPwd";
 import { getUserProfile } from "@/api/system/user";
+import LangSelect from '@/components/LangSelect/index.vue'
 
 export default {
   name: "Profile",
-  components: { userAvatar, userInfo, resetPwd },
+  components: { LangSelect, userAvatar, userInfo, resetPwd },
   data() {
     return {
       user: {},

+ 12 - 12
zkqy-ui/src/views/system/user/profile/resetPwd.vue

@@ -1,17 +1,17 @@
 <template>
   <el-form ref="form" :model="user" :rules="rules" label-width="80px">
-    <el-form-item label="旧密码" prop="oldPassword">
-      <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
+    <el-form-item :label="$t('user.oldPassword')" prop="oldPassword">
+      <el-input v-model="user.oldPassword" :placeholder="$t('normal.pleaseEnter') + $t('normal.blank') + $t('user.oldPassword')" type="password" show-password/>
     </el-form-item>
-    <el-form-item label="新密码" prop="newPassword">
-      <el-input v-model="user.newPassword" placeholder="请输入新密码" type="password" show-password/>
+    <el-form-item :label="$t('user.newPassword')" prop="newPassword">
+      <el-input v-model="user.newPassword" :placeholder="$t('normal.pleaseEnter') + $t('normal.blank') + $t('user.newPassword')" type="password" show-password/>
     </el-form-item>
-    <el-form-item label="确认密码" prop="confirmPassword">
-      <el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
+    <el-form-item :label="$t('user.confirmPassword')" prop="confirmPassword">
+      <el-input v-model="user.confirmPassword" :placeholder="$t('user.confirmPassword')" type="password" show-password/>
     </el-form-item>
     <el-form-item>
-      <el-button type="primary" size="mini" @click="submit">保存</el-button>
-      <el-button type="danger" size="mini" @click="close">关闭</el-button>
+      <el-button type="primary" size="mini" @click="submit">{{$t('normal.save')}}</el-button>
+      <el-button type="danger" size="mini" @click="close">{{$t('normal.close')}}</el-button>
     </el-form-item>
   </el-form>
 </template>
@@ -37,14 +37,14 @@ export default {
       // 表单校验
       rules: {
         oldPassword: [
-          { required: true, message: "旧密码不能为空", trigger: "blur" }
+          { required: true, message: this.$t('user.oldPassword') +this.$t('normal.blank')+ this.$t('normal.notEmpty'), trigger: "blur" }
         ],
         newPassword: [
-          { required: true, message: "新密码不能为空", trigger: "blur" },
-          { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
+          { required: true, message: this.$t('user.newPassword') + this.$t('normal.blank')+ this.$t('normal.notEmpty'), trigger: "blur" },
+          { min: 6, max: 20, message: this.$t('rules.passwordLimit'), trigger: "blur" }
         ],
         confirmPassword: [
-          { required: true, message: "确认密码不能为空", trigger: "blur" },
+          { required: true, message: this.$t('user.confirmPassword')  + this.$t('normal.blank')+ this.$t('normal.notEmpty'), trigger: "blur" },
           { required: true, validator: equalToPassword, trigger: "blur" }
         ]
       }

+ 37 - 37
zkqy-ui/src/views/system/user/profile/userAvatar.vue

@@ -2,32 +2,32 @@
   <div>
     <div class="user-info-head" @click="editCropper()">
       <img
-        v-bind:src="options.img"
-        title="点击上传头像"
-        class="img-circle img-lg"
+          v-bind:src="options.img"
+          title="点击上传头像"
+          class="img-circle img-lg"
       />
     </div>
     <el-dialog
-      :title="title"
-      :visible.sync="open"
-      width="800px"
-      append-to-body
-      @opened="modalOpened"
-      @close="closeDialog"
+        :title="title"
+        :visible.sync="open"
+        width="800px"
+        append-to-body
+        @opened="modalOpened"
+        @close="closeDialog"
     >
       <el-row>
         <el-col :xs="24" :md="12" :style="{ height: '350px' }">
           <vue-cropper
-            ref="cropper"
-            :img="options.img"
-            :info="true"
-            :autoCrop="options.autoCrop"
-            :autoCropWidth="options.autoCropWidth"
-            :autoCropHeight="options.autoCropHeight"
-            :fixedBox="options.fixedBox"
-            :outputType="options.outputType"
-            @realTime="realTime"
-            v-if="visible"
+              ref="cropper"
+              :img="options.img"
+              :info="true"
+              :autoCrop="options.autoCrop"
+              :autoCropWidth="options.autoCropWidth"
+              :autoCropHeight="options.autoCropHeight"
+              :fixedBox="options.fixedBox"
+              :outputType="options.outputType"
+              @realTime="realTime"
+              v-if="visible"
           />
         </el-col>
         <el-col :xs="24" :md="12" :style="{ height: '350px' }">
@@ -40,10 +40,10 @@
       <el-row>
         <el-col :lg="2" :sm="3" :xs="3">
           <el-upload
-            action="#"
-            :http-request="requestUpload"
-            :show-file-list="false"
-            :before-upload="beforeUpload"
+              action="#"
+              :http-request="requestUpload"
+              :show-file-list="false"
+              :before-upload="beforeUpload"
           >
             <el-button size="small">
               选择
@@ -53,35 +53,35 @@
         </el-col>
         <el-col :lg="{ span: 1, offset: 2 }" :sm="2" :xs="2">
           <el-button
-            icon="el-icon-plus"
-            size="small"
-            @click="changeScale(1)"
+              icon="el-icon-plus"
+              size="small"
+              @click="changeScale(1)"
           ></el-button>
         </el-col>
         <el-col :lg="{ span: 1, offset: 1 }" :sm="2" :xs="2">
           <el-button
-            icon="el-icon-minus"
-            size="small"
-            @click="changeScale(-1)"
+              icon="el-icon-minus"
+              size="small"
+              @click="changeScale(-1)"
           ></el-button>
         </el-col>
         <el-col :lg="{ span: 1, offset: 1 }" :sm="2" :xs="2">
           <el-button
-            icon="el-icon-refresh-left"
-            size="small"
-            @click="rotateLeft()"
+              icon="el-icon-refresh-left"
+              size="small"
+              @click="rotateLeft()"
           ></el-button>
         </el-col>
         <el-col :lg="{ span: 1, offset: 1 }" :sm="2" :xs="2">
           <el-button
-            icon="el-icon-refresh-right"
-            size="small"
-            @click="rotateRight()"
+              icon="el-icon-refresh-right"
+              size="small"
+              @click="rotateRight()"
           ></el-button>
         </el-col>
         <el-col :lg="{ span: 2, offset: 6 }" :sm="2" :xs="2">
           <el-button type="primary" size="small" @click="uploadImg()"
-            >提 交</el-button
+          >提 交</el-button
           >
         </el-col>
       </el-row>
@@ -160,7 +160,7 @@ export default {
     beforeUpload(file) {
       if (file.type.indexOf("image/") == -1) {
         this.$modal.msgError(
-          "文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。"
+            "文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。"
         );
       } else {
         const reader = new FileReader();

+ 14 - 14
zkqy-ui/src/views/system/user/profile/userInfo.vue

@@ -1,23 +1,23 @@
 <template>
   <el-form ref="form" :model="user" :rules="rules" label-width="80px">
-    <el-form-item label="用户昵称" prop="nickName">
+    <el-form-item :label="$t('user.nickname')" prop="nickName">
       <el-input v-model="user.nickName" maxlength="30" />
-    </el-form-item> 
-    <el-form-item label="手机号码" prop="phonenumber">
+    </el-form-item>
+    <el-form-item :label="$t('user.phone')" prop="phonenumber">
       <el-input v-model="user.phonenumber" maxlength="11" />
     </el-form-item>
-    <el-form-item label="邮箱" prop="email">
+    <el-form-item :label="$t('user.email')" prop="email">
       <el-input v-model="user.email" maxlength="50" />
     </el-form-item>
-    <el-form-item label="性别">
+    <el-form-item :label="$t('user.sex')">
       <el-radio-group v-model="user.sex">
-        <el-radio label="0"></el-radio>
-        <el-radio label="1"></el-radio>
+        <el-radio label="0">{{$t('user.man')}}</el-radio>
+        <el-radio label="1">{{$t('user.woman')}}</el-radio>
       </el-radio-group>
     </el-form-item>
     <el-form-item>
-      <el-button type="primary" size="mini" @click="submit">保存</el-button>
-      <el-button type="danger" size="mini" @click="close">关闭</el-button>
+      <el-button type="primary" size="mini" @click="submit">{{$t('normal.save')}}</el-button>
+      <el-button type="danger" size="mini" @click="close">{{$t('normal.close')}}</el-button>
     </el-form-item>
   </el-form>
 </template>
@@ -36,21 +36,21 @@ export default {
       // 表单校验
       rules: {
         nickName: [
-          { required: true, message: "用户昵称不能为空", trigger: "blur" }
+          { required: true, message: this.$t('user.nickname') +this.$t('normal.blank')+ this.$t('normal.notEmpty'), trigger: "blur" }
         ],
         email: [
-          { required: true, message: "邮箱地址不能为空", trigger: "blur" },
+          { required: true, message: this.$t('user.email') +this.$t('normal.blank')+ this.$t('normal.notEmpty'), trigger: "blur" },
           {
             type: "email",
-            message: "请输入正确的邮箱地址",
+            message: this.$t('normal.pleaseConfirm') + this.$t('user.email'),
             trigger: ["blur", "change"]
           }
         ],
         phonenumber: [
-          { required: true, message: "手机号码不能为空", trigger: "blur" },
+          { required: true, message: this.$t('user.phone') +this.$t('normal.blank')+ this.$t('normal.notEmpty'), trigger: "blur" },
           {
             pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-            message: "请输入正确的手机号码",
+            message: this.$t('normal.pleaseConfirm') + this.$t('user.phone'),
             trigger: "blur"
           }
         ]

+ 34 - 36
zkqy-ui/src/views/tableMange/components/ClassificationQueryPanel.vue

@@ -6,11 +6,11 @@
       icon="el-icon-plus"
       size="mini"
       @click="addCondition">
-      添加
+      {{ $t('classificationQuery.add') }}
     </el-button>
     <el-table :data="tableData" style="width: 100%">
-      <el-table-column align="center" label="序号" type="index" width="50"/>
-      <el-table-column align="center" prop="conditionName" label="条件名称">
+      <el-table-column align="center" :label="$t('common.serialNumber')" type="index" width="50"/>
+      <el-table-column align="center" prop="conditionName" :label="$t('classificationQuery.conditionName')">
         <template slot-scope="scope">
           <el-input
             v-model="scope.row.conditionName"
@@ -23,9 +23,9 @@
       <el-table-column
         align="center"
         prop="conditionField"
-        label="条件字段">
+        :label="$t('classificationQuery.conditionField')">
         <template slot-scope="scope">
-          <el-select v-model="scope.row.conditionField" placeholder="请选择条件字段" filterable>
+          <el-select v-model="scope.row.conditionField" :placeholder="$t('classificationQuery.settings.placeholder.selectField')" filterable>
             <el-option
               v-for="item in fieldList"
               :key="item.fieldName"
@@ -42,7 +42,7 @@
         </template>
       </el-table-column>
 
-      <el-table-column align="center" prop="conditionType" label="条件类型">
+      <el-table-column align="center" prop="conditionType" :label="$t('classificationQuery.conditionType')">
         <template slot-scope="scope">
           <el-select v-model="scope.row.conditionType" filterable>
             <el-option v-for="item in conditionTypeOptions" :key="item.value" :label="item.label" :value="item.value">
@@ -50,56 +50,54 @@
           </el-select>
         </template>
       </el-table-column>
-      <el-table-column align="center" prop="conditionDefaultValue" label="默认条件值">
+      <el-table-column align="center" prop="conditionDefaultValue" :label="$t('classificationQuery.defaultValue')">
         <template slot-scope="scope">
           <el-input v-model="scope.row.conditionDefaultValue"
                     :disabled="scope.row.conditionType!='button' && scope.row.conditionType!='radio'"></el-input>
         </template>
       </el-table-column>
-      <el-table-column align="center" prop="sort" label="渲染顺序" width="80">
+      <el-table-column align="center" prop="sort" :label="$t('classificationQuery.renderOrder')" width="80">
         <template slot-scope="scope">
           <el-input v-model="scope.row.sort"></el-input>
         </template>
       </el-table-column>
-      <el-table-column label="操作">
+      <el-table-column :label="$t('common.operation')">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             @click="openHandler(scope)"
-          >更多
+          >{{ $t('classificationQuery.more') }}
           </el-button>
           <el-button
             size="mini"
             type="text"
             @click="delHandler(scope.$index)"
-          >删除
+          >{{ $t('classificationQuery.delete') }}
           </el-button>
         </template>
       </el-table-column>
     </el-table>
     <!--  查询条件更多设置弹窗  -->
     <el-dialog :title="settings.title" :visible.sync="settings.open" width="500px" append-to-body>
-      <!-- 下拉框数据来源(字典、表数据)设置label、value -->
-      <!-- 时间范围(选择到年、月、日 时、分、秒)   -->
       <el-form label-width="100px" v-if="tableData.length!=0">
-        <el-form-item label="显示类型">
+        <el-form-item :label="$t('classificationQuery.settings.displayType')">
           <el-select v-model="tableData[settings.dataIndex].componentType" clearable filterable>
             <el-option v-for="item in componentTypeOptions" :key="item.value" :label="item.label"
                        :value="item.value"/>
           </el-select>
         </el-form-item>
-        <el-form-item label="显示尺寸">
+        <el-form-item :label="$t('classificationQuery.settings.displaySize')">
           <el-select v-model="tableData[settings.dataIndex].componentSize" clearable filterable>
             <el-option v-for="item in componentSizeOptions" :key="item.value" :label="item.label" :value="item.value"/>
           </el-select>
         </el-form-item>
-        <el-form-item label="显示图标">
+        <el-form-item :label="$t('classificationQuery.settings.displayIcon')">
           <el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()">
             <IconSelect ref="iconSelect" @selected="(name) => selected(name, settings.row)"
                         :active-icon="tableData[settings.dataIndex].componentIcon"/>
             <el-input slot="reference" v-model="tableData[settings.dataIndex].componentIcon"
-                      placeholder="点击选择图标" readonly>
+                      :placeholder="$t('classificationQuery.settings.placeholder.selectIcon')" readonly>
               <svg-icon v-if="tableData[settings.dataIndex].componentIcon" slot="prefix"
                         :icon-class="tableData[settings.dataIndex].componentIcon"
                         style="width: 25px"/>
@@ -107,13 +105,13 @@
             </el-input>
           </el-popover>
         </el-form-item>
-        <el-form-item label="条件描述">
+        <el-form-item :label="$t('classificationQuery.settings.conditionDescription')">
           <el-input v-model="tableData[settings.dataIndex].conditionNotes" type="text"
-                    placeholder="描述例句(请输入姓名、请输入编号...)"/>
+                    :placeholder="$t('classificationQuery.settings.placeholder.enterDescription')"/>
         </el-form-item>
-        <el-form-item label="下拉sql" v-show="tableData[settings.dataIndex].conditionType=='select'">
+        <el-form-item :label="$t('classificationQuery.settings.dropdownSql')" v-show="tableData[settings.dataIndex].conditionType=='select'">
           <el-input v-model="tableData[settings.dataIndex].conditionDatasource" type="textarea" :rows="8"
-                    placeholder="请输入当前下拉框数据来源sql语句,例如:SELECT custom_name AS `label`, custom_no AS `value`, id AS id FROM {DBNAME}.customer"/>
+                    :placeholder="$t('classificationQuery.settings.placeholder.enterSql')"/>
         </el-form-item>
       </el-form>
     </el-dialog>
@@ -166,56 +164,56 @@ export default {
       ],
       conditionTypeOptions: [
         {
-          label: "文本",
+          label: this.$t('common.text'),
           value: "input",
         },
         {
-          label: "按钮",
+          label: this.$t('common.button'),
           value: "button",
         },
         {
-          label: "下拉",
+          label: this.$t('common.dropdown'),
           value: "select",
         },
         {
-          label: "单选",
+          label: this.$t('common.radio'),
           value: "radio",
         },
         {
-          label: "时间范围",
+          label: this.$t('common.dateRange'),
           value: "datetimerange",
         },
       ],
       componentTypeOptions: [
         {
-          label: "主要",
+          label: this.$t('common.primary'),
           value: "primary",
         },
         {
-          label: "成功",
+          label: this.$t('common.success'),
           value: "success",
         },
         {
-          label: "警告",
+          label: this.$t('common.warning'),
           value: "warning",
         },
         {
-          label: "危险",
+          label: this.$t('common.danger'),
           value: "danger",
         },
         {
-          label: "信息",
+          label: this.$t('common.info'),
           value: "info",
         },
         {
-          label: "文本",
+          label: this.$t('common.text'),
           value: "text",
         },
       ],
       componentSizeOptions: [
-        {value: "small", label: "较小"},
-        {value: "default", label: "默认"},
-        {value: "large", label: "较大"},
+        {value: "small", label: this.$t('common.small')},
+        {value: "default", label: this.$t('common.default')},
+        {value: "large", label: this.$t('common.large')},
       ],
     };
   },
@@ -253,7 +251,7 @@ export default {
       this.settings.dataIndex = scope.$index;
       this.settings.row = scope.row;
       this.settings.open = true
-      this.settings.title = "设置条件-" + scope.row.conditionName
+      this.settings.title = this.$t('classificationQuery.settings.title') + "-" + scope.row.conditionName
     },
     // 处理联合查询,默认值输入框禁用逻辑
     handleDisabled(row) {

+ 9 - 9
zkqy-ui/src/views/tableMange/components/DataFilterPanel.vue

@@ -7,21 +7,21 @@
       size="mini"
       @click="addCondition"
     >
-      添加条件
+      {{ $t('dataFilter.addCondition') }}
     </el-button>
     <el-table :data="tableData" style="width: 100%">
-      <el-table-column align="center" label="序号" type="index" width="50">
+      <el-table-column align="center" :label="$t('common.serialNumber')" type="index" width="50">
       </el-table-column>
       <el-table-column
         align="center"
         prop="fieldName"
-        label="条件字段"
+        :label="$t('dataFilter.conditionField')"
         width="100"
       >
         <template slot-scope="scope">
           <el-select
             v-model="scope.row.fieldName"
-            placeholder="请选择条件字段"
+            :placeholder="$t('dataFilter.placeholder.selectField')"
             clearable
             filterable
           >
@@ -41,9 +41,9 @@
           </el-select>
         </template>
       </el-table-column>
-      <el-table-column align="center" prop="condition" label="条件">
+      <el-table-column align="center" prop="condition" :label="$t('dataFilter.condition')">
         <template slot-scope="scope">
-          <el-select v-model="scope.row.condition" placeholder="请选择">
+          <el-select v-model="scope.row.condition" :placeholder="$t('common.pleaseSelect')">
             <el-option
               v-for="item in conditionList"
               :key="item.label"
@@ -54,19 +54,19 @@
           </el-select>
         </template>
       </el-table-column>
-      <el-table-column align="center" prop="refValue" label="参照值">
+      <el-table-column align="center" prop="refValue" :label="$t('dataFilter.referenceValue')">
         <template slot-scope="scope">
           <el-input v-model="scope.row.refValue"></el-input>
         </template>
       </el-table-column>
-      <el-table-column label="操作">
+      <el-table-column :label="$t('common.operation')">
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="delHandler(scope.$index)"
-            >删除
+            >{{ $t('dataFilter.delete') }}
           </el-button>
         </template>
       </el-table-column>

+ 48 - 53
zkqy-ui/src/views/tableMange/components/StyleFormPanel.vue

@@ -7,18 +7,18 @@
       size="mini"
       @click="addDataDialog"
     >
-      添加样式
+      {{ $t('styleForm.addStyle') }}
     </el-button>
     <!-- 样式表格 -->
     <el-table :data="styleTableData" style="width: 100%">
-      <el-table-column label="序号" type="index" width="50"> </el-table-column>
-      <el-table-column prop="styleName" label="样式名"> </el-table-column>
-      <el-table-column prop="styleDescription" label="描述"> </el-table-column>
-      <el-table-column label="操作">
+      <el-table-column :label="$t('styleForm.serialNumber')" type="index" width="50"> </el-table-column>
+      <el-table-column prop="styleName" :label="$t('styleForm.styleName')"> </el-table-column>
+      <el-table-column prop="styleDescription" :label="$t('styleForm.description')"> </el-table-column>
+      <el-table-column :label="$t('styleForm.operation')">
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('styleForm.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -27,7 +27,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="editHandler(scope.row, scope.$index)"
-                  >修改
+                  >{{ $t('styleForm.modify') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -36,7 +36,7 @@
                   type="text"
                   icon="el-icon-delete"
                   @click="delHandler(scope.$index)"
-                  >删除
+                  >{{ $t('styleForm.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -44,31 +44,31 @@
         </template>
       </el-table-column>
     </el-table>
-    <el-dialog title="编辑样式" :visible.sync="dialogShow" width="50%">
+    <el-dialog :title="$t('styleForm.editStyle')" :visible.sync="dialogShow" width="50%">
       <el-form
         ref="styleFormDataRef"
         :model="styleFormData"
         label-width="100px"
         :rules="styleFormRules"
       >
-        <el-form-item label="样式名" prop="styleName">
+        <el-form-item :label="$t('styleForm.styleName')" prop="styleName">
           <el-input v-model="styleFormData.styleName"></el-input>
         </el-form-item>
-        <el-form-item label="样式描述" prop="styleDescription">
+        <el-form-item :label="$t('styleForm.styleDescription')" prop="styleDescription">
           <el-input
             type="textarea"
             v-model="styleFormData.styleDescription"
           ></el-input>
         </el-form-item>
-        <el-form-item label="样式类型" prop="styleType">
+        <el-form-item :label="$t('styleForm.styleType')" prop="styleType">
           <el-radio-group v-model="styleFormData.styleType" size="small">
-            <el-radio-button :label="0">行样式</el-radio-button>
-            <el-radio-button :label="1">字段样式</el-radio-button>
-            <el-radio-button :label="2">字典样式</el-radio-button>
+            <el-radio-button :label="0">{{ $t('styleForm.rowStyle') }}</el-radio-button>
+            <el-radio-button :label="1">{{ $t('styleForm.fieldStyle') }}</el-radio-button>
+            <el-radio-button :label="2">{{ $t('styleForm.dictionaryStyle') }}</el-radio-button>
           </el-radio-group>
         </el-form-item>
         <div v-show="styleFormData.styleType == 0">
-          <el-form-item label="背景颜色" prop="rowBgColor">
+          <el-form-item :label="$t('styleForm.backgroundColor')" prop="rowBgColor">
             <input
               type="color"
               :value="styleFormData.rowBgColor"
@@ -77,12 +77,12 @@
           </el-form-item>
         </div>
         <div v-show="styleFormData.styleType == 1">
-          <el-form-item label="样式生效字段" prop="styleTable">
+          <el-form-item :label="$t('styleForm.styleField')" prop="styleTable">
             <el-col :span="10">
               <el-select
                 v-model="styleFormData.styleTable"
                 value-key=""
-                placeholder="请选择表"
+                :placeholder="$t('styleForm.selectTable')"
                 filterable
               >
                 <el-option
@@ -102,7 +102,7 @@
               <el-select
                 v-model="styleFormData.styleField"
                 value-key=""
-                placeholder="请选择字段"
+                :placeholder="$t('styleForm.selectField')"
                 filterable
               >
                 <el-option
@@ -119,14 +119,14 @@
               </el-select>
             </el-col>
           </el-form-item>
-          <el-form-item label="文本样式">
+          <el-form-item :label="$t('styleForm.textStyle')">
             <el-radio-group v-model="styleFormData.fieldStyleType" size="small">
-              <el-radio-button :label="0">普通文本</el-radio-button>
-              <el-radio-button :label="1">标签</el-radio-button>
+              <el-radio-button :label="0">{{ $t('styleForm.normalText') }}</el-radio-button>
+              <el-radio-button :label="1">{{ $t('styleForm.tag') }}</el-radio-button>
             </el-radio-group>
           </el-form-item>
           <template v-if="styleFormData.fieldStyleType == 0">
-            <el-form-item label="字体颜色">
+            <el-form-item :label="$t('styleForm.fontColor')">
               <input
                 type="color"
                 :value="styleFormData.fontColor"
@@ -135,25 +135,20 @@
             </el-form-item>
           </template>
           <template v-else>
-            <el-form-item label="标签样式">
+            <el-form-item :label="$t('styleForm.tagStyle')">
               <el-switch
                 v-model="styleFormData.isTagFullBg"
-                active-text="背景填充"
-                inactive-text="仅文字"
+                :active-text="$t('styleForm.backgroundFill')"
+                :inactive-text="$t('styleForm.textOnly')"
               >
               </el-switch>
             </el-form-item>
-            <el-form-item label="标签类型">
-              <!-- <input
-                type="color"
-                :value="styleFormData.tagColor"
-                @input="selectColors($event, 'tagColor')"
-              /> -->
+            <el-form-item :label="$t('styleForm.tagType')">
               <el-select v-model="styleFormData.tagType">
                 <el-option
                   v-for="(item, index) in tagTypeList"
                   :key="index"
-                  :label="item.label"
+                  :label="$t('styleForm.' + item.value)"
                   :value="item.value"
                 >
                 </el-option>
@@ -164,18 +159,18 @@
                 size="normal"
                 :type="styleFormData.tagType"
                 :effect="styleFormData.isTagFullBg ? 'dark' : 'light'"
-                >标签一</el-tag
+                >{{ $t('styleForm.tag') }}</el-tag
               >
             </el-form-item>
           </template>
         </div>
         <div v-show="styleFormData.styleType == 2">
-          <el-form-item label="字典生效字段" size="normal" prop="styleTable">
+          <el-form-item :label="$t('styleForm.dictionaryField')" size="normal" prop="styleTable">
             <el-col :span="10">
               <el-select
                 v-model="styleFormData.styleTable"
                 value-key=""
-                placeholder="请选择表"
+                :placeholder="$t('styleForm.selectTable')"
                 clearable
                 filterable
               >
@@ -198,7 +193,7 @@
               <el-select
                 v-model="styleFormData.styleField"
                 value-key=""
-                placeholder="请选择字段"
+                :placeholder="$t('styleForm.selectField')"
                 clearable
                 filterable
               >
@@ -218,10 +213,10 @@
               </el-select>
             </el-col>
           </el-form-item>
-          <el-form-item label="字典" size="normal">
+          <el-form-item :label="$t('styleForm.dictionary')" size="normal">
             <el-select
               v-model="styleFormData.styleCondtion"
-              placeholder="请选择字典"
+              :placeholder="$t('styleForm.selectDictionary')"
               filterable
             >
               <el-option
@@ -235,16 +230,16 @@
           </el-form-item>
         </div>
         <div v-show="styleFormData.styleType != 2" class="condition-table-wrap">
-          <span class="table-title">条件编辑</span>
+          <span class="table-title">{{ $t('styleForm.conditionEdit') }}</span>
           <el-table :data="conditionTableData" style="width: 100%">
-            <el-table-column label="序号" type="index" width="50">
+            <el-table-column :label="$t('styleForm.serialNumber')" type="index" width="50">
             </el-table-column>
-            <el-table-column prop="tableName" label="表名" width="150">
+            <el-table-column prop="tableName" :label="$t('styleForm.tableName')" width="150">
               <template slot-scope="scope">
                 <el-select
                   v-model="scope.row.tableName"
                   @change="conditionTableChange(scope.row)"
-                  placeholder="请选择"
+                  :placeholder="$t('styleForm.selectTable')"
                 >
                   <el-option
                     v-for="item in tableList"
@@ -263,9 +258,9 @@
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column prop="fieldName" label="字段名" width="150">
+            <el-table-column prop="fieldName" :label="$t('styleForm.fieldName')" width="150">
               <template slot-scope="scope">
-                <el-select v-model="scope.row.fieldName" placeholder="请选择">
+                <el-select v-model="scope.row.fieldName" :placeholder="$t('styleForm.selectField')">
                   <el-option
                     v-for="item in scope.row.fieldList"
                     :key="item.fieldName"
@@ -283,9 +278,9 @@
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column prop="condition" label="条件" width="100">
+            <el-table-column prop="condition" :label="$t('styleForm.condition')" width="100">
               <template slot-scope="scope">
-                <el-select v-model="scope.row.condition" placeholder="请选择">
+                <el-select v-model="scope.row.condition" :placeholder="$t('styleForm.selectField')">
                   <el-option
                     v-for="item in conditionList"
                     :key="item.value"
@@ -296,7 +291,7 @@
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column prop="flagValue" label="参照值" width="100">
+            <el-table-column prop="flagValue" :label="$t('styleForm.referenceValue')" width="100">
               <template slot-scope="scope">
                 <el-input
                   v-model="scope.row.flagValue"
@@ -309,14 +304,14 @@
                 ></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="操作">
+            <el-table-column :label="$t('styleForm.operation')">
               <template slot-scope="scope">
                 <el-button
                   size="mini"
                   type="danger"
                   icon="el-icon-delete"
                   @click="deleteConditionItem(scope.$index)"
-                  >删除
+                  >{{ $t('styleForm.delete') }}
                 </el-button>
               </template>
             </el-table-column>
@@ -329,14 +324,14 @@
             style="width: 100%"
             @click="addConditionHandler"
           >
-            添加条件
+            {{ $t('styleForm.addCondition') }}
           </el-button>
         </div>
       </el-form>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="dialogShow = false">取 消</el-button>
+        <el-button @click="dialogShow = false">{{ $t('styleForm.cancel') }}</el-button>
         <el-button type="primary" @click="saveStyleFormHandler"
-          >确 定</el-button
+          >{{ $t('styleForm.confirm') }}</el-button
         >
       </span>
     </el-dialog>

+ 90 - 89
zkqy-ui/src/views/tableMange/index.vue

@@ -5,7 +5,7 @@
         <el-card shadow="always" :body-style="{ padding: '20px' }">
           <template #header>
             <div>
-              <span>字段编辑</span>
+              <span>{{ $t('tableMange.fieldEdit') }}</span>
             </div>
           </template>
           <!-- <Queryfrom
@@ -13,7 +13,7 @@
             @getList="getList"
             ref="mychild"
           /> -->
-          <el-select v-model="tableName" placeholder="请选择数据表" filterable @change="getList" class="mb10">
+          <el-select v-model="tableName" :placeholder="$t('tableMange.selectTable')" filterable @change="getList" class="mb10">
             <el-option v-for="item in tableList" :key="item.tableName" :label="item.tableComment"
               :value="item.tableName">
               <span class="discribe" style="float: left">{{
@@ -37,11 +37,11 @@
               :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
             -->
             >
-            <el-table-column type="index" label="序号" width="50" class-name="allowDrag">
+            <el-table-column type="index" :label="$t('tableMange.serialNumber')" width="50" class-name="allowDrag">
             </el-table-column>
-            <el-table-column align="center" prop="fieldName" label="数据字段">
+            <el-table-column align="center" prop="fieldName" :label="$t('tableMange.dataField')">
             </el-table-column>
-            <el-table-column align="center" prop="fieldDescription" label="字段描述">
+            <el-table-column align="center" prop="fieldDescription" :label="$t('tableMange.fieldDescription')">
               <template slot-scope="scope">
                 <!-- <el-form-item size="normal" prop="fieldDescription"> -->
                 <input :class="{
@@ -57,11 +57,11 @@
                 <!-- </el-form-item> -->
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="relationTable" label="关联表">
+            <el-table-column align="center" prop="relationTable" :label="$t('tableMange.relatedTable')">
               <template slot-scope="scope">
                 <el-select v-model="scope.row.relationTable" :disabled="!scope.row.relationTableList ||
       !scope.row.relationTableList.length
-      " placeholder="请选择关联的表" clearable filterable @change="ralationTableChange(scope.row)">
+      " :placeholder="$t('tableMange.selectTable')" clearable filterable @change="ralationTableChange(scope.row)">
                   <el-option v-for="item in scope.row.relationTableList" :key="item.tableName"
                     :label="item.tableComment" :value="item.tableName">
                     <span style="float: left">{{ item.tableComment }}</span>
@@ -70,19 +70,19 @@
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="relationFieldName" label="关联条件字段">
+            <el-table-column align="center" prop="relationFieldName" :label="$t('tableMange.relatedField')">
               <template slot-scope="scope">
                 <el-select v-model="scope.row.relationFieldName" @change="relationFieldChange(scope.row)"
-                  :disabled="!scope.row.disableRelaFieldName" placeholder="关联字段" filterable>
+                  :disabled="!scope.row.disableRelaFieldName" :placeholder="$t('tableMange.relatedField')" filterable>
                   <el-option v-for="item in scope.row.relaFieldNameList" :key="item.fieldName"
                     :label="item.fieldDescription" :value="item.fieldName">
                   </el-option>
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="relationType" label="关联方式">
+            <el-table-column align="center" prop="relationType" :label="$t('tableMange.relatedType')">
               <template slot-scope="scope">
-                <el-select v-model="scope.row.relationType" placeholder="请选择关联方式" :disabled="!scope.row.disableRelaType"
+                <el-select v-model="scope.row.relationType" :placeholder="$t('tableMange.relatedType')" :disabled="!scope.row.disableRelaType"
                   @change="relationTypeChangeHandler(scope.row)" filterable>
                   <el-option v-for="item in relaTypeList" :key="item.value" :label="item.label" :value="item.value">
                   </el-option>
@@ -109,17 +109,17 @@
                 </el-select>
               </template>
             </el-table-column> -->
-            <el-table-column align="center" prop="isShow" label="是否显示">
+            <el-table-column align="center" prop="isShow" :label="$t('tableMange.isShow')">
               <template slot-scope="scope">
                 <el-switch v-model="scope.row.isShow"></el-switch>
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="isSearch" label="是否包含查询">
+            <el-table-column align="center" prop="isSearch" :label="$t('tableMange.isSearch')">
               <template slot-scope="scope">
                 <el-switch v-model="scope.row.isSearch"></el-switch>
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="isExport" label="是否导出">
+            <el-table-column align="center" prop="isExport" :label="$t('tableMange.isExport')">
               <template slot-scope="scope">
                 <el-switch v-model="scope.row.isExport"></el-switch>
               </template>
@@ -129,34 +129,34 @@
       </el-col>
       <el-col :span="6" :class="{ menudata: menudata }">
         <el-tabs v-model="activeName" @tab-click="tabhandleClick">
-          <el-tab-pane label="菜单编辑" name="menuedit">
+          <el-tab-pane :label="$t('tableMange.menuEdit')" name="menuedit">
             <el-card shadow="always" :body-style="{ padding: '10px' }">
               <el-form ref="formData" :model="formData" label-width="100px" :rules="rules">
-                <el-form-item label="菜单类型" prop="dtType">
-                  <el-select v-model="formData.dtType" placeholder="请选择菜单类型">
-                    <el-option label="表格菜单" value="0"></el-option>
-                    <el-option label="树形菜单" value="3"></el-option>
+                <el-form-item :label="$t('tableMange.menuType')" prop="dtType">
+                  <el-select v-model="formData.dtType" :placeholder="$t('tableMange.menuType')">
+                    <el-option :label="$t('tableMange.tableMenu')" value="0"></el-option>
+                    <el-option :label="$t('tableMange.treeMenu')" value="3"></el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item label="菜单名称" prop="menuName">
+                <el-form-item :label="$t('tableMange.menuName')" prop="menuName">
                   <el-input v-model="formData.menuName"></el-input>
                 </el-form-item>
-                <el-form-item label="菜单路由" prop="routePath" v-if="formData.dtType === '0'">
+                <el-form-item :label="$t('tableMange.menuRoute')" prop="routePath" v-if="formData.dtType === '0'">
                   <treeselect :append-to-body="true" v-model="formData.routePath" :options="menus"
                     :normalizer="normalizer" @change="treeSelectChange" @focus="treeSelectFocus" :show-count="true"
-                    placeholder="请选择父级路由" />
+                    :placeholder="$t('tableMange.selectParentRoute')" />
                 </el-form-item>
-                <el-form-item label="是否显示列表" v-if="false">
+                <el-form-item :label="$t('tableMange.showList')" v-if="false">
                   <el-switch v-model="formData.isShowList"></el-switch>
                 </el-form-item>
-                <el-form-item label="时间格式" prop="timeFormate">
-                  <el-select v-model="formData.timeFormate" placeholder="请选择时间格式">
+                <el-form-item :label="$t('tableMange.timeFormat')" prop="timeFormate">
+                  <el-select v-model="formData.timeFormate" :placeholder="$t('tableMange.timeFormat')">
                     <el-option v-for="val in dict.type.sys_time_format" :key="val.value" :label="val.label"
                       :value="val.value"></el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item label="表格主键" prop="primaryKey">
-                  <el-select v-model="formData.primaryKey" placeholder="请选择表格主键">
+                <el-form-item :label="$t('tableMange.tablePrimaryKey')" prop="primaryKey">
+                  <el-select v-model="formData.primaryKey" :placeholder="$t('tableMange.tablePrimaryKey')">
                     <el-option v-for="val in primaryKeyList" :key="val.fieldName" :label="val.fieldDescription"
                       :value="val.fieldName"></el-option>
                   </el-select>
@@ -167,57 +167,57 @@
                       :value="val.btnKey"></el-option>
                   </el-select>
                 </el-form-item> -->
-                <el-form-item label="排序依赖字段">
-                  <el-select v-model="formData.orderByColumn" placeholder="请选择排序依赖">
+                <el-form-item :label="$t('tableMange.sortDependency')">
+                  <el-select v-model="formData.orderByColumn" :placeholder="$t('tableMange.sortDependency')">
                     <el-option v-for="val in orderByFieldList" :key="val.fieldName" :label="val.fieldDescription"
                       :value="val.tableName + '.' + val.fieldName"></el-option>
                   </el-select>
                 </el-form-item>
-                <el-form-item label="排序方式" v-show="formData.orderByColumn">
-                  <el-radio v-model="formData.isAsc" :label="false">升序
+                <el-form-item :label="$t('tableMange.sortMethod')" v-show="formData.orderByColumn">
+                  <el-radio v-model="formData.isAsc" :label="false">{{ $t('tableMange.ascending') }}
                   </el-radio>
-                  <el-radio v-model="formData.isAsc" :label="true">降序
+                  <el-radio v-model="formData.isAsc" :label="true">{{ $t('tableMange.descending') }}
                   </el-radio>
                 </el-form-item>
                 <el-form-item>
-                  <el-button size="mini" @click="previewHandle">预览</el-button>
+                  <el-button size="mini" @click="previewHandle">{{ $t('tableMange.preview') }}</el-button>
                   <el-button size="mini" type="primary" @click="createHandle">{{
-      tId ? "确认修改" : "确认创建"
+      tId ? $t('tableMange.confirmModify') : $t('tableMange.confirmCreate')
     }}
                   </el-button>
                 </el-form-item>
               </el-form>
             </el-card>
           </el-tab-pane>
-          <el-tab-pane label="数据统计" name="datacount">
+          <el-tab-pane :label="$t('tableMange.dataStatistics')" name="datacount">
             <el-button type="primary" class="inline-large-button" icon="el-icon-plus" size="mini"
               @click="addDataDialog">
-              添加数据字段
+              {{ $t('tableMange.addDataField') }}
             </el-button>
             <el-table :data="dragTableStatisticList" border class="mb10" style="width: 100%">
               style="width: 100%">
-              <el-table-column type="index" label="序号" width="50" class-name="allowDrag">
+              <el-table-column type="index" :label="$t('tableMange.serialNumber')" width="50" class-name="allowDrag">
               </el-table-column>
-              <el-table-column prop="statisticTitle" label="统计标题">
+              <el-table-column prop="statisticTitle" :label="$t('tableMange.statisticTitle')">
               </el-table-column>
-              <el-table-column prop="statisticField" label="统计数据">
+              <el-table-column prop="statisticField" :label="$t('tableMange.statisticData')">
               </el-table-column>
-              <el-table-column prop="statisticType" label="统计类型">
+              <el-table-column prop="statisticType" :label="$t('tableMange.statisticType')">
               </el-table-column>
 
-              <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+              <el-table-column :label="$t('tableMange.operation')" align="center" class-name="small-padding fixed-width">
                 <template slot-scope="scope">
                   <el-dropdown>
                     <el-button type="warning" plain size="small">
-                      处理<i class="el-icon-arrow-down el-icon--right"></i>
+                      {{ $t('tableMange.handle') }}<i class="el-icon-arrow-down el-icon--right"></i>
                     </el-button>
                     <el-dropdown-menu slot="dropdown">
                       <el-dropdown-item>
-                        <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdateStat(scope.row)">修改
+                        <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdateStat(scope.row)">{{ $t('tableMange.modify') }}
                         </el-button>
                       </el-dropdown-item>
                       <el-dropdown-item>
-                        <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteStat(scope.row)">删除
+                        <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteStat(scope.row)">{{ $t('tableMange.delete') }}
                         </el-button>
                       </el-dropdown-item>
                     </el-dropdown-menu>
@@ -226,15 +226,15 @@
               </el-table-column>
             </el-table>
           </el-tab-pane>
-          <el-tab-pane label="样式编辑" name="styleEdit">
+          <el-tab-pane :label="$t('tableMange.styleEdit')" name="styleEdit">
             <StyleFormPanel ref="styleTableRef" :tableFieldList="tableFieldList"
               :dragTableStyleList="dragTableStyleList" />
           </el-tab-pane>
-          <el-tab-pane label="数据筛选" name="dataFilter">
+          <el-tab-pane :label="$t('tableMange.dataFilter')" name="dataFilter">
             <DataFilterPanel ref="dataFilterRef" :tableFieldList="tableFieldList" :filterDataEcho="filterDataEcho">
             </DataFilterPanel>
           </el-tab-pane>
-          <el-tab-pane label="联合查询" name="classificationQuery">
+          <el-tab-pane :label="$t('tableMange.classificationQuery')" name="classificationQuery">
             <ClassificationQueryPanel ref="classificationQueryRef" :tableFieldList="tableFieldList"
               :classificationDataEcho="classificationDataEcho"></ClassificationQueryPanel>
           </el-tab-pane>
@@ -242,7 +242,7 @@
       </el-col>
     </el-row>
 
-    <el-dialog title="效果预览" :visible.sync="isShowPreview" width="50%">
+    <el-dialog :title="$t('tableMange.effectPreview')" :visible.sync="isShowPreview" width="50%">
       <div class="cardBox">
         <el-card shadow="hover" :body-style="{ padding: '20px' }" class="card"
           v-for="(item, index) in deepragTableStatisticList" :key="index">
@@ -256,43 +256,43 @@
             </div>
           </el-tooltip>
           <div class="type">
-            <div class="count">统计结果</div>
+            <div class="count">{{ $t('tableMange.statisticData') }}</div>
           </div>
         </el-card>
       </div>
 
       <el-row :gutter="10" class="mb8">
         <el-col :span="18">
-          <el-input placeholder="请输入" clearable />
+          <el-input :placeholder="$t('tableMange.search')" clearable />
         </el-col>
 
         <el-col :span="6" class="previewbtn">
-          <el-button type="primary" icon="el-icon-search" size="small" @click="() => { }">搜索
+          <el-button type="primary" icon="el-icon-search" size="small" @click="() => { }">{{ $t('tableMange.search') }}
           </el-button>
-          <el-button icon="el-icon-refresh" size="small" @click="() => { }">重置
+          <el-button icon="el-icon-refresh" size="small" @click="() => { }">{{ $t('tableMange.reset') }}
           </el-button>
         </el-col>
       </el-row>
 
       <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
-          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="() => { }">新增
+          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="() => { }">{{ $t('tableMange.add') }}
           </el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="false" @click="() => { }">修改
+          <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="false" @click="() => { }">{{ $t('tableMange.edit') }}
           </el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="false" @click="() => { }">删除
+          <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="false" @click="() => { }">{{ $t('tableMange.delete') }}
           </el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button plain icon="el-icon-upload2" size="mini" @click="() => { }">导入
+          <el-button plain icon="el-icon-upload2" size="mini" @click="() => { }">{{ $t('tableMange.import') }}
           </el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="warning" plain icon="el-icon-download" size="mini" @click="() => { }">导出
+          <el-button type="warning" plain icon="el-icon-download" size="mini" @click="() => { }">{{ $t('tableMange.export') }}
           </el-button>
         </el-col>
       </el-row>
@@ -300,19 +300,19 @@
         <el-table-column type="selection" width="55" align="center"></el-table-column>
         <el-table-column v-for="item in columns" :key="item.key + item.value" :label="item.value" align="center"
           :prop="toUpperCase(item.key)" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <el-table-column :label="$t('tableMange.operation')" align="center" class-name="small-padding fixed-width">
           <template>
             <el-dropdown>
               <el-button type="warning" plain size="small">
-                处理<i class="el-icon-arrow-down el-icon--right"></i>
+                {{ $t('tableMange.handle') }}<i class="el-icon-arrow-down el-icon--right"></i>
               </el-button>
               <el-dropdown-menu slot="dropdown">
                 <el-dropdown-item>
-                  <el-button size="mini" type="text" icon="el-icon-edit" @click="() => { }">修改
+                  <el-button size="mini" type="text" icon="el-icon-edit" @click="() => { }">{{ $t('tableMange.modify') }}
                   </el-button>
                 </el-dropdown-item>
                 <el-dropdown-item>
-                  <el-button size="mini" type="text" icon="el-icon-delete" @click="() => { }">删除
+                  <el-button size="mini" type="text" icon="el-icon-delete" @click="() => { }">{{ $t('tableMange.delete') }}
                   </el-button>
                 </el-dropdown-item>
               </el-dropdown-menu>
@@ -324,9 +324,9 @@
         @pagination="pageList" />
       <template #footer>
         <span>
-          <el-button @click="isShowPreview = false">关闭</el-button>
+          <el-button @click="isShowPreview = false">{{ $t('tableMange.close') }}</el-button>
           <el-button type="primary" @click="createHandle">{{
-      tId ? "确认修改" : "确认创建"
+      tId ? $t('tableMange.confirmModify') : $t('tableMange.confirmCreate')
     }}</el-button>
         </span>
       </template>
@@ -335,12 +335,12 @@
     <!-- 添加数据统计对话框 -->
     <el-dialog :title="staictitle" :visible.sync="isShowAddData" width="30%">
       <el-form label-width="100px" :model="dataCountFormData">
-        <el-form-item label="统计标题" prop="statisticTitle">
+        <el-form-item :label="$t('tableMange.statisticTitle')" prop="statisticTitle">
           <el-input v-model="dataCountFormData.statisticTitle"></el-input>
         </el-form-item>
 
-        <el-form-item label="统计数据">
-          <el-select v-model="dataCountFormData.statisticField" placeholder="请选择统计字段">
+        <el-form-item :label="$t('tableMange.statisticData')">
+          <el-select v-model="dataCountFormData.statisticField" :placeholder="$t('tableMange.selectStatisticField')">
             <el-option v-for="item in dataArr" :key="item.id" :label="item.fieldName"
               :value="item.tableName + '.' + item.fieldName">
               <span class="discribe" style="float: left; margin-right: 5px">{{ isShowTableName }}
@@ -351,18 +351,18 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="统计类型">
-          <el-select v-model="dataCountFormData.statisticType" placeholder="请选择统计类型">
+        <el-form-item :label="$t('tableMange.statisticType')">
+          <el-select v-model="dataCountFormData.statisticType" :placeholder="$t('tableMange.selectStatisticType')">
             <el-option v-for="item in dataType" :key="item.dictCode" :label="item.dictLabel"
               :value="item.dictValue"></el-option>
           </el-select>
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="closeAddDialog">取 消</el-button>
-        <el-button v-if="staictitle == '修改统计数据字段'" type="primary" @click="upadtaData">确 定</el-button>
+        <el-button @click="closeAddDialog">{{ $t('tableMange.cancel') }}</el-button>
+        <el-button v-if="staictitle == $t('tableMange.modify')" type="primary" @click="upadtaData">{{ $t('tableMange.confirm') }}</el-button>
 
-        <el-button v-else type="primary" @click="addData">确 定</el-button>
+        <el-button v-else type="primary" @click="addData">{{ $t('tableMange.confirm') }}</el-button>
       </span>
     </el-dialog>
   </div>
@@ -465,40 +465,40 @@ export default {
       headerList: [
         {
           prop: "fieldName",
-          label: "数据字段",
+          label: this.$t('tableMange.dataField')
         },
         {
           prop: "fieldDescription",
-          label: "字段描述",
+          label: this.$t('tableMange.fieldDescription')
         },
         {
           prop: "relationTable",
-          label: "关联表",
+          label: this.$t('tableMange.relatedTable')
         },
         {
           prop: "relationFieldName",
-          label: "关联字段",
+          label: this.$t('tableMange.relatedField')
         },
         {
           prop: "relationType",
-          label: "关联方式",
+          label: this.$t('tableMange.relatedType')
         },
         {
           prop: "isShow",
-          label: "是否显示",
+          label: this.$t('tableMange.isShow')
         },
         {
           prop: "isSearch",
-          label: "是否包含查询",
+          label: this.$t('tableMange.isSearch')
         },
         {
           prop: "isExport",
-          label: "是否导出",
+          label: this.$t('tableMange.isExport')
         },
         {
           prop: "isCount",
-          label: "是否统计",
-        },
+          label: this.$t('tableMange.statisticData')
+        }
       ], //表头列表
 
       // 右侧筛选条件勾选数据
@@ -519,23 +519,23 @@ export default {
       },
       rules: {
         dtType: [
-          { required: true, message: "请选择菜单类型", trigger: "change" },
+          { required: true, message: this.$t('tableMange.selectMenuType'), trigger: "change" }
         ],
         menuName: [
-          { required: true, message: "请输入菜单名称", trigger: "blur" },
+          { required: true, message: this.$t('tableMange.pleaseEnterMenuName'), trigger: "blur" }
         ],
         routePath: [
-          { required: true, message: "请选择路由", trigger: "change" },
+          { required: true, message: this.$t('tableMange.selectParentRoute'), trigger: "change" }
         ],
         timeFormate: [
-          { required: true, message: "请选择时间格式", trigger: "change" },
+          { required: true, message: this.$t('tableMange.selectTimeFormat'), trigger: "change" }
         ],
         primaryKey: [
-          { required: true, message: "请选择表格主键", trigger: "blur" },
+          { required: true, message: this.$t('tableMange.selectTablePrimaryKey'), trigger: "blur" }
         ],
         fieldDescription: [
-          { required: true, message: "请输入字段描述", trigger: "blur" },
-        ],
+          { required: true, message: this.$t('tableMange.fieldDescriptionErrorNotNull'), trigger: "blur" }
+        ]
       },
       menus: [], //路由列表数据
 
@@ -1576,7 +1576,7 @@ export default {
             }
             this.isShowPreview = false;
           }
-          // } 
+          // }
           // else {
           //   this.$message.warning(result.msg);
           //   return;
@@ -1587,6 +1587,7 @@ export default {
         }
       });
     },
+
     getBtnMapList(tableKey) {
       let res = this.formData.btnGroupList.map((item) => {
         return {

+ 156 - 156
zkqy-ui/src/views/tool/datasheet/index.vue

@@ -5,64 +5,64 @@
         <!-- <el-form-item label="数据库名称" prop="dataBaseName">
             <el-input v-model="form.dataBaseName" style="width: 600px;"></el-input>
         </el-form-item> -->
-        <el-form-item label="数据表名称" prop="tableName">
+        <el-form-item :label="$t('dataModeling.dataTableName')" prop="tableName">
           <el-input
-            v-model="form.tableName"
-            :disabled="isEdited"
-            style="width: 600px"
+              v-model="form.tableName"
+              :disabled="isEdited"
+              style="width: 600px"
           ></el-input>
         </el-form-item>
-        <el-form-item label="表描述">
+        <el-form-item :label="$t('dataModeling.tableName')">
           <el-input v-model="form.tableComment" style="width: 600px"></el-input>
         </el-form-item>
       </el-form>
     </el-card>
     <el-card>
       <div class="titleitem">
-        <span>数据表字段</span>
+        <span>{{ $t('dataModeling.dataTableField') }}</span>
       </div>
       <el-form ref="tableform" :rules="tableform" :model="experienceDataForm">
         <el-table
-          ref="dragTable"
-          :data="experienceData"
-          stripe
-          row-key="tag"
-          style="width: 100%"
+            ref="dragTable"
+            :data="experienceData"
+            stripe
+            row-key="tag"
+            style="width: 100%"
         >
           <el-table-column
-            type="index"
-            label="序号"
-            width="50"
-            class-name="allowDrag"
+              type="index"
+              :label="$t('dataModeling.No')"
+              width="50"
+              class-name="allowDrag"
           />
-          <el-table-column prop="fieldName" label="字段名称" width="200">
+          <el-table-column prop="fieldName" :label="$t('dataModeling.fieldName')" width="200">
             <template slot-scope="scope">
               <el-form-item
-                :prop="'fieldName' + scope.$index"
-                :name="'fieldName' + scope.$index"
-                style="margin: 0px; padding: 0px"
+                  :prop="'fieldName' + scope.$index"
+                  :name="'fieldName' + scope.$index"
+                  style="margin: 0px; padding: 0px"
               >
                 <el-input
-                  v-model="scope.row.fieldName"
-                  :disabled="scope.$index == 0"
-                  @blur="fieldNameChange(scope.row)"
+                    v-model="scope.row.fieldName"
+                    :disabled="scope.$index == 0"
+                    @blur="fieldNameChange(scope.row)"
                 ></el-input>
               </el-form-item>
             </template>
           </el-table-column>
-          <el-table-column prop="fieldType" label="字段类型" width="200">
+          <el-table-column prop="fieldType" :label="$t('dataModeling.fieldType')" width="200">
             <template slot-scope="scope">
               <el-form-item
-                :prop="'fieldType' + scope.$index"
-                :name="'fieldType' + scope.$index"
-                style="margin: 0px; padding: 0px"
+                  :prop="'fieldType' + scope.$index"
+                  :name="'fieldType' + scope.$index"
+                  style="margin: 0px; padding: 0px"
               >
                 <el-select
-                  :disabled="scope.$index == 0"
-                  v-model="scope.row.fieldType"
-                  filterable
-                  @blur="selectBlur(scope)"
-                  @change="
+                    :disabled="scope.$index == 0"
+                    v-model="scope.row.fieldType"
+                    filterable
+                    @blur="selectBlur(scope)"
+                    @change="
                     handleSelected(
                       dataType.find(
                         (item) => item.label === scope.row.fieldType
@@ -79,30 +79,30 @@
                   <el-option v-for="item in dict.type.mysql_data_type"  :label="item.dictLabel" :value="item.dictValue">
                   </el-option> -->
                   <el-option
-                    v-for="item in dataType"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
+                      v-for="item in dataType"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value"
                   />
                 </el-select>
               </el-form-item>
             </template>
           </el-table-column>
 
-          <el-table-column prop="fieldLength" label="长度" width="200">
+          <el-table-column prop="fieldLength" :label="$t('dataModeling.length')" width="200">
             <template slot-scope="scope">
               <el-form-item
-                :prop="'fieldLength' + scope.$index"
-                :name="'fieldLength' + scope.$index"
-                style="margin: 0px; padding: 0px"
+                  :prop="'fieldLength' + scope.$index"
+                  :name="'fieldLength' + scope.$index"
+                  style="margin: 0px; padding: 0px"
               >
                 <!--                <el-input v-model="scope.row.fieldLength"-->
                 <!--                          :disabled="handleSelected(dict.type.mysql_data_type.find(item => item.label === scope.row.fieldType), scope)"></el-input>-->
                 <el-input
-                  v-model="scope.row.fieldLength"
-                  @blur="fieldLengthChange(scope.$index, scope.row)"
-                  :disabled="changduclick(scope.$index) || scope.$index == 0"
-                  @input="
+                    v-model="scope.row.fieldLength"
+                    @blur="fieldLengthChange(scope.$index, scope.row)"
+                    :disabled="changduclick(scope.$index) || scope.$index == 0"
+                    @input="
                     scope.row.fieldLength = scope.row.fieldLength.replace(
                       /^(0+)|[^\d]+/g,
                       ''
@@ -113,57 +113,57 @@
             </template>
           </el-table-column>
 
-          <el-table-column prop="isNull" label="不是null" width="100">
+          <el-table-column prop="isNull" :label="$t('dataModeling.notNull')" width="100">
             <template slot-scope="scope">
               <el-checkbox
-                :disabled="scope.$index == 0"
-                @change="isNullChange(scope.row)"
-                v-model="scope.row.isNull"
+                  :disabled="scope.$index == 0"
+                  @change="isNullChange(scope.row)"
+                  v-model="scope.row.isNull"
               ></el-checkbox>
             </template>
           </el-table-column>
 
-          <el-table-column prop="isPrimary" label="主键" width="100">
+          <el-table-column prop="isPrimary" :label="$t('dataModeling.primaryKey')" width="100">
             <template slot-scope="scope">
               <el-checkbox
-                :disabled="scope.$index == 0"
-                v-model="scope.row.isPrimary"
-                @change="hanleCheckbox(scope.$index, scope.row)"
+                  :disabled="scope.$index == 0"
+                  v-model="scope.row.isPrimary"
+                  @change="hanleCheckbox(scope.$index, scope.row)"
               ></el-checkbox>
             </template>
           </el-table-column>
 
-          <el-table-column prop="isAuto" label="自增" width="100">
+          <el-table-column prop="isAuto" :label="$t('dataModeling.SelfIncrement')" width="100">
             <template slot-scope="scope">
               <el-checkbox
-                :disabled="scope.$index == 0"
-                @change="isAutoChange(scope.row)"
-                v-model="scope.row.isAuto"
+                  :disabled="scope.$index == 0"
+                  @change="isAutoChange(scope.row)"
+                  v-model="scope.row.isAuto"
               ></el-checkbox>
             </template>
           </el-table-column>
 
-          <el-table-column prop="fieldDescription" label="字段描述" width="200">
+          <el-table-column prop="fieldDescription" :label="$t('dataModeling.fieldDescription')" width="200">
             <template slot-scope="scope">
               <el-input
-                :disabled="scope.$index == 0"
-                @change="fieldDescriptionChange(scope.row)"
-                v-model="scope.row.fieldDescription"
+                  :disabled="scope.$index == 0"
+                  @change="fieldDescriptionChange(scope.row)"
+                  v-model="scope.row.fieldDescription"
               ></el-input>
             </template>
           </el-table-column>
-          <el-table-column prop="operate" label="操作">
+          <el-table-column prop="operate" :label="$t('operation')">
             <template slot-scope="scope">
               <!-- <el-button size="mini" type="success" icon="el-icon-save"
                   @click="handlesaveExperience(scope.$index, scope.row)">保存
               </el-button> -->
               <el-button
-                size="mini"
-                type="danger"
-                icon="el-icon-delete"
-                :disabled="scope.$index == 0"
-                @click="handleDeleteExperience(scope.$index, scope.row)"
-                >删除
+                  size="mini"
+                  type="danger"
+                  icon="el-icon-delete"
+                  :disabled="scope.$index == 0"
+                  @click="handleDeleteExperience(scope.$index, scope.row)"
+              >{{$t('delete')}}
               </el-button>
             </template>
           </el-table-column>
@@ -171,18 +171,18 @@
       </el-form>
       <div>
         <el-button
-          type="primary"
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAddExperienceline"
-          >新增字段
+            type="primary"
+            icon="el-icon-plus"
+            size="mini"
+            @click="handleAddExperienceline"
+        >{{$t('dataModeling.addField')}}
         </el-button>
       </div>
     </el-card>
 
     <div style="margin-top: 15px">
-      <el-button v-if="!isEdited" @click="add" type="primary">添加</el-button>
-      <el-button v-else @click="edit" type="primary">修改</el-button>
+      <el-button v-if="!isEdited" @click="add" type="primary">{{$t('dataModeling.add')}}</el-button>
+      <el-button v-else @click="edit" type="primary">{{$t('update')}}</el-button>
     </div>
   </div>
 </template>
@@ -220,7 +220,7 @@ export default {
           fieldLength: undefined,
           isNull: true,
           isPrimary: true,
-          fieldDescription: "主键",
+          fieldDescription: this.$t('dataModeling.primaryKey'),
           isAuto: true,
         },
       ],
@@ -282,19 +282,19 @@ export default {
         let rulesAdd = {};
         this.experienceData.forEach((item, index) => {
           this.$set(
-            this.experienceDataForm,
-            "fieldName" + index,
-            item.fieldName
+              this.experienceDataForm,
+              "fieldName" + index,
+              item.fieldName
           );
           this.$set(
-            this.experienceDataForm,
-            "fieldType" + index,
-            item.fieldType
+              this.experienceDataForm,
+              "fieldType" + index,
+              item.fieldType
           );
           this.$set(
-            this.experienceDataForm,
-            "fieldLength" + index,
-            item.fieldLength
+              this.experienceDataForm,
+              "fieldLength" + index,
+              item.fieldLength
           );
           // rulesAdd['' + index] = item.fieldName
           // rulesAdd['fieldType' + index] = item.fieldType
@@ -318,12 +318,12 @@ export default {
           }
           //更改
           this.modifySQLString.modify[row.oldVal.fieldName].fieldName =
-            this.mysqlMotifySQLString("fieldName", row);
+              this.mysqlMotifySQLString("fieldName", row);
           this.sqlStringList.push(this.mysqlMotifySQLString("fieldName", row));
         } else if (row.fieldType) {
           //新增
           this.modifySQLString.addNew[row.fieldName] =
-            this.mysqlMotifySQLString("addNew", row);
+              this.mysqlMotifySQLString("addNew", row);
           this.sqlStringList.push(this.mysqlMotifySQLString("addNew", row));
         }
       }
@@ -337,12 +337,12 @@ export default {
         }
         if (row.oldVal) {
           this.modifySQLString.modify[row.fieldName].fieldType =
-            this.mysqlMotifySQLString("fieldType", row);
+              this.mysqlMotifySQLString("fieldType", row);
           this.sqlStringList.push(this.mysqlMotifySQLString("fieldType", row));
         } else if (row.fieldName) {
           //新增
           this.modifySQLString.addNew[row.fieldName] =
-            this.mysqlMotifySQLString("addNew", row);
+              this.mysqlMotifySQLString("addNew", row);
           this.sqlStringList.push(this.mysqlMotifySQLString("addNew", row));
         }
       }
@@ -356,9 +356,9 @@ export default {
         }
         if (row.oldVal) {
           this.modifySQLString.modify[row.fieldName].fieldLength =
-            this.mysqlMotifySQLString("fieldLength", row);
+              this.mysqlMotifySQLString("fieldLength", row);
           this.sqlStringList.push(
-            this.mysqlMotifySQLString("fieldLength", row)
+              this.mysqlMotifySQLString("fieldLength", row)
           );
         }
       }
@@ -374,12 +374,12 @@ export default {
             this.modifySQLString.modify[row.fieldName] = {};
           }
           this.modifySQLString.modify[row.fieldName].isNull = row.isNull
-            ? this.mysqlMotifySQLString("NOT NULL", row)
-            : this.mysqlMotifySQLString("NULL", row);
-          this.sqlStringList.push(
-            row.isNull
               ? this.mysqlMotifySQLString("NOT NULL", row)
-              : this.mysqlMotifySQLString("NULL", row)
+              : this.mysqlMotifySQLString("NULL", row);
+          this.sqlStringList.push(
+              row.isNull
+                  ? this.mysqlMotifySQLString("NOT NULL", row)
+                  : this.mysqlMotifySQLString("NULL", row)
           );
         }
       }
@@ -392,7 +392,7 @@ export default {
       if (row.isPrimary && (!row.oldVal || !row.oldVal.isPrimary)) {
         //添加新的主键
         this.modifySQLString.modify[row.fieldName].addPrimary =
-          this.mysqlMotifySQLString("primary", row);
+            this.mysqlMotifySQLString("primary", row);
         this.sqlStringList.push(this.mysqlMotifySQLString("primary", row));
       }
       this.experienceData.forEach((item, index) => {
@@ -403,9 +403,9 @@ export default {
             }
             //去掉原来的主键
             this.modifySQLString.delete[item.fieldName].dropPrimary =
-              this.mysqlMotifySQLString("drop primary", item);
+                this.mysqlMotifySQLString("drop primary", item);
             this.sqlStringList.push(
-              this.mysqlMotifySQLString("drop primary", item)
+                this.mysqlMotifySQLString("drop primary", item)
             );
           }
           item.isPrimary = false;
@@ -425,19 +425,19 @@ export default {
       if (row.oldVal) {
         if (row.oldVal.isAuto != row.isAuto) {
           this.modifySQLString.modify[row.fieldName].increment = row.isAuto
-            ? this.mysqlMotifySQLString("increment", row)
-            : this.mysqlMotifySQLString("no increment", row);
+              ? this.mysqlMotifySQLString("increment", row)
+              : this.mysqlMotifySQLString("no increment", row);
           sqlString = row.isAuto
-            ? this.mysqlMotifySQLString("increment", row)
-            : this.mysqlMotifySQLString("no increment", row);
+              ? this.mysqlMotifySQLString("increment", row)
+              : this.mysqlMotifySQLString("no increment", row);
         }
       } else {
         this.modifySQLString.modify[row.fieldName].increment = row.isAuto
-          ? this.mysqlMotifySQLString("increment", row)
-          : this.mysqlMotifySQLString("no increment", row);
+            ? this.mysqlMotifySQLString("increment", row)
+            : this.mysqlMotifySQLString("no increment", row);
         sqlString = row.isAuto
-          ? this.mysqlMotifySQLString("increment", row)
-          : this.mysqlMotifySQLString("no increment", row);
+            ? this.mysqlMotifySQLString("increment", row)
+            : this.mysqlMotifySQLString("no increment", row);
       }
       if (sqlString) {
         this.sqlStringList.push(sqlString);
@@ -452,12 +452,12 @@ export default {
       if (row.oldVal) {
         if (row.oldVal.fieldDescription != row.fieldDescription) {
           this.modifySQLString.modify[row.fieldName].fieldDescription =
-            this.mysqlMotifySQLString("describe", row);
+              this.mysqlMotifySQLString("describe", row);
           sqlString = this.mysqlMotifySQLString("describe", row);
         }
       } else {
         this.modifySQLString.modify[row.fieldName].fieldDescription =
-          this.mysqlMotifySQLString("describe", row);
+            this.mysqlMotifySQLString("describe", row);
         sqlString = this.mysqlMotifySQLString("describe", row);
       }
       if (sqlString) {
@@ -470,8 +470,8 @@ export default {
       let sqlString = "";
       if (row.oldVal) {
         this.modifySQLString.delete[row.fieldName] = this.mysqlMotifySQLString(
-          "deleteField",
-          row
+            "deleteField",
+            row
         );
         sqlString = this.mysqlMotifySQLString("deleteField", row);
       }
@@ -486,7 +486,7 @@ export default {
     // 拼接mysql的修改语句
     mysqlMotifySQLString(type, row) {
       let table_name = this.form.tableName,
-        res = "ALTER TABLE";
+          res = "ALTER TABLE";
 
       switch (type) {
         case "fieldName": //改字段
@@ -518,7 +518,7 @@ export default {
           break;
         case "describe": //修改字段描述
           res += ` ${table_name} MODIFY ${row.fieldName} ${row.fieldType}${
-            row.fieldLength ? "" : "(" + row.fieldLength + ")"
+              row.fieldLength ? "" : "(" + row.fieldLength + ")"
           } comment '${row.fieldDescription}';`;
           break;
         case "deleteField":
@@ -630,17 +630,17 @@ export default {
         scope.row.fieldLength = "";
         this.tableform["fieldLength" + scope.$index].required = false; // 禁用长度输入框的校验
         return this.$set(
-          this.experienceDataForm,
-          "fieldType" + scope.$index,
-          scope.row.fieldType
+            this.experienceDataForm,
+            "fieldType" + scope.$index,
+            scope.row.fieldType
         );
       }
       this.Inoputdisabled[scope.$index] = false; // 解除禁用
       this.tableform["fieldLength" + scope.$index].required = true; // 启用长度输入框的校验
       return this.$set(
-        this.experienceDataForm,
-        "fieldType" + scope.$index,
-        scope.row.fieldType
+          this.experienceDataForm,
+          "fieldType" + scope.$index,
+          scope.row.fieldType
       );
     },
 
@@ -677,8 +677,8 @@ export default {
       } else {
         //字段名去重校验
         if (
-          this.experienceData.filter((item) => item.fieldName == value)
-            .length == 1
+            this.experienceData.filter((item) => item.fieldName == value)
+                .length == 1
         ) {
           callback();
         } else {
@@ -831,27 +831,27 @@ export default {
           field: this.experienceData,
         };
         createDatabase(query)
-          .then((res) => {
-            this.$modal.msgSuccess(res.msg);
-            if (res.code === 200) {
-              this.visible = false;
-              this.$emit("ok");
-              Object.keys(this.form).forEach((key) => (this.form[key] = ""));
-              this.experienceData = [];
-              this.$tab.closePage().then(() => {
-                this.$router.push({
-                  path: "/data/datamodeling",
+            .then((res) => {
+              this.$modal.msgSuccess(res.msg);
+              if (res.code === 200) {
+                this.visible = false;
+                this.$emit("ok");
+                Object.keys(this.form).forEach((key) => (this.form[key] = ""));
+                this.experienceData = [];
+                this.$tab.closePage().then(() => {
+                  this.$router.push({
+                    path: "/data/datamodeling",
+                  });
                 });
-              });
-              // 新增成功之后关闭当前页面
-              // this.$router.replace({
-              //   path: "/data/datamodeling",
-              // });
-            }
-          })
-          .catch((err) => {
-            console.log(err);
-          });
+                // 新增成功之后关闭当前页面
+                // this.$router.replace({
+                //   path: "/data/datamodeling",
+                // });
+              }
+            })
+            .catch((err) => {
+              console.log(err);
+            });
       });
     },
     edit() {
@@ -897,23 +897,23 @@ export default {
           field: this.experienceData,
         };
         editTable(query)
-          .then((res) => {
-            this.$modal.msgSuccess(res.msg);
-            if (res.code === 200) {
-              this.visible = false;
-              this.$emit("ok");
-              Object.keys(this.form).forEach((key) => (this.form[key] = ""));
-              this.experienceData = [];
-              this.$tab.closePage().then(() => {
-                this.$router.push({
-                  path: "/data/datamodeling",
+            .then((res) => {
+              this.$modal.msgSuccess(res.msg);
+              if (res.code === 200) {
+                this.visible = false;
+                this.$emit("ok");
+                Object.keys(this.form).forEach((key) => (this.form[key] = ""));
+                this.experienceData = [];
+                this.$tab.closePage().then(() => {
+                  this.$router.push({
+                    path: "/data/datamodeling",
+                  });
                 });
-              });
-            }
-          })
-          .catch((err) => {
-            console.log(err);
-          });
+              }
+            })
+            .catch((err) => {
+              console.log(err);
+            });
         // 关闭当前页面
         this.$tab.closePage();
       });
@@ -921,7 +921,7 @@ export default {
     //处理表格行拖拽
     initDragTable() {
       const el = this.$refs.dragTable.$el.querySelectorAll(
-        ".el-table__body-wrapper > table > tbody"
+          ".el-table__body-wrapper > table > tbody"
       )[0];
       const sortable = Sortable.create(el, {
         handle: ".allowDrag",

+ 1 - 1
zkqy-ui/src/views/treeTable/del.vue

@@ -408,4 +408,4 @@ export default {
 .vue-treeselect {
   z-index: 9999 !important;
 }
-</style>
+</style>

+ 23 - 23
zkqy-ui/src/views/treeTable/index.vue

@@ -7,28 +7,28 @@
     <!-- 中间渲染 -->
     <el-table v-loading="loading" :data="tableList" ref="tableRef" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="树形表主键" align="center" prop="treeTablePrimaryKey" />
-      <el-table-column label="树形表名" align="center" prop="treeTableName" />
-      <el-table-column label="树形表格别名" align="center" prop="treeDesc" />
-      <el-table-column label="树形递归列" align="center" prop="treeTableDgl" />
-      <el-table-column label="树形条件" align="center" prop="treeTableCondition" />
-      <el-table-column label="绑定表名称" align="center" prop="tableNameDes" />
-      <el-table-column label="绑定表id" align="center" prop="tableId" />
+      <el-table-column :label="$t('treeTable.treeTableKey')" align="center" prop="treeTablePrimaryKey" />
+      <el-table-column :label="$t('treeTable.treeTableName')" align="center" prop="treeTableName" />
+      <el-table-column :label="$t('treeTable.treeTableDesc')" align="center" prop="treeDesc" />
+      <el-table-column :label="$t('treeTable.treeTableDgl')" align="center" prop="treeTableDgl" />
+      <el-table-column :label="$t('treeTable.treeTableCondition')" align="center" prop="treeTableCondition" />
+      <el-table-column :label="$t('treeTable.boundTableName')" align="center" prop="tableNameDes" />
+      <el-table-column :label="$t('treeTable.boundTableId')" align="center" prop="tableId" />
       <!-- <el-table-column label="表格描述" align="center" prop="dtNotes" />
       <el-table-column label="时间格式" align="center" prop="timeFormat" /> -->
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column :label="$t('treeTable.operation')" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('treeTable.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
-                <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改
+                <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">{{ $t('treeTable.modify') }}
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
-                <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除
+                <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">{{ $t('treeTable.delete') }}
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -64,17 +64,17 @@ export default {
       total: 0,
       //输入框配置
       formItems: [{
-        label: '树形表名',
+        label: this.$t('treeTable.treeTableName'),
         prop: 'treeTableName',
         attrs: {
-          placeholder: '请输入树形表名',
+          placeholder: this.$t('treeTable.enterTreeTableName'),
           clearable: true,
         },
       },{
-        label: '表格别名',
+        label: this.$t('treeTable.treeTableDesc'),
         prop: 'treeDesc',
         attrs: {
-          placeholder: '请输入树形表格别名',
+          placeholder: this.$t('treeTable.enterTreeTableDesc'),
           clearable: true,
         },
       }],
@@ -112,7 +112,7 @@ export default {
     buttons() {
       return [
         {
-          label: '新增',
+          label: this.$t('treeTable.add'),
           type: 'primary',
           plain: true,
           icon: 'el-icon-plus',
@@ -120,7 +120,7 @@ export default {
           click: this.handleAdd,
         },
         {
-          label: '修改',
+          label: this.$t('treeTable.modify'),
           type: 'success',
           plain: true,
           icon: 'el-icon-edit',
@@ -129,7 +129,7 @@ export default {
           click: this.handleUpdate,
         },
         {
-          label: '删除',
+          label: this.$t('treeTable.delete'),
           type: 'danger',
           plain: true,
           icon: 'el-icon-delete',
@@ -219,9 +219,9 @@ export default {
       console.log('删除按钮被点击', row.id, row);
       this.$modal
         .confirm(
-          '是否确认删除编号为"' +
+          this.$t('treeTable.confirmDelete') +
           row.id +
-          '"的数据项?删除后菜单中相关数据也将删除!'
+          '"的数据项?' + this.$t('treeTable.deleteMenuTip')
         )
         .then(async () => {
           let res = await delMenu(row.menuId);
@@ -243,7 +243,7 @@ export default {
     // 删除多条
     handleBatchDelete() {
       if (this.selection.length === 0) {
-        this.$message.warning('请先选择要删除的记录');
+        this.$message.warning(this.$t('treeTable.pleaseSelectDelete'));
         return;
       }
       let str = this.selection.map(item => item.id).join(',');
@@ -254,9 +254,9 @@ export default {
       console.log('menuIds', menuIds)
       this.$modal
         .confirm(
-          '是否确认删除编号为"' +
+          this.$t('treeTable.confirmDelete') +
           str +
-          '"的数据项?删除后菜单中相关数据也将删除!'
+          '"的数据项?' + this.$t('treeTable.deleteMenuTip')
         )
         .then(async () => {
           let res = await delMenu(menuIds);

+ 75 - 83
zkqy-ui/src/views/treeTableMange/index.vue

@@ -5,17 +5,16 @@
     <div class="tree_table_mange">
       <!-- 树形菜单配置 -->
       <div class="tree_table_mange_menu_title">
-        <span>树形菜单配置</span>
+        <span>{{ $t('treeTable.treeMenuConfig') }}</span>
         <el-card shadow="always">
           <DynamicForm ref="dynamicForm" :formItems="treeFormItems" :formButtons="mode != 4 ? treeFormButtons : []"
-            :Showbuttons="mode != 4" @cancelTree="cancelTree" @confirmTree="confirmTree"
->
+            :Showbuttons="mode != 4" @cancelTree="cancelTree" @confirmTree="confirmTree">
           </DynamicForm>
         </el-card>
       </div>
       <!-- 表格的配置 -->
       <div class="tree_table_mange_tabulation_title">
-        <span>表格字段配置</span>
+        <span>{{ $t('treeTable.tableFieldConfig') }}</span>
         <el-card shadow="always" v-loading="loading">
           <DynamicForm ref="treeTableFormItems" :formItems="treeTableFormItems" :Showbuttons="false"
             @query-params-change="handleQueryParamsTableChange">
@@ -69,151 +68,144 @@ export default {
       //查询单条的id参数
       editorId: null,
       editorTableId: null,
-      treeTableKey: "",
       // 树形表单配置
       treeFormItems: [
         {
-          label: '菜单名称',
+          label: this.$t('treeTable.menuName'),
           prop: 'menuName',
           attrs: {
-            placeholder: '请输入菜单名称',
+            placeholder: this.$t('treeTable.menuNamePlaceholder'),
             clearable: true,
           },
           rules: [
-            { required: true, message: '菜单名称不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.menuNameRequired'), trigger: 'blur' }
           ]
         },
         {
-          // groupName
-          label: '菜单描述',
+          label: this.$t('treeTable.groupDescription'),
           prop: 'groupDescription',
           attrs: {
-            placeholder: '请输入菜单描述',
+            placeholder: this.$t('treeTable.groupDescriptionPlaceholder'),
             clearable: true,
-          },
-          // rules: [
-          //   { required: true, message: '菜单描述不能为空', trigger: 'blur' }
-          // ]
+          }
         },
-        {//routePath
-          label: '菜单路由',
+        {
+          label: this.$t('treeTable.menuRoute'),
           prop: 'menuId',
           type: 'tree',
           menus: [],
-          treeDefaultValue: true,//针对插件中v-model绑定的值需要与options 中的id一致,若是空值,必须是null,不能赋值""
-          placeholder: '请选择菜单路由',
-          openDirection: 'bottom',//指定菜单始终打开到指定的方向
+          treeDefaultValue: true, //针对插件中v-model绑定的值需要与options 中的id一致,若是空值,必须是null,不能赋值""
+          placeholder: this.$t('treeTable.menuRoutePlaceholder'),
+          openDirection: 'bottom',
           rules: [
-            { required: true, message: '菜单路由不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.menuRouteRequired'), trigger: 'blur' }
           ],
           listeners: {
             change: this.handleMenuIdChange, // 监听 change 事件
           },
         },
         {
-          // treeHame
-          label: '树形名称',
+          label: this.$t('treeTable.treeName'),
           prop: 'treeDesc',
           // labelWidth: '110px',
           attrs: {
-            placeholder: '请输入表格名称',
+            placeholder: this.$t('treeTable.treeNamePlaceholder'),
             clearable: true,
           },
           rules: [
-            { required: true, message: '表格名称不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.treeNameRequired'), trigger: 'blur' }
           ]
         },
-        {//dtTableName
-          label: '树形表格',
+        {
+          label: this.$t('treeTable.treeTable'),
           prop: 'treeTableName',
           component: 'el-select',
           attrs: {
-            placeholder: '请选择关联表格',
+            placeholder: this.$t('treeTable.treeTablePlaceholder'),
             clearable: true,
           },
           options: [],
           selectSlot: true,
           rules: [
-            { required: true, message: '树形表格不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.treeTableRequired'), trigger: 'blur' }
           ],
           listeners: {
             change: this.handleTableChange, // 监听 change 事件
             focus: this.treeSelectFocus, // 监听 focus 事件
           },
         },
-        {//selectFields
-          label: '表格主键',
+        {
+          label: this.$t('treeTable.tablePrimaryKey'),
           prop: 'treeTablePrimaryKey',
           component: 'el-select',
-
           attrs: {
-            placeholder: '请选择表格主键',
+            placeholder: this.$t('treeTable.tablePrimaryKeyPlaceholder'),
             clearable: true,
           },
           options: [],
           selectSlot: true,
           rules: [
-            { required: true, message: '表格主键不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.tablePrimaryKeyRequired'), trigger: 'blur' }
           ]
         },
-        {//treeTableConditionColumn
-          label: '匹配模式',
+        {
+          label: this.$t('treeTable.matchMode'),
           prop: 'treeTableCondition',
           component: 'el-select',
           attrs: {
-            placeholder: '请选择匹配模式',
+            placeholder: this.$t('treeTable.matchModePlaceholder'),
             clearable: true,
           },
           options: [{
-            label: '根据value关联',
+            label: this.$t('treeTable.matchByValue'),
             value: 'value'
           },
           {
-            label: '根据label关联',
+            label: this.$t('treeTable.matchByLabel'),
             value: 'label'
           }],
           selectSlot: true,
           rules: [
-            { required: true, message: '匹配模式不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.matchModeRequired'), trigger: 'blur' }
           ]
         },
-        {//treeRecursiveValue
-          label: '递归列',
+        {
+          label: this.$t('treeTable.recursiveColumn'),
           prop: 'treeTableDgl',
           component: 'el-select',
           attrs: {
-            placeholder: '请选择表格递归列',
+            placeholder: this.$t('treeTable.recursiveColumnPlaceholder'),
             clearable: true,
           },
           options: [],
           selectSlot: true,
           rules: [
-            { required: true, message: '递归列不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.recursiveColumnRequired'), trigger: 'blur' }
           ]
         },
-        {//treeShowLabel
-          label: '展示列',
+        {
+          label: this.$t('treeTable.displayColumn'),
           prop: 'treeShowLabel',
           component: 'el-select',
           attrs: {
-            placeholder: '请选择表格展示列',
+            placeholder: this.$t('treeTable.displayColumnPlaceholder'),
             clearable: true,
           },
           options: [],
           selectSlot: true,
           rules: [
-            { required: true, message: '展示列不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.displayColumnRequired'), trigger: 'blur' }
           ]
         },
       ],
       // 树形表格总配置
       treeTableFormItems: [
-        {//tableId
-          label: '关联表格',
+        {
+          label: this.$t('treeTable.relatedTable'),
           prop: 'tableId',
           component: 'el-select',
           attrs: {
-            placeholder: '请选择关联表格',
+            placeholder: this.$t('treeTable.relatedTablePlaceholder'),
             clearable: true,
           },
           options: [],
@@ -223,34 +215,34 @@ export default {
             // focus: this.treeSelectFocus, // 监听 focus 事件
           },
           rules: [
-            { required: true, message: '关联表格不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.relatedTableRequired'), trigger: 'blur' }
           ],
         },
-        {//treeTableJoinTablecondition
-          label: '关联字段',
+        {
+          label: this.$t('treeTable.relatedField'),
           prop: 'treeTableJoinTableCondition',
           component: 'el-select',
           attrs: {
-            placeholder: '请选择表格关联字段',
+            placeholder: this.$t('treeTable.relatedFieldPlaceholder'),
             clearable: true,
           },
           options: [],
           selectSlot: true,
           rules: [
-            { required: true, message: '关联字段不能为空', trigger: 'blur' }
+            { required: true, message: this.$t('treeTable.relatedFieldRequired'), trigger: 'blur' }
           ]
         },
       ],
       //树形表单按钮配置
       treeFormButtons: [
         {
-          label: '清空',
+          label: this.$t('treeTable.clear'),
           event: 'cancel',
           eventName: 'cancelTree',
           size: 'medium'
         },
         {
-          label: '确认',
+          label: this.$t('treeTable.confirm'),
           event: 'confirm',
           eventName: 'confirmTree',
           type: 'primary',
@@ -260,35 +252,35 @@ export default {
       // 展示表格的columns
       tableColumns: [
         {
-          label: '表格主键',
+          label: this.$t('treeTable.tablePrimaryKey'),
           prop: 'tId',
         },
         {
-          label: '表格名称',
+          label: this.$t('treeTable.tableName'),
           prop: 'dtName',
         },
         {
-          label: '表格别名',
+          label: this.$t('treeTable.tableAlias'),
           prop: 'dtNickname',
         },
         {
-          label: 'table编号',
+          label: this.$t('treeTable.tableNumber'),
           prop: 'tableKey',
         },
         {
-          label: 'sql编号',
+          label: this.$t('treeTable.sqlNumber'),
           prop: 'sqlKey',
         },
         {
-          label: '绑定表名称',
+          label: this.$t('treeTable.boundTableName'),
           prop: 'dtTableName',
         },
         {
-          label: '表格描述',
+          label: this.$t('treeTable.tableDescription'),
           prop: 'dtNotes',
         },
         {
-          label: '时间格式',
+          label: this.$t('treeTable.timeFormat'),
           prop: 'timeFormat',
         },
       ],
@@ -302,15 +294,15 @@ export default {
       //  表格配置中的关联方式
       relaTypeList: [
         {
-          label: "等值连接",
+          label: this.$t('treeTable.equalJoin'),
           value: "INNER JOIN",
         },
         {
-          label: "左连接",
+          label: this.$t('treeTable.leftJoin'),
           value: "LEFT JOIN",
         },
         {
-          label: "右连接",
+          label: this.$t('treeTable.rightJoin'),
           value: "RIGHT JOIN",
         },
       ],
@@ -325,11 +317,11 @@ export default {
       relyOptions: [
         {
           value: "0",
-          label: "自定义依赖值",
+          label: this.$t('treeTable.customDependency'),
         },
         {
           value: "1",
-          label: "依赖其他字段",
+          label: this.$t('treeTable.dependencyOtherField'),
         },
       ],
       // 依赖值
@@ -363,13 +355,13 @@ export default {
     }),
     // 标题
     treeTableMangeTitle() {
-      switch (parseInt(this.mode, 10)) { // 确保mode是整数类型
+      switch (parseInt(this.mode, 10)) {
         case 2:
-          return '新增树形表格配置';
+          return this.$t('treeTable.addTreeTableConfig');
         case 3:
-          return '修改树形表格配置';
+          return this.$t('treeTable.editTreeTableConfig');
         case 4:
-          return '查看树形表格配置';
+          return this.$t('treeTable.viewTreeTableConfig');
         default:
           return '';
       }
@@ -391,7 +383,7 @@ export default {
             if (valid) {
               let x = this.$refs.treeTableFormItems.queryParams
               if (!this.tableList.length > 0) {
-                this.$message.error("请等待表格加载完成");
+                this.$message.error(this.$t('treeTable.waitTableLoading'));
                 return false; // 阻止提交
               } else {
                 let data = {}
@@ -407,7 +399,7 @@ export default {
                     treeTableDgl: formTopData.treeTableDgl,//树形表后台递归列
                     treeShowLabel: formTopData.treeShowLabel,// 树形展示列
                     treeTableCondition: formTopData.treeTableCondition,//树形表是lable/还是value作为条件
-                    tableId: x.tableId,//关联表 
+                    tableId: x.tableId,//关联表
                     tableNameDes: this.tableList[0].dtName,//关联表
                     treeTableJoinTablePrimaryKey: this.tableList[0].primaryKey,//关联表主键
                     treeTableJoinTableCondition:x.treeTableJoinTableCondition,
@@ -437,7 +429,7 @@ export default {
                       treeTableDgl: formTopData.treeTableDgl,//树形表后台递归列
                       treeShowLabel: formTopData.treeShowLabel,//树形表展示列
                       treeTableCondition: formTopData.treeTableCondition,//树形表是lable/还是value作为条件
-                      tableId: x.tableId,//关联表 
+                      tableId: x.tableId,//关联表
                       tableNameDes: this.tableList[0].dtName,//关联表
                       treeTableJoinTablePrimaryKey: this.tableList[0].primaryKey,//关联表主键
                       treeTableJoinTableCondition:x.treeTableJoinTableCondition,
@@ -458,12 +450,12 @@ export default {
                 }
               }
             } else {
-              this.$message.error("请完善表单配置信息");
+              this.$message.error(this.$t('treeTable.completeFormConfig'));
               return false; // 阻止提交
             }
           });
         } else {
-          this.$message.error("请完善树形菜单配置信息");
+          this.$message.error(this.$t('treeTable.completeTreeMenuConfig'));
           return false; // 阻止提交
         }
       });
@@ -703,7 +695,7 @@ export default {
       }
       listTable(queryParams).then((response) => {
         if (response.code == 200) {
-          
+
           this.treeTableFormItems[0].options = response.rows.map(item => {
             return {
               ...item,
@@ -793,7 +785,7 @@ export default {
         );
 
         if (!this.$refs.dynamicForm.queryParams.menuId) {
-          this.$message.warning("该表格菜单路由已经删除,请重新配置");
+          this.$message.warning(this.$t('treeTable.menuDeletedTip'));
           this.isNeedNewMenu = true;
         }
 
@@ -950,4 +942,4 @@ export default {
 .isSearch .el-input__suffix {
   height: auto;
 }
-</style>
+</style>

+ 127 - 10
zkqy-ui/ss.html

@@ -68,9 +68,9 @@ var zkqyTable = {
     `,
     data() {
         return {
-            zkqyTablePageJson:[{"type":"zkqyTable","field":"Fic7m9vb08gnbdc","title":"表格","$required":false,"props":{"addZkqyTableRow":109,"updateZkqyTableRow":108,"pageId":127},"columns":[{"tableName":"stu","tableType":"primary","columnName":"主键","showValue":"id","searchValue":"stu@id"},{"tableName":"stu","tableType":"primary","columnName":"名称","showValue":"name","searchValue":"stu@name"},{"tableName":"cls","tableType":"sub","primaryKey":"cls_id","subKey":"id","columnName":"课程名","showValue":"name","searchValue":"cls@name"}],"_fc_id":"id_Fimrm9vb08gnbec","name":"ref_Ftedm9vb08gnbfc","display":true,"hidden":false,"_fc_drag_tag":"zkqyTable"}],
+            zkqyTablePageJson:[{"type":"zkqyTable","field":"Fcgdma2cofgiazc","title":"表格","$required":false,"props":{"addZkqyTableRow":144,"updateZkqyTableRow":145,"pageId":146},"columns":[{"tableName":"stu","tableType":"primary","columnName":"主键","showValue":"id","searchValue":"stu@id"},{"tableName":"stu","tableType":"primary","columnName":"名称","showValue":"name","searchValue":"stu@name"},{"tableName":"stu","tableType":"primary","columnName":"老师id","showValue":"teacher_id","searchValue":"stu@teacher_id"},{"tableName":"stu","tableType":"primary","columnName":"习惯集合","showValue":"habbit_collection","searchValue":"stu@habbit_collection"},{"tableName":"stu","tableType":"primary","columnName":"树id","showValue":"tree_id","searchValue":"stu@tree_id"},{"tableName":"stu","tableType":"primary","columnName":"性别","showValue":"sex","searchValue":"stu@sex"},{"tableName":"stu","tableType":"primary","columnName":"树id2","showValue":"tree_id_two","searchValue":"stu@tree_id_two"},{"tableName":"stu","tableType":"primary","columnName":"穿梭框id集合","showValue":"el_transfer_id","searchValue":"stu@el_transfer_id"},{"tableName":"cls","tableType":"sub","primaryKey":"cls_id","subKey":"id","columnName":"课程名","showValue":"name","searchValue":"cls@name"}],"_fc_id":"id_Fwqsma2cofgib0c","name":"ref_Fk8ema2cofgib1c","display":true,"hidden":false,"_fc_drag_tag":"zkqyTable"}],
             tableData: [],
-            columns: [{"prop":"stu@id","label":"主键"},{"prop":"stu@name","label":"名称"},{"prop":"cls@name","label":"课程名"}],
+            columns: [{"prop":"stu@id","label":"主键"},{"prop":"stu@name","label":"名称"},{"prop":"stu@teacher_id","label":"老师id"},{"prop":"stu@habbit_collection","label":"习惯集合"},{"prop":"stu@tree_id","label":"树id"},{"prop":"stu@sex","label":"性别"},{"prop":"stu@tree_id_two","label":"树id2"},{"prop":"stu@el_transfer_id","label":"穿梭框id集合"},{"prop":"cls@name","label":"课程名"}],
             radio: '',
             policyData: {},
             currentPage4: 1,
@@ -242,19 +242,15 @@ var zkqyTable = {
             await this.fetchGet(endpoint , params,(data) => {
                 if (data.code === 200) {
                         const decodedHtml = decodeURIComponent(data.data.htmlData);
-                
-                        // 创建全屏 iframe
                         const iframe = document.createElement('iframe');
                         iframe.srcdoc = decodedHtml;
                         iframe.style.width = '100%';
                         iframe.style.height = '100vh';
                         iframe.style.border = 'none';
-                        
-                        // 清空页面并插入 iframe
                         document.body.innerHTML = '';
                         document.body.appendChild(iframe);
                         // 将 pageId 存储到 localStorage
-                        localStorage.setItem('sharedPageId', pageId);   
+                        localStorage.setItem('sharedPageId', this.pageId);   
                     }
             });
         },
@@ -308,17 +304,138 @@ new Vue({
                 el: '#app',
                 data() {
                     return {
-                        rule: formCreate.parseJson('[{"type":"zkqyTable","field":"Fic7m9vb08gnbdc","title":"表格","$required":false,"props":{"addZkqyTableRow":109,"updateZkqyTableRow":108,"pageId":127},"columns":[{"tableName":"stu","tableType":"primary","columnName":"主键","showValue":"id","searchValue":"stu@id"},{"tableName":"stu","tableType":"primary","columnName":"名称","showValue":"name","searchValue":"stu@name"},{"tableName":"cls","tableType":"sub","primaryKey":"cls_id","subKey":"id","columnName":"课程名","showValue":"name","searchValue":"cls@name"}],"_fc_id":"id_Fimrm9vb08gnbec","name":"ref_Ftedm9vb08gnbfc","display":true,"hidden":false,"_fc_drag_tag":"zkqyTable"}]'),
-                        options: formCreate.parseJson('{"form":{"inline":false,"hideRequiredAsterisk":false,"showMessage":true,"inlineMessage":false,"labelPosition":"right","labelWidth":"125px","validateOnRuleChange":false,"size":"small","formName":"aaaa"},"resetBtn":{"show":false,"innerText":"重置"},"submitBtn":{"show":false,"innerText":"提交"}}'),
+                        rule: formCreate.parseJson('[{"type":"zkqyTable","field":"Fcgdma2cofgiazc","title":"表格","$required":false,"props":{"addZkqyTableRow":144,"updateZkqyTableRow":145,"pageId":146},"columns":[{"tableName":"stu","tableType":"primary","columnName":"主键","showValue":"id","searchValue":"stu@id"},{"tableName":"stu","tableType":"primary","columnName":"名称","showValue":"name","searchValue":"stu@name"},{"tableName":"stu","tableType":"primary","columnName":"老师id","showValue":"teacher_id","searchValue":"stu@teacher_id"},{"tableName":"stu","tableType":"primary","columnName":"习惯集合","showValue":"habbit_collection","searchValue":"stu@habbit_collection"},{"tableName":"stu","tableType":"primary","columnName":"树id","showValue":"tree_id","searchValue":"stu@tree_id"},{"tableName":"stu","tableType":"primary","columnName":"性别","showValue":"sex","searchValue":"stu@sex"},{"tableName":"stu","tableType":"primary","columnName":"树id2","showValue":"tree_id_two","searchValue":"stu@tree_id_two"},{"tableName":"stu","tableType":"primary","columnName":"穿梭框id集合","showValue":"el_transfer_id","searchValue":"stu@el_transfer_id"},{"tableName":"cls","tableType":"sub","primaryKey":"cls_id","subKey":"id","columnName":"课程名","showValue":"name","searchValue":"cls@name"}],"_fc_id":"id_Fwqsma2cofgib0c","name":"ref_Fk8ema2cofgib1c","display":true,"hidden":false,"_fc_drag_tag":"zkqyTable"}]'),
+                        options: formCreate.parseJson('{"form":{"inline":false,"hideRequiredAsterisk":false,"showMessage":true,"inlineMessage":false,"labelPosition":"right","labelWidth":"125px","validateOnRuleChange":false,"size":"small","formName":"表格1"},"resetBtn":{"show":false,"innerText":"重置"},"submitBtn":{"show":true,"innerText":"提交"}}'),
                         formData: {},
                         api: null,
+                        zkqyData:[],
+                        zkqyUpload:[],
                     };
                 },
                 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': 'undefined',
+                            'Content-Type': 'application/json'
+                        };
+                        try {
+                            let response;
+                            if (type === 'cascader' || type === 'tree') {
+                                // 调用树形接口 POST
+                                const apiUrl = 'undefinedapi/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 = 'undefinedapi/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();
+                            const targetRule = this.rule.find(item => item._fc_id === id);
+                              if (type === 'tree') {
+                                 this.$set(targetRule?.props, 'data', result.data);
+                              }
+                              else if(type === 'cascader'){
+                                this.$set(targetRule.props, 'options', result.data);
+
+                              }else if(type === 'elTransfer'){
+                                this.$set(targetRule.props, 'data', result.data);
+                              }else {
+                                this.$set(targetRule, 'options', result.data);
+                              }
+                              this.rule =formCreate.parseJson(formCreate.toJson([...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() {
+                    this.rule.forEach(ruleItem => {
+                        if(ruleItem.type=="upload"){
+                          console.log('ruleItem',ruleItem)
+                          console.log('this.rule ',this.rule )
+                          if(ruleItem?.value.length>0){
+                            const processedUrl = 'undefined'.endsWith('/') ?'undefined'.slice(0, -1) : 'undefined'; // 如果 url 最后一个字符是斜杠,则去掉它
+                            console.log('processedUrl',processedUrl)
+                            ruleItem.value = ruleItem.value.map(
+                                item => processedUrl+item
+                              );
+                          }
+                          console.log(' ruleItem.value ', ruleItem.value  )
+
+                        //   this.rule =formCreate.parseJson(formCreate.toJson([...this.rule])); // 触发重新渲染
+                          ruleItem.props.onSuccess="[[FORM-CREATE-PREFIX-function onSuccess(res, file){const key='upload_row';const existingData=sessionStorage.getItem(key);let fileList=existingData?JSON.parse(existingData):[];if(!Array.isArray(fileList)){fileList=[];}const newItem={fileName: file.response.fileName, url: file.url};fileList.push(newItem);sessionStorage.setItem(key,JSON.stringify(fileList));}-FORM-CREATE-SUFFIX]]"
+                        }
+                      })
+                    let zkqyData = this.zkqyData
+                    if(zkqyData && zkqyData.length>0){
+                        console.log('[this.rule]',this.rule)
+                        this.rule.forEach(ruleItem => {
+                        const matchedData = zkqyData.find(dataItem => dataItem._fc_id === ruleItem._fc_id);
+                        if (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>

+ 2 - 14
zkqy-ui/vue.config.js

@@ -43,8 +43,8 @@ module.exports = {
         // target: `http://192.168.110.52:8080`,
         // target: `http://192.168.110.76:8080`,
         // target: `http://175.27.169.173:8080`,
-        // target: `http://192.168.10.6:8080`,
         target: `http://192.168.10.103:8080`,
+
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''
@@ -52,7 +52,6 @@ module.exports = {
       },
       '/DB': {
         // target: `http://192.168.110.59:8099`,
-        // target: `http://192.168.10.6:8099`,
         target: `http://192.168.10.103:8099`,
         changeOrigin: true,
         pathRewrite: {
@@ -62,9 +61,7 @@ module.exports = {
       '/FORM': {
         // target: `http://192.168.110.59:8088`,
         // target: `http://175.27.169.173:8088`,
-        // target: `http://192.168.10.6:8088`,
         target: `http://192.168.10.103:8088`,
-
         changeOrigin: true,
         pathRewrite: {
           ['^' + '/FORM']: ''
@@ -118,19 +115,10 @@ module.exports = {
       }),
       new MonacoWebpackPlugin()
     ],
-    module: {
-      rules: [
-        {
-          test: /\.js$/,
-          loader: "babel-loader",
-          exclude: /node_modules\/(?!@form-create)/, // 仅排除非 @form-create 的 node_modules
-        },
-      ],
-    },
     // devtool: isDev ? "source-map" : false
   },
   chainWebpack(config) {
-    //config.plugins.delete('preload') // TODO: need test
+    config.plugins.delete('preload') // TODO: need test
     config.plugins.delete('prefetch') // TODO: need test
 
     // set svg-sprite-loader

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov