Jelajahi Sumber

国际化,admin系统管理的部分

sql715 2 bulan lalu
induk
melakukan
dfd0560a6a

+ 1 - 1
zkqy-ui/src/components/ExcelDownLoad/index.vue

@@ -15,7 +15,7 @@
         size="mini"
         v-hasPermi="['system:process:export']"
       >
-        导出已选
+      {{ $t('system.role.exportSelect') }}
       </el-button>
     </download-excel>
   </div>

+ 1 - 1
zkqy-ui/src/components/IconSelect/index.vue

@@ -1,7 +1,7 @@
 <!-- @author zhengjie -->
 <template>
   <div class="icon-body">
-    <el-input v-model="name" class="icon-search" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons">
+    <el-input v-model="name" class="icon-search" clearable :placeholder="$t('system.menu.enterTheName')" @clear="filterIcons" @input="filterIcons">
       <i slot="suffix" class="el-icon-search el-input__icon" />
     </el-input>
     <div class="icon-list">

+ 44 - 0
zkqy-ui/src/components/LangSelect/index.vue

@@ -0,0 +1,44 @@
+<template>
+  <el-dropdown trigger="click" class="international" @command="handleSetLanguage">
+    <div>
+      <svg-icon class-name="international-icon" icon-class="language" />
+    </div>
+    <el-dropdown-menu slot="dropdown">
+      <el-dropdown-item :disabled="language==='zh_CN'" command="zh_CN">
+        中文
+      </el-dropdown-item>
+      <el-dropdown-item :disabled="language==='en_US'" command="en_US">
+        English
+      </el-dropdown-item>
+    </el-dropdown-menu>
+  </el-dropdown>
+</template>
+
+<script>
+import { changeLanguage } from "@/api/login";
+
+
+export default {
+  computed: {
+    language() {
+      console.log('this.$store.getters.language',this.$store.getters.language)
+      return this.$store.getters.language
+    }
+  },
+  methods: {
+    handleSetLanguage(value) {
+      console.log('value',value)
+      this.$i18n.locale = value
+      this.$store.dispatch('app/setLanguage', value)
+      // this.$message({ message: '设置语言成功', type: 'success' })
+      // changeLanguage(value).then(response => {
+      //   console.log('response',response)
+      //   window.location.reload();
+      // });
+    }
+  },
+  mounted(){
+    console.log(1234567)
+  }
+}
+</script>

+ 1429 - 0
zkqy-ui/src/lang/en.js

@@ -0,0 +1,1429 @@
+export default {
+  login: {
+    title: 'Industrial Engine',
+    logIn: 'Login',
+    username: 'Username',
+    password: 'Password',
+    code: 'Code',
+    rememberMe: 'Remember Me',
+    pleaseEnterUsername: 'Please enter your username',
+    pleaseEnterPassword: 'Please enter your password',
+    pleaseEnterCode: 'Please enter verification code',
+    loginDescription: 'Login and start managing your smart engine account',
+    smartManufacturing: 'Smart Manufacturing',
+    internetOfThings: 'Internet of Things'
+  },
+  logout: {
+    alarm: 'alarm',
+    message: 'Confirm logout and exit the system?',
+    confirm: 'confirm',
+    cancel: 'cancel'
+  },
+  user: {
+    center: 'Personal Center',
+    logout: 'Logout',
+    info: 'Personal Information',
+    name: 'Username',
+    phone: 'Phone Number',
+    email: 'Email',
+    dept: 'Department',
+    role: 'Role',
+    createDay: 'Creation Date',
+    profile: 'Profile',
+    nickname: 'Nickname',
+    sex: 'Gender',
+    man: 'Male',
+    woman: 'Female',
+    updatePassword: 'Change Password',
+    oldPassword: 'Old Password',
+    newPassword: 'New Password',
+    confirmPassword: 'Confirm Password',
+    languageSelect: 'Language Select',
+    management: {
+      roleName: 'Role Name',
+      pleaseEnterRoleName: 'Please enter role name',
+      tenantName: 'Tenant Name',
+      pleaseEnterTenantName: 'Please enter tenant name',
+      permissionChar: 'Permission Character',
+      pleaseEnterPermissionChar: 'Please enter permission character',
+      status: 'Status',
+      roleStatus: 'Role Status',
+      createTime: 'Create Time',
+      startDate: 'Start Date',
+      endDate: 'End Date',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      modify: 'Modify',
+      delete: 'Delete',
+      export: 'Export',
+      process: 'Process',
+      more: 'More',
+      dataPermission: 'Data Permission',
+      assignUser: 'Assign User',
+      roleId: 'Role ID',
+      displayOrder: 'Display Order',
+      menuPermission: 'Menu Permission',
+      expandCollapse: 'Expand/Collapse',
+      selectAll: 'Select All/None',
+      parentChildLink: 'Parent-Child Link',
+      loading: 'Loading, please wait',
+      remark: 'Remark',
+      pleaseEnterContent: 'Please enter content',
+      permissionScope: 'Permission Scope',
+      allData: 'All Data Permission',
+      customData: 'Custom Data Permission',
+      deptData: 'Department Data Permission',
+      deptAndBelow: 'Department and Below Data Permission',
+      personalData: 'Personal Data Permission',      
+      confirm: 'Confirm',
+      cancel: 'Cancel',
+      messages: {
+        enableConfirm: 'Are you sure to enable role "{0}"?',
+        disableConfirm: 'Are you sure to disable role "{0}"?',
+        enableSuccess: 'Enable successful',
+        disableSuccess: 'Disable successful',
+        modifySuccess: 'Modify successful',
+        addSuccess: 'Add successful',
+        deleteConfirm: 'Are you sure to delete role with ID "{0}"?',
+        deleteSuccess: 'Delete successful'
+      },
+      rules: {
+        roleName: 'Role name cannot be empty',
+        permissionChar: 'Permission character cannot be empty',
+        roleSort: 'Role order cannot be empty'
+      }
+    }
+  },
+  normal: {
+    pleaseEnter: 'Please enter ',
+    pleaseEnterRight: 'Please enter right ',
+    pleaseConfirm: 'Please confirm ',
+    blank: ' ',
+    notEmpty: "Can't be empty ",
+    save: 'Save',
+    close: 'Close',
+    search: 'Search',
+    reset: 'Reset',
+    insert: 'Add',
+    delete: 'Delete',
+    export: 'Export',
+    deleteSuccess: 'Delete Success',
+    operation: 'Operation',
+    process: 'Process',
+    remark: 'Remark',
+    isConfirmDelete: 'Are you sure to delete process definition number',
+    pleaseSelectData: 'Please select process data items!',
+    confirm: 'Confirm',
+    cancel: 'Cancel'
+  },
+  dataModeling: {
+    tableName: 'TableName',
+    tableDescription: 'Table description',
+    createTime: 'createTime',
+    dataTableName: 'data TableName',
+    dataTableField: 'data TableField',
+    No: 'No',
+    fieldName: 'fieldName',
+    fieldType: 'fieldType',
+    length: 'length',
+    notNull: 'notNull',
+    primaryKey: 'primaryKey',
+    SelfIncrement: 'SelfIncrement',
+    fieldDescription: 'fieldDescription',
+    add: 'add',
+    table: 'table?',
+    addField: 'addField'
+  },
+  search: 'search',
+  reset: 'reset',
+  operation: 'operation',
+  delete: 'delete',
+  deleteSuccess: 'Delete success',
+  insert: 'insert',
+  update: 'update',
+  pleaseEnter: 'Please enter ',
+  process: 'process',
+  isConfirmDelete: 'Are you sure want to delete',
+  rules: {
+    passwordLimit: 'Length should be between 6 to 20 characters',
+    formGroup: {
+      groupName: 'Group Name',
+      groupDesc: 'Group Description',
+      mainForm: 'Main Form',
+      formPrimaryKey: 'Form Primary Key'
+    }
+  },
+  page: {
+    index: 'DashBoard'
+  },
+  statistics: {
+    workflowStatistics: 'workflow statistics',
+    processFlow: 'process flow',
+    approvalFlow: 'approval flow',
+    operationLog: 'operation log',
+    operator: 'operator',
+    userLoginStatistics: 'user login statistics',
+    client: 'client',
+    toolEnd: 'tool end',
+    dataModelingStatistics: 'data modeling statistics',
+    tableStatistics: 'table statistics',
+    form: 'form',
+    table: 'table',
+    threeLevelLinkage: 'three-level linkage',
+    formGroup: 'form group',
+    multiTableQuantity: 'multi-table quantity',
+    dataModeling: 'data modeling'
+  },
+  tagsView: {
+    refresh: 'Refresh',
+    close: 'Close',
+    closeCurrent: 'Close Current',
+    closeOthers: 'Close Others',
+    closeAll: 'Close All',
+    closeLeft: 'Close Left',
+    closeRight: 'Close Right'
+  },
+  settings: {
+    loading: 'Loading system resources, please wait',
+    downloadedLoading: 'Data is being downloaded. Please wait a moment',
+    title: 'Page style setting',
+    theme: 'Theme Color',
+    tagsView: 'Open Tags-View',
+    fixedHeader: 'Fixed Header',
+    sidebarLogo: 'Sidebar Logo'
+  },
+  bpmprocess: {
+    remark: 'Remark',
+    processName: 'Process Name',
+    processKey: 'Process Alias',
+    processType: 'Process Type',
+    pleaseEnterProcessName: 'Please enter the process name',
+    pleaseEnterProcessKey: 'Please enter the process alias',
+    productionProcess: 'Production Process',
+    approvalProcess: 'Approval Process',
+    primaryKey: 'Primary Key',
+    startEventType: 'Start Event Type',
+    versionNote: 'Version Note',
+    versionStatus: 'Version Status',
+    versionStatusDialog: 'Version Status',
+    exportAll: 'Export All',
+    exportProcessFile: 'Export Process File',
+    backupFlowChart: 'Backup Flow Chart',
+    designFlowChart: 'Design Flow Chart',
+    enable: 'Enable',
+    enableSuccess: 'Enable Success'
+  },
+  dragform: {
+    formName: 'Form Name',
+    formNamePlaceholder: 'Please enter form name',
+    formAlias: 'Form Alias',
+    formAliasPlaceholder: 'Please enter form alias',
+    dataSourceName: 'Data Source Name',
+    dataSourceNamePlaceholder: 'Please enter data source name',
+    boundTableName: 'Bound Table Name',
+    boundTableNamePlaceholder: 'Please enter bound table name',
+    formDescription: 'Form Description',
+    formDescriptionPlaceholder: 'Please enter form description',
+    formVueTemplate: 'Form Vue Template',
+    formHtmlTemplate: 'Form HTML Template',
+    formSql: 'Form SQL',
+    nodeId: 'Node ID',
+    nodeIdPlaceholder: 'Please enter node ID',
+    logicalDelete: 'Logical Delete',
+    logicalDeletePlaceholder: 'Please enter logical delete',
+    spareColumn: 'Spare Column',
+    spareColumnPlaceholder: 'Please enter spare column',
+    search: 'Search',
+    reset: 'Reset',
+    add: 'Add',
+    edit: 'Edit',
+    delete: 'Delete',
+    export: 'Export',
+    process: 'Process',
+    confirm: 'Confirm',
+    cancel: 'Cancel',
+    confirmDelete: 'Are you sure to delete form number',
+    deleteSuccess: 'Delete Success',
+    addSuccess: 'Add Success',
+    editSuccess: 'Edit Success',
+    formPrimaryKey: 'Form Primary Key',
+    formVueTemplatePlaceholder: 'Please enter content',
+    formHtmlTemplatePlaceholder: 'Please enter content',
+    formSqlPlaceholder: 'Please enter form SQL',
+    tableName: 'Table Name',
+    tableAlias: 'Table Alias',
+    tableNumber: 'Table Number',
+    sqlNumber: 'SQL Number',
+    tableDescription: 'Table Description',
+    timeFormat: 'Time Format',
+    equalJoin: 'Equal Join',
+    leftJoin: 'Left Join',
+    rightJoin: 'Right Join',
+    customDependency: 'Custom Dependency Value',
+    dependencyOtherField: 'Dependency Other Field',
+  },
+  relateTable: {
+    tableGroupName: 'Table Group Name',
+    tablePrimaryKey: 'Table Primary Key',
+    description: 'Description',
+    tableCount: 'Table Count',
+    memberTables: 'Member Tables',
+    operation: 'Operation',
+    process: 'Process',
+    modify: 'Modify',
+    delete: 'Delete',
+    add: 'Add',
+    search: 'Search',
+    reset: 'Reset',
+    addDynamicTableGroup: 'Add Dynamic Table Group',
+    updateDynamicTableGroup: 'Update Dynamic Table Group',
+    menuName: 'Menu Name',
+    menuDescription: 'Menu Description',
+    menuRoute: 'Menu Route',
+    tableTitle: 'Table Title',
+    tableName: 'Table Name',
+    addRelateTable: 'Add Related Table',
+    updateRelateTable: 'Update Related Table',
+    timeFormat: 'Time Format',
+    sortDependency: 'Sort Dependency Field',
+    sortMethod: 'Sort Method',
+    ascending: 'Ascending',
+    descending: 'Descending',
+    displayField: 'Display Field',
+    serialNumber: 'No',
+    dataField: 'Data Field',
+    fieldDescription: 'Field Description',
+    relateTable: 'Related Table',
+    relateConditionField: 'Related Condition Field',
+    relateMethod: 'Related Method',
+    isShow: 'Is Show',
+    isSearch: 'Is Search',
+    cancel: 'Cancel',
+    confirm: 'Confirm',
+    searchDependency: 'Search Dependency Value',
+    selectDependencyMethod: 'Please select dependency method',
+    enterDependencyValue: 'Please enter dependency value',
+    selectDependencyField: 'Please select dependency field',
+    pleaseSelectSearchField: 'Please select at least one search field',
+    pleaseCompleteForm: 'Please complete the form',
+    pleaseAddMultipleTables: 'Please add multiple tables',
+    createSuccess: 'Create Success',
+    createFailed: 'Create Failed',
+    updateSuccess: 'Update Success',
+    updateFailed: 'Update Failed',
+    deleteSuccess: 'Delete Success',
+    deleteFailed: 'Delete Failed',
+    enterTableGroupName: 'Please enter table group name',
+    enterMenuName: 'Please enter menu name',
+    enterMenuDescription: 'Please enter menu description',
+    selectParentRoute: 'Please select parent route',
+    selectTableName: 'Please select table name',
+    selectTablePrimaryKey: 'Please select table primary key',
+    selectTimeFormat: 'Please select time format',
+    selectSortDependency: 'Please select sort dependency',
+    selectRelateTable: 'Please select related table',
+    selectRelateField: 'Related field',
+    selectRelateMethod: 'Please select related method',
+    customDependency: 'Custom Dependency Value',
+    dependencyOtherField: 'Dependency Other Field',
+    pleaseEnterTableTitle: 'Please enter table title',
+    pleaseSelectTableName: 'Please select table name',
+    pleaseSelectRelateField: 'Please select related field',
+    pleaseEnterTableGroupName: 'Please enter table group name',
+    pleaseEnterTableDescription: 'Please enter table description',
+    pleaseSelectRoute: 'Please select route',
+    equalJoin: 'Equal Join',
+    leftJoin: 'Left Join',
+    rightJoin: 'Right Join'
+  },
+  tenant: {
+    tenantName: 'Tenant Name',
+    tenantCode: 'Tenant Code',
+    owner: 'Owner',
+    contactInfo: 'Contact Info',
+    address: 'Address',
+    tenantId: 'Tenant ID',
+    tenantParentId: 'Parent Tenant ID',
+    tenantClientLoginUrl: 'Client Login URL',
+    tenantToolLoginUrl: 'Tool Login URL',
+    tenantGrade: 'Tenant Grade',
+    tenantExpirationTime: 'Expiration Days',
+    tenantProfession: 'Tenant Type',
+    selectParentTenant: 'Select Parent Tenant',
+    pleaseEnterTenantName: 'Please enter tenant name',
+    pleaseEnterTenantCode: 'Please enter tenant code',
+    pleaseEnterOwner: 'Please enter owner',
+    pleaseEnterSelect: 'please enter select',
+    pleaseEnterContactInfo: 'Please enter contact info',
+    pleaseEnterAddress: 'Please enter address',
+    pleaseSelectTenantProfession: 'Please select tenant type',
+    pleaseEnterTenantClientLoginUrl: 'Please enter client login URL',
+    pleaseEnterTenantToolLoginUrl: 'Please enter tool login URL',
+    pleaseEnterTenantGrade: 'Please enter tenant grade',
+    bindDatasource: 'Bind Datasource',
+    activateTenant: 'Activate Tenant',
+    configLoginPage: 'Configure Login Page',
+    publicNetwork: 'Public Network',
+    privateNetwork: 'Private Network',
+    datasourceType: 'Datasource Type',
+    databaseName: 'Database Name',
+    tenantAccount: 'Tenant Admin Account',
+    databaseIp: 'Database IP',
+    username: 'Username',
+    password: 'Password',
+    portNumber: 'Port Number',
+    pleaseEnterDatabaseName: 'Please enter database name',
+    pleaseEnterTenantAccount: 'Please enter tenant admin account',
+    pleaseEnterDatabaseIp: 'Please enter database IP',
+    pleaseEnterUsername: 'Please enter username',
+    pleaseEnterPassword: 'Please enter password',
+    pleaseEnterPortNumber: 'Please enter port number',
+    binding: 'Binding',
+    pleaseEnterActivationCode: 'Please enter activation code',
+    loginUrlTip: 'Please add parameter to login URL: tenantId={code}',
+    number: 'Number',
+    pleaseEnterLoginPageNumber: 'Please enter login page number',
+    title: 'Title',
+    pleaseEnterLoginPageTitle: 'Please enter login page title',
+    description: 'Description',
+    descriptionTip: 'Recommended length is 8 Chinese characters, can use <br/> for line break',
+    pleaseEnterContent: 'Please enter content',
+    windowTitle: 'Window Title',
+    pleaseEnterWindowTitle: 'Please enter window title',
+    logoTip: 'Recommended image size is 194*64px',
+    logo: 'Logo',
+    backgroundImageTip: 'Recommended image size is 1400*900px',
+    backgroundImage: 'Background Image',
+    activationCode: {
+      tenantInfo: 'Tenant Information',
+      rechargeTime: 'Recharge Time',
+      pleaseSelectTenant: 'Please select tenant',
+      pleaseEnterRechargeDays: 'Please enter recharge days',
+      generateCode: 'Generate Activation Code',
+      cancel: 'Cancel',
+      generateSuccess: 'Activation Code Generated Successfully',
+      oneClickCopy: 'One-click Copy',
+      loginAddress: 'Login Address',
+      pleaseEnterLoginAddress: 'Please enter login address',
+      operator: 'Operator',
+      pleaseEnterOperator: 'Please enter operator',
+      operationTime: 'Operation Time',
+      startDate: 'Start Date',
+      endDate: 'End Date',
+      search: 'Search',
+      reset: 'Reset',
+      logId: 'Log ID',
+      operationIp: 'Operation IP Address',
+      operationDate: 'Operation Date',
+      remark: 'Remark',
+      messages: {
+        copySuccess: 'Text has been successfully copied to clipboard',
+        copyFailed: 'Copy failed',
+        tenantNotSelected: 'Tenant information not selected',
+        expirationDateNotSet: 'Tenant expiration date not set'
+      }
+    },
+    messages: {
+      addSuccess: 'Added successfully',
+      modifySuccess: 'Modified successfully',
+      deleteConfirm: 'Are you sure to delete the tenant information with ID "{0}"?',
+      deleteSuccess: 'Deleted successfully',
+      bindingSuccess: 'Binding successful',
+      activationSuccess: 'Activation successful',
+      activationFailed: 'Activation failed',
+      networkError: 'Network error, please try again later',
+      cannotSelectSelf: 'Cannot select self as parent tenant',
+      databaseNameExists: 'Database name already exists',
+      databaseNameCheckFailed: 'Database name verification failed, please re-enter',
+      tenantAccountExists: 'Tenant admin account already exists',
+      tenantAccountCheckFailed: 'Tenant admin account verification failed, please re-enter',
+      databaseNameFormat: 'Can only contain lowercase letters and numbers, and must start with a lowercase letter',
+      databaseNameDuplicate: 'Database name is duplicate'
+    },
+    rules: {
+      tenantName: 'Tenant name cannot be empty',
+      tenantCode: 'Tenant code cannot be empty',
+      tenantParentId: 'Please select parent tenant',
+      databaseType: 'Database type cannot be empty',
+      databaseName: 'Database name cannot be empty',
+      tenantAccount: 'Tenant admin account cannot be empty',
+      databaseIp: 'Database IP cannot be empty',
+      username: 'Username cannot be empty',
+      password: 'Password cannot be empty',
+      portNumber: 'Port number cannot be empty',
+      activationCode: 'Please enter tenant activation code'
+    },
+    titles: {
+      addTenant: 'Add Tenant Information',
+      modifyTenant: 'Modify Tenant Information',
+      configureDatabase: 'Configure Database',
+      activateTenant: 'Activate Tenant',
+      configureClient: 'Configure Client',
+      configureTool: 'Configure Tool'
+    }
+  },
+  script: {
+    scriptKey: 'Script Code',
+    scriptName: 'Script Name',
+    scriptType: 'Script Type',
+    industryType: 'Industry Type',
+    scriptState: 'Script State',
+    componentState: 'Component State',
+    scriptDescription: 'Script Description',
+    tableName: 'Data Table',
+    examineState: 'Examine State',
+    pass: 'Pass',
+    notPass: 'Not Pass',
+    downloadScript: 'Download Script',
+    downloadNodeTemplate: 'Download Node Template',
+    uploadScriptFile: 'Upload Script File',
+    uploadComponentPage: 'Upload Component Page',
+    examine: 'Examine',
+    pleaseEnterScriptKey: 'Please enter script code',
+    pleaseEnterScriptName: 'Please enter script name',
+    pleaseSelectScriptType: 'Please select script type',
+    pleaseSelectExamineState: 'Please select examine state',
+    pleaseSelectIndustryType: 'Please select industry type',
+    pleaseSelectTenant: 'Please select tenant',
+    pleaseSelectTable: 'Please select data table',
+    pleaseEnterScriptDescription: 'Please enter script description',
+    uploadTip: 'Drag file here or click to upload',
+    downloadSuccessful: 'Download successful!',
+    responseDataNotValidFileFormat:'Response data is not a valid file format:',
+    messages: {
+      copySuccess: 'Script code has been successfully copied to clipboard',
+      copyError: 'Failed to copy script code',
+      uploadSuccess: 'File uploaded successfully',
+      deleteConfirm: 'Are you sure to delete script with ID "',
+      deleteSuccess: 'Delete successful',
+      closeEditorConfirm: 'The editor will be closed, do you want to save the code?',
+      downloadError: 'Download failed, please check the data format returned by the interface!',
+      downloadRetry: 'Download failed, please try again later!',
+      addSuccess: 'Add successful',
+      updateSuccess: 'Update successful',
+      dataItem: ' data item?'
+    },
+    rules: {
+      scriptName: 'Please enter script name',
+      scriptType: 'Please select script type',
+      industryType: 'Please select industry type',
+      scriptState: 'Please select examine state'
+    },
+    titles: {
+      addScript: 'Add Process Node Script',
+      updateScript: 'Update Process Node Script',
+      examineScript: 'Examine Node Information',
+      uploadComponent: 'Upload Component Page',
+      uploadTenant: 'Upload Tenant Script'
+    },
+    comments: {
+      submitUpload: 'Submit Upload File',
+      editorInit: 'Editor Initialization',
+      copySuccess: 'Copy Success',
+      copyError: 'Copy Failed',
+      queryList: 'Query Process Node Script List',
+      cancel: 'Cancel Button',
+      reset: 'Form Reset',
+      search: 'Search Button Operation',
+      resetQuery: 'Reset Button Operation',
+      selectionChange: 'Selection Change',
+      downloadTemplate: 'Download Node Template',
+      add: 'Add Button Operation',
+      update: 'Update Button Operation',
+      examine: 'Examine',
+      submit: 'Submit Button',
+      delete: 'Delete Button Operation',
+      export: 'Export Button Operation',
+      getDictLabel: 'Get Dictionary Label',
+      drawerOpen: 'Drawer Open Callback',
+      drawerClose: 'Drawer Close Callback'
+    }
+  },
+  engineering: {
+    title: 'Engineering Management',
+    engineeringName: 'Engineering Name',
+    downloadTime: 'Download Time',
+    download: 'Download Engineering',
+    downloadSuccess: 'Download Success',
+    downloadError: 'Download Failed',
+    confirmDelete: 'Are you sure to delete engineering number',
+    deleteSuccess: 'Delete Success',
+    add: 'Add Engineering',
+    edit: 'Edit Engineering',
+    downloadNumber: 'Download Count',
+    updateTime: 'Update Time',
+    delFlag: 'Delete Flag',
+    pleaseEnterEngineeringName: 'Please enter engineering name',
+    pleaseEnterDownloadNumber: 'Please enter download count',
+    pleaseSelectDownloadTime: 'Please select download time',
+    pleaseEnterUpdateTime: 'Please enter update time',
+    pleaseEnterDelFlag: 'Please enter delete flag'
+  },
+  navigationBar: {
+    title: 'Navigation Bar Management',
+    name: 'Navigation Bar Name',
+    pageName: 'Page Name',
+    barOrder: 'Navigation Bar Order',
+    pageId: 'Bound Page',
+    add: 'Add Navigation Bar',
+    edit: 'Edit Navigation Bar',
+    export: 'Export',
+    process: 'Process',
+    modify: 'Modify',
+    delete: 'Delete',
+    confirmDelete: 'Are you sure to delete number',
+    deleteSuccess: 'Delete Success',
+    deleteFailed: 'Delete Failed',
+    addSuccess: 'Add Success',
+    editSuccess: 'Edit Success',
+    pleaseEnterName: 'Please enter navigation bar name',
+    pleaseEnterPageName: 'Please enter page name',
+    pleaseSelectPage: 'Please select bound page',
+    pleaseEnterBarOrder: 'Please enter navigation bar order',
+    barOrderMustGreaterThanZero: 'Navigation bar order must be greater than 0',
+    nameRequired: 'Navigation bar name cannot be empty',
+    pageIdRequired: 'Bound page cannot be empty',
+    barOrderRequired: 'Navigation bar order cannot be empty',
+    pleaseSelectRecord: 'Please select records to delete first'
+  },
+  formCreate: {
+    pageKey: 'Page Key',
+    pageName: 'Page Name',
+    pageJson: 'PageJson Parameters',
+    htmlTemplate: 'HTML Template',
+    pageOptions: 'Page Options',
+    boundTable: 'Bound Table',
+    operation: 'Operation',
+    process: 'Process',
+    modify: 'Modify',
+    delete: 'Delete',
+    add: 'Add',
+    pleaseSelectDelete: 'Please select records to delete first',
+    confirmDelete: 'Are you sure to delete number',
+    pleaseEnterPageName: 'Please enter page name'
+  },
+  treeTable: {
+    treeTableKey: 'Tree Table Key',
+    treeTableName: 'Tree Table Name',
+    treeTableDesc: 'Tree Table Alias',
+    treeTableDgl: 'Tree Recursive Column',
+    treeTableCondition: 'Tree Condition',
+    boundTableName: 'Bound Table Name',
+    boundTableId: 'Bound Table ID',
+    operation: 'Operation',
+    process: 'Process',
+    modify: 'Modify',
+    delete: 'Delete',
+    add: 'Add',
+    pleaseSelectDelete: 'Please select records to delete first',
+    confirmDelete: 'Are you sure to delete number',
+    deleteMenuTip: 'Related menu data will also be deleted',
+    enterTreeTableName: 'Please enter tree table name',
+    enterTreeTableDesc: 'Please enter tree table alias',
+    treeMenuConfig: 'Tree Menu Configuration',
+    tableFieldConfig: 'Table Field Configuration',
+    addTreeTableConfig: 'Add Tree Table Configuration',
+    editTreeTableConfig: 'Edit Tree Table Configuration',
+    viewTreeTableConfig: 'View Tree Table Configuration',
+    clear: 'Clear',
+    confirm: 'Confirm',
+    waitTableLoading: 'Please wait for table loading',
+    completeFormConfig: 'Please complete form configuration',
+    completeTreeMenuConfig: 'Please complete tree menu configuration',
+    addSuccess: 'Add Success',
+    editSuccess: 'Edit Success',
+    editFailed: 'Edit Failed',
+    menuDeletedTip: 'The menu route has been deleted, please reconfigure',
+    menuName: 'Menu Name',
+    menuNamePlaceholder: 'Please enter menu name',
+    menuNameRequired: 'Menu name cannot be empty',
+    groupDescription: 'Menu Description',
+    groupDescriptionPlaceholder: 'Please enter menu description',
+    menuRoute: 'Menu Route',
+    menuRoutePlaceholder: 'Please select menu route',
+    menuRouteRequired: 'Menu route cannot be empty',
+    treeName: 'Tree Name',
+    treeNamePlaceholder: 'Please enter table name',
+    treeNameRequired: 'Table name cannot be empty',
+    treeTable: 'Tree Table',
+    treeTablePlaceholder: 'Please select related table',
+    treeTableRequired: 'Tree table cannot be empty',
+    tablePrimaryKey: 'Table Primary Key',
+    tablePrimaryKeyPlaceholder: 'Please select table primary key',
+    tablePrimaryKeyRequired: 'Table primary key cannot be empty',
+    matchMode: 'Match Mode',
+    matchModePlaceholder: 'Please select match mode',
+    matchModeRequired: 'Match mode cannot be empty',
+    recursiveColumn: 'Recursive Column',
+    recursiveColumnPlaceholder: 'Please select table recursive column',
+    recursiveColumnRequired: 'Recursive column cannot be empty',
+    displayColumn: 'Display Column',
+    displayColumnPlaceholder: 'Please select table display column',
+    displayColumnRequired: 'Display column cannot be empty',
+    matchByValue: 'Match by value',
+    matchByLabel: 'Match by label',
+    relatedTable: 'Related Table',
+    relatedTablePlaceholder: 'Please select related table',
+    relatedTableRequired: 'Related table cannot be empty',
+    relatedField: 'Related Field',
+    relatedFieldPlaceholder: 'Please select table related field',
+    relatedFieldRequired: 'Related field cannot be empty',
+    tableName: 'Table Name',
+    tableAlias: 'Table Alias',
+    tableNumber: 'Table Number',
+    sqlNumber: 'SQL Number',
+    tableDescription: 'Table Description',
+    timeFormat: 'Time Format',
+    equalJoin: 'Equal Join',
+    leftJoin: 'Left Join',
+    rightJoin: 'Right Join',
+    customDependency: 'Custom Dependency Value',
+    dependencyOtherField: 'Dependency Other Field',
+  },
+  tableList: {
+    tableName: 'Table Name',
+    tableNamePlaceholder: 'Please enter table name',
+    boundTableName: 'Bound Table Name',
+    boundTableNamePlaceholder: 'Please enter bound table name',
+    tableAlias: 'Table Alias',
+    tableAliasPlaceholder: 'Please enter table alias',
+    tableNumber: 'Table Number',
+    tableNumberPlaceholder: 'Please enter table number',
+    sqlNumber: 'SQL Number',
+    sqlNumberPlaceholder: 'Please enter SQL number',
+    tableDescription: 'Table Description',
+    tableDescriptionPlaceholder: 'Please enter table description',
+    columnTitle: 'Column Title',
+    columnTitlePlaceholder: 'Please enter content',
+    timeFormat: 'Time Format',
+    timeFormatPlaceholder: 'Please enter content',
+    spareColumn: 'Spare Column',
+    spareColumnPlaceholder: 'Please enter spare column',
+    logicalDelete: 'Logical Delete',
+    logicalDeletePlaceholder: 'Please enter logical delete',
+    showCheckbox: 'Show List Checkbox',
+    showCheckboxPlaceholder: 'Please enter whether to show list checkbox (0: show; 1: hide)',
+    tablePrimaryKey: 'Table Primary Key',
+    search: 'Search',
+    reset: 'Reset',
+    add: 'Add',
+    edit: 'Edit',
+    delete: 'Delete',
+    export: 'Export',
+    handle: 'Handle',
+    confirm: 'Confirm',
+    cancel: 'Cancel',
+    confirmDelete: 'Are you sure to delete table with ID "{0}"? Related menu data will also be deleted!',
+    deleteSuccess: 'Delete successfully',
+    addSuccess: 'Add successfully',
+    editSuccess: 'Edit successfully'
+  },
+  tableMange: {
+    fieldEdit: 'Field Edit',
+    selectTable: 'Please select data table',
+    tableComment: 'Table Comment',
+    tableName: 'Table Name',
+    serialNumber: 'Serial Number',
+    dataField: 'Data Field',
+    fieldDescription: 'Field Description',
+    relatedTable: 'Related Table',
+    relatedField: 'Related Field',
+    relatedType: 'Related Type',
+    isShow: 'Is Show',
+    isSearch: 'Is Search',
+    isExport: 'Is Export',
+    menuEdit: 'Menu Edit',
+    menuType: 'Menu Type',
+    tableMenu: 'Table Menu',
+    treeMenu: 'Tree Menu',
+    menuName: 'Menu Name',
+    menuRoute: 'Menu Route',
+    selectParentRoute: 'Please select parent route',
+    showList: 'Show List',
+    timeFormat: 'Time Format',
+    tablePrimaryKey: 'Table Primary Key',
+    sortDependency: 'Sort Dependency',
+    sortMethod: 'Sort Method',
+    ascending: 'Ascending',
+    descending: 'Descending',
+    preview: 'Preview',
+    confirmModify: 'Confirm Modify',
+    confirmCreate: 'Confirm Create',
+    dataStatistics: 'Data Statistics',
+    addDataField: 'Add Data Field',
+    statisticTitle: 'Statistic Title',
+    statisticData: 'Statistic Data',
+    statisticType: 'Statistic Type',
+    selectStatisticField: 'Please select statistic field',
+    selectStatisticType: 'Please select statistic type',
+    cancel: 'Cancel',
+    confirm: 'Confirm',
+    modify: 'Modify',
+    delete: 'Delete',
+    styleEdit: 'Style Edit',
+    dataFilter: 'Data Filter',
+    classificationQuery: 'Classification Query',
+    effectPreview: 'Effect Preview',
+    search: 'Search',
+    reset: 'Reset',
+    add: 'Add',
+    edit: 'Edit',
+    import: 'Import',
+    export: 'Export',
+    operation: 'Operation',
+    pagination: 'Pagination',
+    close: 'Close',
+    selectTableError: 'Please select data table',
+    fieldDescriptionErrorNotNull: 'Field description cannot be empty',
+    relatedConditionError: 'Please complete related conditions',
+    searchFieldError: 'Please select at least one search field',
+    completeForm: 'Please complete the form',
+    modifySuccess: 'Modify Success',
+    createSuccess: 'Create Success',
+    modifyFailed: 'Modify Failed',
+    createFailed: 'Create Failed',
+    menuDeletedTip: 'The menu route has been deleted, please reconfigure',
+    addSuccess: 'Add Success',
+    editSuccess: 'Edit Success',
+    deleteSuccess: 'Delete Success',
+    deleteFailed: 'Delete Failed',
+    selectMenuType: 'Please select menu type',
+    pleaseEnterMenuName: 'Please enter menu name',
+    selectTimeFormat: 'Please select time format',
+    selectTablePrimaryKey: 'Please select table primary key',
+    fieldDescriptionError: 'Please enter field description',
+  },
+  dialog: {
+    addStatisticField: 'Add Statistic Data Field',
+    equalJoin: 'Equal Join',
+    leftJoin: 'Left Join',
+    rightJoin: 'Right Join',
+    customDependency: 'Custom Dependency Value',
+    dependOnOtherField: 'Depend on Other Table Field'
+  },
+  classificationQuery: {
+    add: 'Add',
+    conditionName: 'Condition Name',
+    conditionField: 'Condition Field',
+    conditionType: 'Condition Type',
+    defaultValue: 'Default Value',
+    renderOrder: 'Render Order',
+    more: 'More',
+    delete: 'Delete',
+    settings: {
+      title: 'Settings',
+      displayType: 'Display Type',
+      displaySize: 'Display Size',
+      displayIcon: 'Display Icon',
+      conditionDescription: 'Condition Description',
+      dropdownSql: 'Dropdown SQL',
+      placeholder: {
+        selectField: 'Please select condition field',
+        selectIcon: 'Click to select icon',
+        enterDescription: 'Please enter description (e.g. Please enter name, Please enter number...)',
+        enterSql: 'Please enter SQL statement for dropdown data source'
+      }
+    }
+  },
+  dataFilter: {
+    addCondition: 'Add Condition',
+    conditionField: 'Condition Field',
+    condition: 'Condition',
+    referenceValue: 'Reference Value',
+    delete: 'Delete',
+    placeholder: {
+      selectField: 'Please select condition field'
+    }
+  },
+  styleForm: {
+    addStyle: 'Add Style',
+    serialNumber: 'Serial Number',
+    styleName: 'Style Name',
+    description: 'Description',
+    operation: 'Operation',
+    process: 'Process',
+    modify: 'Modify',
+    delete: 'Delete',
+    editStyle: 'Edit Style',
+    styleDescription: 'Style Description',
+    styleType: 'Style Type',
+    rowStyle: 'Row Style',
+    fieldStyle: 'Field Style',
+    dictionaryStyle: 'Dictionary Style',
+    backgroundColor: 'Background Color',
+    styleField: 'Style Field',
+    selectTable: 'Please select table',
+    selectField: 'Please select field',
+    textStyle: 'Text Style',
+    normalText: 'Normal Text',
+    tag: 'Tag',
+    fontColor: 'Font Color',
+    tagStyle: 'Tag Style',
+    backgroundFill: 'Background Fill',
+    textOnly: 'Text Only',
+    tagType: 'Tag Type',
+    default: 'Default',
+    success: 'Success',
+    info: 'Info',
+    warning: 'Warning',
+    danger: 'Danger',
+    dictionaryField: 'Dictionary Field',
+    dictionary: 'Dictionary',
+    conditionEdit: 'Condition Edit',
+    tableName: 'Table Name',
+    fieldName: 'Field Name',
+    condition: 'Condition',
+    referenceValue: 'Reference Value',
+    addCondition: 'Add Condition',
+    cancel: 'Cancel',
+    confirm: 'Confirm'
+  },
+  excuteBtn: {
+    search: 'Search',
+    reset: 'Reset',
+    add: 'Add',
+    expandCollapse: 'Expand/Collapse',
+    operationColumnBtn: 'Operation Column Button',
+    topBtn: 'Top Button',
+    btnGroupName: 'Button Group Name',
+    icon: 'Icon',
+    permission: 'Permission',
+    operation: 'Operation',
+    process: 'Process',
+    modify: 'Modify',
+    addBtn: 'Add',
+    addBtnGroup: 'Add Button Group',
+    addButton: 'Add Button',
+    parentBtn: 'Parent Button',
+    selectParentBtn: 'Select Parent Button',
+    btnName: 'Button Name',
+    btnIcon: 'Button Icon',
+    clickSelectIcon: 'Click to select icon',
+    btnStyle: 'Button Style',
+    sort: 'Sort',
+    permissionChar: 'Permission Character',
+    btnType: 'Button Type',
+    selectBtnType: 'Please select button type',
+    formType: 'Form Type',
+    selectFormType: 'Please select form type',
+    bindForm: 'Bind Form',
+    selectForm: 'Please select form',
+    promptType: 'Prompt Type',
+    selectPromptType: 'Please select prompt type',
+    promptContent: 'Prompt Content',
+    enterPromptContent: 'Please enter prompt content',
+    executeProcess: 'Execute Process',
+    selectProcess: 'Please select execute process',
+    bindTable: 'Bind Table',
+    selectTable: 'Please select table',
+    bindScript: 'Bind Script',
+    selectScript: 'Please select script node',
+    jumpRoute: 'Jump Route',
+    enterRoute: 'Please enter jump route address',
+    defaultModifyField: 'Default Modify Field',
+    queryParam: 'Query Parameter',
+    serialNumber: 'No',
+    fieldName: 'Field Name',
+    defaultValue: 'Default Value',
+    addParam: 'Add Parameter',
+    conditionParam: 'Condition Parameter',
+    addCondition: 'Add Condition',
+    btnHideCondition: 'Button Hide Condition',
+    symbol: 'Symbol',
+    selectSymbol: 'Please select',
+    referenceValue: 'Reference Value',
+    enterDefaultValue: 'Please enter default value',
+    confirm: 'Confirm',
+    cancel: 'Cancel',
+    pleaseBindTable: 'Please bind the button group to a table first',
+    addSuccess: 'Add Success',
+    networkError: 'Network error, please try again later',
+    updateSuccess: 'Update Success',
+    updateError: 'Network error, please try again later',
+    confirmDelete: 'Are you sure to delete the item named "{0}"?',
+    deleteSuccess: 'Delete Success',
+    networkErrorRetry: 'Network error, please try again later',
+    unknownProcess: 'Unknown Process',
+    primary: 'Primary',
+    success: 'Success',
+    warning: 'Warning',
+    danger: 'Danger',
+    info: 'Info',
+    text: 'Text',
+    noNeedForm: 'No Form Needed',
+    singleForm: 'Single Form',
+    formGroup: 'Form Group',
+    calculateForm: 'Calculate Form',
+    other: 'Other',
+    directory: 'Directory',
+    outLink: 'External Link',
+    innerLink: 'Internal Link',
+    insert: 'Insert',
+    update: 'Update',
+    delete: 'Delete',
+    execute: 'Execute Script',
+    initiated: 'Initiate Process',
+    print: 'Print',
+    toast: 'Message',
+    calculate: 'Calculate',
+    import: 'Import',
+    export: 'Export',
+    addBtnGroupName:'Create a new button group',
+    addBtnName: "Create a new button group",
+  },
+  formGroup: {
+    title: 'Form Group Management',
+    fGName: 'Dynamic Group Name',
+    fGNamePlaceholder: 'Please enter dynamic group name',
+    mainTable: 'Main Table Name',
+    mainTablePlaceholder: 'Please enter form group main table name',
+    search: 'Search',
+    reset: 'Reset',
+    add: 'Add',
+    edit: 'Edit',
+    delete: 'Delete',
+    process: 'Process',
+    id: 'ID',
+    remark: 'Remark',
+    formKeys: 'Bound Forms in Current Form Group',
+    operation: 'Operation',
+    setLayout: 'Set Layout',
+    dialogTitle: {
+      add: 'Add Form Group',
+      edit: 'Edit Form Group',
+      layout: 'Layout'
+    },
+    form: {
+      groupName: 'Group Name',
+      groupDesc: 'Group Description',
+      mainForm: 'Main Form',
+      mainFormPlaceholder: 'Please select main form',
+      formPrimaryKey: 'Form Primary Key',
+      formPrimaryKeyPlaceholder: 'Please select form primary key',
+      isShow: 'Is Show',
+      subFormData: 'Sub Form Data',
+      subForm: 'Sub Form',
+      subFormKey: 'Sub Form Key',
+      dependMainFormKey: 'Dependent Main Form Key',
+      isDisplay: 'Is Display',
+      queryCondition: 'Query Condition',
+      insertCondition: 'Insert Condition',
+      editCondition: 'Edit Condition',
+      add: 'Add',
+      cancel: 'Cancel',
+      confirm: 'Confirm'
+    },
+    condition: {
+      title: {
+        query: 'Query Condition Edit',
+        insert: 'Insert Condition Edit'
+      },
+      fieldName: 'Sub Form Key',
+      fieldNamePlaceholder: 'Please select sub form key',
+      type: 'Type',
+      typePlaceholder: 'Please select type',
+      dependForm: 'Dependent Form',
+      dependFormPlaceholder: 'Please select dependent form',
+      dependField: 'Dependent Field',
+      dependFieldPlaceholder: 'Please select dependent field',
+      defaultValue: 'Default Value',
+      defaultValuePlaceholder: 'Please enter default value',
+      addCondition: 'Add Condition',
+      customValue: 'Custom Value',
+      dependValue: 'Dependent Value'
+    },
+    message: {
+      deleteConfirm: 'Are you sure to delete form group with ID "{0}"?',
+      deleteSuccess: 'Delete successfully',
+      addSuccess: 'Add successfully',
+      editSuccess: 'Edit successfully',
+      networkError: 'Network error, please try again later'
+    }
+  },
+  system:{
+    role: {
+      title: 'Role Management',
+      roleName: 'Role Name',
+      roleKey: 'Permission Character',
+      roleSort: 'Role Order',
+      status: 'Status',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      pleaseEnterRoleName: 'Please enter role name',
+      pleaseEnterRoleKey: 'Please enter permission character',
+      pleaseSelectStatus: 'Please select role status',
+      startDate: 'Start Date',
+      endDate: 'End Date',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      modify: 'Modify',
+      delete: 'Delete',
+      export: 'Export',
+      process: 'Process',
+      more: 'More',
+      dataPermission: 'Data Permission',
+      assignUser: 'Assign User',
+      roleId: 'Role ID',
+      displayOrder: 'Display Order',
+      menuPermission: 'Menu Permission',
+      expandCollapse: 'Expand/Collapse',
+      selectAll: 'Select All/None',
+      parentChildLink: 'Parent-Child Link',
+      loading: 'Loading, please wait',
+      remark: 'Remark',
+      pleaseEnterContent: 'Please enter content',
+      permissionScope: 'Permission Scope',
+      allData: 'All Data Permission',
+      customData: 'Custom Data Permission',
+      deptData: 'Department Data Permission',
+      deptAndBelow: 'Department and Below Data Permission',
+      personalData: 'Personal Data Permission',
+      confirm: 'Confirm',
+      cancel: 'Cancel',
+      exportSelect: 'Export select',
+      messages: {
+        enableConfirm: 'Are you sure to enable role "{0}"?',
+        disableConfirm: 'Are you sure to disable role "{0}"?',
+        enableSuccess: 'Enable successful',
+        disableSuccess: 'Disable successful',
+        modifySuccess: 'Modify successful',
+        addSuccess: 'Add successful',
+        deleteConfirm: 'Are you sure to delete role with ID "{0}"?',
+        deleteSuccess: 'Delete successful'
+      },
+      rules: {
+        roleName: 'Role name cannot be empty',
+        roleKey: 'Permission character cannot be empty',
+        roleSort: 'Role order cannot be empty'
+      },
+      titles: {
+        addRole: 'Add Role',
+        modifyRole: 'Modify Role',
+        dataPermission: 'Assign Data Permission',
+        selectUser: 'Select User'
+      },
+      tooltip: {
+        roleKey: 'Permission character defined in controller, e.g.: @PreAuthorize(@ss.hasRole("admin"))'
+      },
+      dataScope: {
+        title: 'Assign Data Permission',
+        allData: 'All Data Permission',
+        customData: 'Custom Data Permission',
+        deptData: 'Department Data Permission',
+        deptAndBelow: 'Department and Below Data Permission',
+        personalData: 'Personal Data Permission'
+      },
+      authUser: {
+        title: 'Assign User',
+        userName: 'User Name',
+        nickName: 'Nick Name',
+        email: 'Email',
+        phone: 'Phone',
+        status: 'Status',
+        createTime: 'Create Time',
+        operation: 'Operation',
+        pleaseEnterUserName: 'Please enter user name',
+        pleaseEnterPhone: 'Please enter phone number',
+        addUser: 'Add User',
+        batchCancelAuth: 'Batch Cancel Authorization',
+        close: 'Close',
+        cancelAuth: 'Cancel Authorization',
+        messages: {
+          cancelAuthConfirm: 'Are you sure to cancel the role for user "{0}"?',
+          cancelAuthSuccess: 'Authorization cancelled successfully',
+          batchCancelAuthConfirm: 'Are you sure to cancel authorization for selected users?'
+        }
+      }
+    },
+    menu: {
+      title: 'Menu Management',
+      menuName: 'Menu Name',
+      status: 'Status',
+      menuStatus: 'Menu Status',
+      search: 'Search',
+      reset: 'Reset',
+      addMenu: 'Add Menu',
+      expandCollapse: 'Expand/Collapse',
+      icon: 'Icon',
+      orderNum: 'Order',
+      perms: 'Permission',
+      component: 'Component Path',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      process: 'Process',
+      modify: 'Modify',
+      delete: 'Delete',
+      parentMenu: 'Parent Menu',
+      selectParentMenu: 'Select Parent Menu',
+      menuType: 'Menu Type',
+      directory: 'Directory',
+      menu: 'Menu',
+      button: 'Button',
+      menuIcon: 'Menu Icon',
+      clickSelectIcon: 'Click to select icon',
+      displayOrder: 'Display Order',
+      isFrame: 'Is External Link',
+      yes: 'Yes',
+      no: 'No',
+      routeAddress: 'Route Address',
+      pleaseEnterRouteAddress: 'Please enter route address',
+      pleaseEnterComponentPath: 'Please enter component path',
+      pleaseEnterPermissionChar: 'Please enter permission character',
+      routeParam: 'Route Parameter',
+      pleaseEnterRouteParam: 'Please enter route parameter',
+      isCache: 'Is Cache',
+      cache: 'Cache',
+      noCache: 'No Cache',
+      visible: 'Visible',
+      menuStatus: 'Menu Status',
+      enterTheName: 'Please enter the name of the icon',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the menu "{0}"?',
+        deleteSuccess: 'Delete Success'
+      },
+      rules: {
+        menuName: 'Menu name cannot be empty',
+        orderNum: 'Menu order cannot be empty',
+        path: 'Route address cannot be empty'
+      },
+      tooltips: {
+        isFrame: 'If selected as external link, the route address must start with http(s)://',
+        path: 'Access route address, such as: user, if external address needs internal link access, start with `http(s)://`',
+        component: 'Access component path, such as: system/user/index, default under views directory',
+        perms: 'Permission character defined in controller, such as: //@PreAuthorize(@ss.hasPermi(\'system:user:list\'))',
+        query: 'Default parameters passed to route, such as: {"id": 1, "name": "ry"}',
+        isCache: 'If selected, it will be cached by keep-alive, need to match component name and address',
+        visible: 'If hidden, the route will not appear in the sidebar, but can still be accessed',
+        status: 'If disabled, the route will not appear in the sidebar and cannot be accessed'
+      }
+    },
+    dept: {
+      title: 'Department Management',
+      deptName: 'Department Name',
+      status: 'Status',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      expandCollapse: 'Expand/Collapse',
+      orderNum: 'Order',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      process: 'Process',
+      modify: 'Modify',
+      delete: 'Delete',
+      parentDept: 'Parent Department',
+      selectParentDept: 'Select Parent Department',
+      displayOrder: 'Display Order',
+      leader: 'Leader',
+      phone: 'Phone',
+      email: 'Email',
+      deptStatus: 'Department Status',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the data item named "{0}"?',
+        deleteSuccess: 'Delete Success',
+        hasChildren: 'The current department has sub-departments and cannot be deleted! Please delete the sub-departments first'
+      },
+      rules: {
+        deptName: 'Department name cannot be empty',
+        orderNum: 'Display order cannot be empty',
+        email: 'Please enter a valid email address',
+        phone: 'Please enter a valid phone number'
+      }
+    },
+    post: {
+      title: 'Post Management',
+      postCode: 'Post Code',
+      postName: 'Post Name',
+      status: 'Status',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      modify: 'Modify',
+      delete: 'Delete',
+      export: 'Export',
+      process: 'Process',
+      postSort: 'Post Sort',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      displayOrder: 'Display Order',
+      postStatus: 'Post Status',
+      remark: 'Remark',
+      pleaseEnterContent: 'Please enter content',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the post with ID "{0}"?',
+        deleteSuccess: 'Delete Success'
+      },
+      rules: {
+        postName: 'Post name cannot be empty',
+        postCode: 'Post code cannot be empty',
+        postSort: 'Post sort cannot be empty'
+      }
+    },
+    dict: {
+      title: 'Dictionary Management',
+      dictName: 'Dictionary Name',
+      dictType: 'Dictionary Type',
+      status: 'Status',
+      dictStatus: 'Dictionary Status',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      modify: 'Modify',
+      delete: 'Delete',
+      export: 'Export',
+      process: 'Process',
+      refreshCache: 'Refresh Cache',
+      dictId: 'Dictionary ID',
+      remark: 'Remark',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      startDate: 'Start Date',
+      endDate: 'End Date',
+      pleaseEnterDictName: 'Please enter dictionary name',
+      pleaseEnterDictType: 'Please enter dictionary type',
+      pleaseEnterContent: 'Please enter content',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the dictionary with ID "{0}"?',
+        deleteSuccess: 'Delete Success',
+        refreshSuccess: 'Refresh Success'
+      },
+      rules: {
+        dictName: 'Dictionary name cannot be empty',
+        dictType: 'Dictionary type cannot be empty'
+      },
+      titles: {
+        addDict: 'Add Dictionary Type',
+        modifyDict: 'Modify Dictionary Type'
+      },
+  
+    },
+    config: {
+      configId:'Parameter KeyId',
+      title: 'Parameter Configuration',
+      configName: 'Parameter Name',
+      configKey: 'Parameter Key',
+      configValue: 'Parameter Value',
+      configType: 'System Built-in',
+      remark: 'Remark',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      process: 'Process',
+      modify: 'Modify',
+      delete: 'Delete',
+      export: 'Export',
+      refreshCache: 'Refresh Cache',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      startDate: 'Start Date',
+      endDate: 'End Date',
+      pleaseEnterConfigName: 'Please enter parameter name',
+      pleaseEnterConfigKey: 'Please enter parameter key',
+      pleaseEnterConfigValue: 'Please enter parameter value',
+      pleaseEnterContent: 'Please enter content',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the parameter with ID "{0}"?',
+        deleteSuccess: 'Delete Success',
+        refreshSuccess: 'Refresh Success'
+      },
+      rules: {
+        configName: 'Parameter name cannot be empty',
+        configKey: 'Parameter key cannot be empty',
+        configValue: 'Parameter value cannot be empty'
+      },
+      titles: {
+        addConfig: 'Add Parameter',
+        modifyConfig: 'Modify Parameter'
+      }
+    },
+    notice: {
+      noticeId:'Notice KeyId',
+      title: 'Notice Management',
+      noticeTitle: 'Notice Title',
+      noticeType: 'Notice Type',
+      noticeContent: 'Content',
+      status: 'Status',
+      createBy: 'Creator',
+      createTime: 'Create Time',
+      operation: 'Operation',
+      process: 'Process',
+      modify: 'Modify',
+      delete: 'Delete',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      pleaseEnterNoticeTitle: 'Please enter notice title',
+      pleaseEnterCreateBy: 'Please enter operator',
+      pleaseSelectNoticeType: 'Please select notice type',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the notice with ID "{0}"?',
+        deleteSuccess: 'Delete Success'
+      },
+      rules: {
+        noticeTitle: 'Notice title cannot be empty',
+        noticeType: 'Notice type cannot be empty'
+      },
+      titles: {
+        addNotice: 'Add Notice',
+        modifyNotice: 'Modify Notice'
+      }
+    },
+    style: {
+      id: 'Id',
+      title: 'Style Management',
+      styleKey: 'Style Key',
+      styleName: 'Style Name',
+      styleType: 'Style Type',
+      styleCode: 'Style Code',
+      styleDescription: 'Style Description',
+      styleStatus: 'Style Status',
+      createById: 'Creator ID',
+      updateById: 'Updater ID',
+      operation: 'Operation',
+      process: 'Process',
+      modify: 'Modify',
+      delete: 'Delete',
+      export: 'Export',
+      search: 'Search',
+      reset: 'Reset',
+      add: 'Add',
+      pleaseEnterStyleKey: 'Please enter style key',
+      pleaseEnterStyleName: 'Please enter style name',
+      pleaseEnterStyleDescription: 'Please enter style description',
+      pleaseEnterCreateById: 'Please enter creator ID',
+      pleaseEnterUpdateById: 'Please enter updater ID',
+      pleaseSelectStyleType: 'Please select style type',
+      pleaseEnterContent: 'Please enter content',
+      messages: {
+        addSuccess: 'Add Success',
+        modifySuccess: 'Modify Success',
+        deleteConfirm: 'Are you sure to delete the style with ID "{0}"?',
+        deleteSuccess: 'Delete Success'
+      },
+      rules: {
+        styleName: 'Please enter style name',
+        styleType: 'Please select style type',
+        styleCode: 'Please enter style code',
+        styleDescription: 'Please enter style description'
+      },
+      titles: {
+        addStyle: 'Add Dynamic Style Template',
+        modifyStyle: 'Modify Dynamic Style Template'
+      }
+    }
+  }
+}

+ 30 - 0
zkqy-ui/src/lang/index.js

@@ -0,0 +1,30 @@
+// index.js
+import Vue from 'vue'
+import VueI18n from 'vue-i18n'
+import Cookies from 'js-cookie'
+import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang
+import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang
+import enLocale from './en'
+import zhLocale from './zh'
+
+Vue.use(VueI18n)
+
+const messages = {
+  en_US: {
+    ...enLocale,
+    ...elementEnLocale
+  },
+  zh_CN: {
+    ...zhLocale,
+    ...elementZhLocale
+  }
+}
+
+const i18n = new VueI18n({
+  // 设置语言 选项 en | zh
+  locale: Cookies.get('language') || 'zh_CN',
+  // 设置文本内容
+  messages
+})
+
+export default i18n

+ 1428 - 0
zkqy-ui/src/lang/zh.js

@@ -0,0 +1,1428 @@
+export default {
+  login: {
+    title: '工业应用引擎',
+    logIn: '登录',
+    username: '账号',
+    password: '密码',
+    code: '验证码',
+    rememberMe: '在这个设备上记住我',
+    pleaseEnterUsername: '请输入您的账号',
+    pleaseEnterPassword: '请输入您的密码',
+    pleaseEnterCode: '请输入验证码',
+    loginDescription: '登录并开始管理您的智能引擎账户',
+    smartManufacturing: '智能制造',
+    internetOfThings: '万物互联'
+  },
+  logout: {
+    alarm: '提示',
+    message: '确定注销并退出系统吗?',
+    confirm: '确定',
+    cancel: '取消'
+  },
+  user: {
+    center: '个人中心',
+    logout: '退出登录',
+    info: '个人信息',
+    name: '用户名称',
+    phone: '手机号码',
+    email: '用户邮箱',
+    dept: '所属部门',
+    role: '所属角色',
+    createDay: '创建日期',
+    profile: '基本资料',
+    nickname: '用户昵称',
+    sex: '性别',
+    man: '男',
+    woman: '女',
+    updatePassword: '修改密码',
+    oldPassword: '旧密码',
+    newPassword: '新密码',
+    confirmPassword: '确认密码',
+    languageSelect: '语言选择',
+    management: {
+      roleName: '角色名称',
+      pleaseEnterRoleName: '请输入角色名称',
+      tenantName: '租户名称',
+      pleaseEnterTenantName: '请输入租户名称',
+      permissionChar: '权限字符',
+      pleaseEnterPermissionChar: '请输入权限字符',
+      status: '状态',
+      roleStatus: '角色状态',
+      createTime: '创建时间',
+      startDate: '开始日期',
+      endDate: '结束日期',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      modify: '修改',
+      delete: '删除',
+      export: '导出',
+      process: '处理',
+      more: '更多',
+      dataPermission: '数据权限',
+      assignUser: '分配用户',
+      roleId: '角色编号',
+      displayOrder: '显示顺序',
+      menuPermission: '菜单权限',
+      expandCollapse: '展开/折叠',
+      selectAll: '全选/全不选',
+      parentChildLink: '父子联动',
+      loading: '加载中,请稍候',
+      remark: '备注',
+      pleaseEnterContent: '请输入内容',
+      permissionScope: '权限范围',
+      allData: '全部数据权限',
+      customData: '自定数据权限',
+      deptData: '本部门数据权限',
+      deptAndBelow: '本部门及以下数据权限',
+      personalData: '仅本人数据权限',
+      confirm: '确定',
+      cancel: '取消',
+      messages: {
+        enableConfirm: '确认要"启用""{0}"角色吗?',
+        disableConfirm: '确认要"停用""{0}"角色吗?',
+        enableSuccess: '启用成功',
+        disableSuccess: '停用成功',
+        modifySuccess: '修改成功',
+        addSuccess: '新增成功',
+        deleteConfirm: '是否确认删除角色编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功'
+      },
+      rules: {
+        roleName: '角色名称不能为空',
+        permissionChar: '权限字符不能为空',
+        roleSort: '角色顺序不能为空'
+      }
+    }
+  },
+  normal: {
+    pleaseEnter: '请输入',
+    pleaseEnterRight: '请输入正确的',
+    pleaseConfirm: '请确认',
+    blank: ' ',
+    notEmpty: '不能为空',
+    save: '保存',
+    close: '关闭',
+    search: '搜索',
+    reset: '重置',
+    insert: '新增',
+    delete: '删除',
+    export: '导出',
+    deleteSuccess: '删除成功',
+    operation: '操作',
+    process: '处理',
+    remark: '备注',
+    isConfirmDelete: '是否确认删除流程定义编号为',
+    pleaseSelectData: '请勾选流程数据条!',
+    confirm: '确 定',
+    cancel: '取 消',
+  },
+  dataModeling: {
+    tableName: '表名称',
+    tableDescription: '表描述',
+    createTime: '创建时间',
+    dataTableName: '数据表名称',
+    dataTableField: '数据表字段',
+    No: '序号',
+    fieldName: '字段名称',
+    fieldType: '字段类型',
+    length: '长度',
+    notNull: '不是null',
+    primaryKey: '主键',
+    SelfIncrement: '自增',
+    fieldDescription: '字段描述',
+    add: '添加',
+    table: '表?',
+    addField: '新增字段'
+  },
+  search: '搜索',
+  reset: '重置',
+  operation: '操作',
+  delete: '删除',
+  deleteSuccess: '删除成功',
+  insert: '新增',
+  update: '修改',
+  pleaseEnter: '请输入',
+  process: '处理',
+  isConfirmDelete: '是否确认删除',
+  rules: {
+    passwordLimit: '长度在 6 到 20 个字符',
+    formGroup: {
+      groupName: '组名称',
+      groupDesc: '组描述',
+      mainForm: '主表表单',
+      formPrimaryKey: '表单主键'
+    }
+  },
+  page: {
+    index: '首页'
+  },
+  statistics: {
+    workflowStatistics: '流程统计',
+    processFlow: '工艺流',
+    approvalFlow: '审批流',
+    operationLog: '操作日志',
+    operator: '操作人',
+    userLoginStatistics: '用户登录统计',
+    client: '客户端',
+    toolEnd: '工具端',
+    dataModelingStatistics: '数据建模统计',
+    tableStatistics: '表格统计',
+    form: '表单',
+    table: '表格',
+    threeLevelLinkage: '三级联动',
+    formGroup: '表单组',
+    multiTableQuantity: '多表数量',
+    dataModeling: '数据建模'
+  },
+  tagsView: {
+    refresh: '刷新',
+    close: '关闭',
+    closeCurrent: '关闭当前',
+    closeOthers: '关闭其它',
+    closeAll: '关闭所有',
+    closeLeft: '关闭左侧',
+    closeRight: '关闭右侧'
+  },
+  settings: {
+    loading: '正在加载系统资源,请耐心等待',
+    downloadedLoading: '正在下载数据,请稍候',
+    title: '系统布局配置',
+    theme: '主题色',
+    tagsView: '开启 Tags-View',
+    fixedHeader: '固定 Header',
+    sidebarLogo: '侧边栏 Logo'
+  },
+  bpmprocess: {
+    remark: '备注',
+    processName: '流程名称',
+    processKey: '流程别名',
+    processType: '流程类型',
+    pleaseEnterProcessName: '请输入流程名称',
+    pleaseEnterProcessKey: '请输入流程别名',
+    productionProcess: '生产流程',
+    approvalProcess: '审批流程',
+    primaryKey: '主键',
+    startEventType: '启动事件类型',
+    versionNote: '版本注释',
+    versionStatus: '版本状态',
+    versionStatusDialog: '版本状态',
+    exportAll: '导出所有',
+    exportProcessFile: '导出流程文件',
+    backupFlowChart: '备份流程图',
+    designFlowChart: '设计流程图',
+    enable: '启用',
+    enableSuccess: '启用成功'
+  },
+  dragform: {
+    formName: '表单名称',
+    formNamePlaceholder: '请输入表单名称',
+    formAlias: '表单别名',
+    formAliasPlaceholder: '请输入表单别名',
+    dataSourceName: '数据源名称',
+    dataSourceNamePlaceholder: '请输入数据源名称',
+    boundTableName: '绑定表名称',
+    boundTableNamePlaceholder: '请输入绑定表名称',
+    formDescription: '表单描述',
+    formDescriptionPlaceholder: '请输入表单描述',
+    formVueTemplate: '表单vue模版',
+    formHtmlTemplate: '表单html模版',
+    formSql: '表单sql',
+    nodeId: '节点ID',
+    nodeIdPlaceholder: '请输入节点ID',
+    logicalDelete: '逻辑删除',
+    logicalDeletePlaceholder: '请输入逻辑删除',
+    spareColumn: '备用列',
+    spareColumnPlaceholder: '请输入备用列',
+    search: '搜索',
+    reset: '重置',
+    add: '新增',
+    edit: '修改',
+    delete: '删除',
+    export: '导出',
+    process: '处理',
+    confirm: '确定',
+    cancel: '取消',
+    confirmDelete: '是否确认删除动态单编号为',
+    deleteSuccess: '删除成功',
+    addSuccess: '新增成功',
+    editSuccess: '修改成功',
+    formPrimaryKey: '表单主键',
+    formVueTemplatePlaceholder: '请输入内容',
+    formHtmlTemplatePlaceholder: '请输入内容',
+    formSqlPlaceholder: '请输入表单sql',
+    tableName: '表格名称',
+    tablePrimaryKey: '表单主键',
+    tableAlias: '表格别名',
+    tableNumber: 'table编号',
+    sqlNumber: 'sql编号',
+    tableDescription: '表格描述',
+    timeFormat: '时间格式',
+    equalJoin: '等值连接',
+    leftJoin: '左连接',
+    rightJoin: '右连接',
+    customDependency: '自定义依赖值',
+    dependencyOtherField: '依赖其他字段',
+  },
+  relateTable: {
+    tableGroupName: '表格组名',
+    tablePrimaryKey: '表格主键',
+    description: '描述',
+    tableCount: '表格数',
+    memberTables: '成员表格',
+    operation: '操作',
+    process: '处理',
+    modify: '修改',
+    delete: '删除',
+    add: '新增',
+    search: '搜索',
+    reset: '重置',
+    addDynamicTableGroup: '新增动态表格组',
+    updateDynamicTableGroup: '修改动态表格组',
+    menuName: '菜单名称',
+    menuDescription: '菜单描述',
+    menuRoute: '菜单路由',
+    tableTitle: '表格标题',
+    tableName: '表格名称',
+    addRelateTable: '添加关联表格',
+    updateRelateTable: '修改关联表格',
+    timeFormat: '时间格式',
+    sortDependency: '排序依赖字段',
+    sortMethod: '排序方式',
+    ascending: '升序',
+    descending: '降序',
+    displayField: '展示字段',
+    serialNumber: '序号',
+    dataField: '数据字段',
+    fieldDescription: '字段描述',
+    relateTable: '关联表',
+    relateConditionField: '关联条件字段',
+    relateMethod: '关联方式',
+    isShow: '是否显示',
+    isSearch: '是否包含查询',
+    cancel: '取消',
+    confirm: '确认',
+    searchDependency: '包含查询依赖值',
+    selectDependencyMethod: '请选择依赖方式',
+    enterDependencyValue: '请输入依赖值',
+    selectDependencyField: '请选择依赖字段',
+    pleaseSelectSearchField: '请至少选择一个包含查询字段',
+    pleaseCompleteForm: '请完善表单信息',
+    pleaseAddMultipleTables: '请添加多个表格',
+    createSuccess: '创建成功',
+    createFailed: '创建失败',
+    updateSuccess: '修改成功',
+    updateFailed: '修改失败',
+    deleteSuccess: '删除成功',
+    deleteFailed: '删除失败',
+    enterTableGroupName: '请输入表格组名',
+    enterMenuName: '请输入菜单名称',
+    enterMenuDescription: '请输入菜单描述',
+    selectParentRoute: '请选择父级路由',
+    selectTableName: '请选择表格名称',
+    selectTablePrimaryKey: '请选择表格主键',
+    selectTimeFormat: '请选择时间格式',
+    selectSortDependency: '请选择排序依赖',
+    selectRelateTable: '请选择关联的表',
+    selectRelateField: '关联字段',
+    selectRelateMethod: '请选择关联方式',
+    customDependency: '自定义依赖值',
+    dependencyOtherField: '依赖其他字段',
+    pleaseEnterTableTitle: '请输入表格标题',
+    pleaseSelectTableName: '请选择表格名称',
+    pleaseSelectRelateField: '请选择关联字段',
+    pleaseEnterTableGroupName: '请输入表格组名',
+    pleaseEnterTableDescription: '请输入表格描述',
+    pleaseSelectRoute: '请选择路由',
+    equalJoin: '等值连接',
+    leftJoin: '左连接',
+    rightJoin: '右连接'
+  },
+  tenant: {
+    tenantName: '租户名称',
+    tenantCode: '租户编号',
+    owner: '负责人',
+    contactInfo: '联系方式',
+    address: '地址',
+    tenantId: '租户ID',
+    tenantParentId: '租户父级ID',
+    tenantClientLoginUrl: '客户端访问地址',
+    tenantToolLoginUrl: '工具端访问地址',
+    tenantGrade: '租户等级',
+    tenantExpirationTime: '到期天数',
+    tenantProfession: '租户类型',
+    selectParentTenant: '选择上级租户',
+    pleaseEnterTenantName: '请输入租户名称',
+    pleaseEnterTenantCode: '请输入租户编号',
+    pleaseEnterOwner: '请输入负责人',
+    pleaseEnterSelect: '请选择',
+    pleaseEnterContactInfo: '请输入联系方式',
+    pleaseEnterAddress: '请输入地址',
+    pleaseSelectTenantProfession: '请选择租户类型',
+    pleaseEnterTenantClientLoginUrl: '请输入客户端访问地址',
+    pleaseEnterTenantToolLoginUrl: '请输入工具端访问地址',
+    pleaseEnterTenantGrade: '请输入租户等级',
+    bindDatasource: '绑定数据源',
+    activateTenant: '激活租户',
+    configLoginPage: '配置登录页',
+    publicNetwork: '公网',
+    privateNetwork: '内网',
+    datasourceType: '数据源类型',
+    databaseName: '数据库名称',
+    tenantAccount: '租户管理员账号',
+    databaseIp: '数据库IP',
+    username: '用户名',
+    password: '密码',
+    portNumber: '端口号',
+    pleaseEnterDatabaseName: '请输入数据库名称',
+    pleaseEnterTenantAccount: '请输入租户管理员账号',
+    pleaseEnterDatabaseIp: '请输入数据库IP',
+    pleaseEnterUsername: '请输入用户名',
+    pleaseEnterPassword: '请输入密码',
+    pleaseEnterPortNumber: '请输入端口号',
+    binding: '绑定中',
+    pleaseEnterActivationCode: '请输入激活码',
+    loginUrlTip: '请在登录时的url后拼接参数:tenantId={编号}',
+    number: '编号',
+    pleaseEnterLoginPageNumber: '请输入登录页面编号',
+    title: '标题',
+    pleaseEnterLoginPageTitle: '请输入登录页面标题',
+    description: '描述',
+    descriptionTip: '推荐长度为8个汉字,可使用<br/>换行',
+    pleaseEnterContent: '请输入内容',
+    windowTitle: '窗口标题',
+    pleaseEnterWindowTitle: '请输入窗口标题',
+    logoTip: '推荐图片大小为194*64px',
+    logo: 'logo',
+    backgroundImageTip: '推荐图片大小为1400*900px',
+    backgroundImage: '背景图',
+    activationCode: {
+      tenantInfo: '租户信息',
+      rechargeTime: '充值时间',
+      pleaseSelectTenant: '请选择租户',
+      pleaseEnterRechargeDays: '请输入充值天数',
+      generateCode: '生成激活码',
+      cancel: '取 消',
+      generateSuccess: '激活码生成成功',
+      oneClickCopy: '一键复制',
+      loginAddress: '登录地址',
+      pleaseEnterLoginAddress: '请输入登录地址',
+      operator: '操作人员',
+      pleaseEnterOperator: '请输入操作人员',
+      operationTime: '操作时间',
+      startDate: '开始日期',
+      endDate: '结束日期',
+      search: '搜索',
+      reset: '重置',
+      logId: '日志编号',
+      operationIp: '操作ip地址',
+      operationDate: '操作日期',
+      remark: '备注',
+      messages: {
+        copySuccess: '文本已成功复制到剪贴板',
+        copyFailed: '复制失败',
+        tenantNotSelected: '未选择租户信息',
+        expirationDateNotSet: '租户到期时间未设置'
+      }
+    },
+    messages: {
+      addSuccess: '新增成功',
+      modifySuccess: '修改成功',
+      deleteConfirm: '是否确认删除租户信息编号为"{0}"的数据项?',
+      deleteSuccess: '删除成功',
+      bindingSuccess: '绑定成功',
+      activationSuccess: '激活成功',
+      activationFailed: '激活失败',
+      networkError: '网络异常,请稍后再试',
+      cannotSelectSelf: '不能选择自己作为上级租户',
+      databaseNameExists: '数据库名已存在',
+      databaseNameCheckFailed: '数据库名校验失败,请重新输入',
+      tenantAccountExists: '租户管理员账号已存在',
+      tenantAccountCheckFailed: '租户管理员账号校验失败,请重新输入',
+      databaseNameFormat: '只能包含小写字母和数字,且以小写字母开头',
+      databaseNameDuplicate: '数据库名重复'
+    },
+    rules: {
+      tenantName: '租户名称不能为空',
+      tenantCode: '租户编号不能为空',
+      tenantParentId: '请选择上级租户',
+      databaseType: '数据源类型不能为空',
+      databaseName: '数据库名不能为空',
+      tenantAccount: '租户管理员账号不能为空',
+      databaseIp: '数据库IP不能为空',
+      username: '用户名不能为空',
+      password: '密码不能为空',
+      portNumber: '端口号不能为空',
+      activationCode: '请输入租户激活码'
+    },
+    titles: {
+      addTenant: '添加租户信息',
+      modifyTenant: '修改租户信息',
+      configureDatabase: '配置数据库',
+      activateTenant: '激活租户',
+      configureClient: '配置客户端',
+      configureTool: '配置工具端'
+    }
+  },
+  script: {
+    scriptKey: '脚本编码',
+    scriptName: '脚本名称',
+    scriptType: '脚本类型',
+    industryType: '行业类型',
+    scriptState: '脚本状态',
+    componentState: '组件状态',
+    scriptDescription: '脚本描述',
+    tableName: '数据表',
+    examineState: '审核状态',
+    pass: '通过',
+    notPass: '不通过',
+    downloadScript: '下载脚本',
+    downloadNodeTemplate: '下载节点模版',
+    uploadScriptFile: '上传脚本文件',
+    uploadComponentPage: '上传组件页面',
+    examine: '审核',
+    pleaseEnterScriptKey: '请输入脚本编码',
+    pleaseEnterScriptName: '请输入脚本名称',
+    pleaseSelectScriptType: '请选择脚本类型',
+    pleaseSelectExamineState: '请选择审核状态',
+    pleaseSelectIndustryType: '请选择行业类型',
+    pleaseSelectTenant: '请选择租户',
+    pleaseSelectTable: '请选择数据表',
+    pleaseEnterScriptDescription: '请输入脚本描述',
+    uploadTip: '将文件拖到此处,或点击上传',
+    downloadSuccessful: '下载成功!',
+    responseDataNotValidFileFormat:'响应数据不是有效的文件格式:',
+    messages: {
+      copySuccess: '脚本编码已成功复制到剪贴板',
+      copyError: '脚本编码复制失败',
+      uploadSuccess: '文件上传成功',
+      deleteConfirm: '是否确认删除流程节点脚本编号为"',
+      deleteSuccess: '删除成功',
+      closeEditorConfirm: '即将关闭编辑器,是否保存代码?',
+      downloadError: '下载失败,请检查接口返回的数据格式!',
+      downloadRetry: '下载失败,请稍后再试!',
+      addSuccess: '新增成功',
+      updateSuccess: '修改成功',
+      dataItem: '的数据项?'
+    },
+    rules: {
+      scriptName: '请输入脚本名称',
+      scriptType: '请选择脚本类型',
+      industryType: '请选择行业类型',
+      scriptState: '请选择审核状态'
+    },
+    titles: {
+      addScript: '添加流程节点脚本',
+      updateScript: '修改流程节点脚本',
+      examineScript: '审核节点信息',
+      uploadComponent: '节点组件上传',
+      uploadTenant: '租户脚本上传'
+    },
+    comments: {
+      submitUpload: '提交上传文件',
+      editorInit: '编辑器初始化',
+      copySuccess: '复制成功',
+      copyError: '复制失败',
+      queryList: '查询流程节点脚本列表',
+      cancel: '取消按钮',
+      reset: '表单重置',
+      search: '搜索按钮操作',
+      resetQuery: '重置按钮操作',
+      selectionChange: '多选框选中数据',
+      downloadTemplate: '下载节点模版',
+      add: '新增按钮操作',
+      update: '修改按钮操作',
+      examine: '审核',
+      submit: '提交按钮',
+      delete: '删除按钮操作',
+      export: '导出按钮操作',
+      getDictLabel: '获取字典对应label',
+      drawerOpen: '抽屉打开回调',
+      drawerClose: '抽屉关闭前回调'
+    }
+  },
+  engineering: {
+    title: '工程管理',
+    engineeringName: '工程名称',
+    downloadTime: '下载时间',
+    download: '工程下载',
+    downloadSuccess: '下载成功',
+    downloadError: '下载失败',
+    confirmDelete: '是否确认删除工程编号为',
+    deleteSuccess: '删除成功',
+    add: '新增工程',
+    edit: '修改工程',
+    downloadNumber: '下载次数',
+    updateTime: '更新时间',
+    delFlag: '是否删除',
+    pleaseEnterEngineeringName: '请输入工程名称',
+    pleaseEnterDownloadNumber: '请输入下载次数',
+    pleaseSelectDownloadTime: '请选择下载时间',
+    pleaseEnterUpdateTime: '请输入更新时间',
+    pleaseEnterDelFlag: '请输入是否删除'
+  },
+  navigationBar: {
+    title: '导航条管理',
+    name: '导航条名称',
+    pageName: '页面名称',
+    barOrder: '导航条顺序',
+    pageId: '绑定页面',
+    add: '新增导航条',
+    edit: '修改导航条',
+    export: '导出',
+    process: '处理',
+    modify: '修改',
+    delete: '删除',
+    confirmDelete: '是否确认删除编号为',
+    deleteSuccess: '删除成功',
+    deleteFailed: '删除失败',
+    addSuccess: '新增成功',
+    editSuccess: '修改成功',
+    pleaseEnterName: '请输入导航条名称',
+    pleaseEnterPageName: '请输入页面名称',
+    pleaseSelectPage: '请选择绑定页面',
+    pleaseEnterBarOrder: '请输入导航条顺序',
+    barOrderMustGreaterThanZero: '导航条顺序必须大于 0',
+    nameRequired: '导航条名称不能为空',
+    pageIdRequired: '绑定页面不能为空',
+    barOrderRequired: '导航条顺序不能为空',
+    pleaseSelectRecord: '请先选择要删除的记录'
+  },
+  formCreate: {
+    pageKey: '页面主键',
+    pageName: '页面名称',
+    pageJson: 'PageJson参数',
+    htmlTemplate: '页面Html模板',
+    pageOptions: '页面选项',
+    boundTable: '绑定表名',
+    operation: '操作',
+    process: '处理',
+    modify: '修改',
+    delete: '删除',
+    add: '新增',
+    pleaseSelectDelete: '请先选择要删除的记录',
+    confirmDelete: '是否确认删除编号为',
+    pleaseEnterPageName: '请输入页面名称'
+  },
+  treeTable: {
+    treeTableKey: '树形表主键',
+    treeTableName: '树形表名',
+    treeTableDesc: '树形表格别名',
+    treeTableDgl: '树形递归列',
+    treeTableCondition: '树形条件',
+    boundTableId: '绑定表id',
+    operation: '操作',
+    process: '处理',
+    modify: '修改',
+    delete: '删除',
+    add: '新增',
+    pleaseSelectDelete: '请先选择要删除的记录',
+    confirmDelete: '是否确认删除编号为',
+    deleteMenuTip: '删除后菜单中相关数据也将删除',
+    enterTreeTableName: '请输入树形表名',
+    enterTreeTableDesc: '请输入树形表格别名',
+    treeMenuConfig: '树形菜单配置',
+    tableFieldConfig: '表格字段配置',
+    addTreeTableConfig: '新增树形表格配置',
+    editTreeTableConfig: '修改树形表格配置',
+    viewTreeTableConfig: '查看树形表格配置',
+    clear: '清空',
+    confirm: '确认',
+    waitTableLoading: '请等待表格加载完成',
+    completeFormConfig: '请完善表单配置信息',
+    completeTreeMenuConfig: '请完善树形菜单配置信息',
+    addSuccess: '新增成功',
+    editSuccess: '修改成功',
+    editFailed: '修改失败',
+    menuDeletedTip: '该表格菜单路由已经删除,请重新配置',
+    menuName: '菜单名称',
+    menuNamePlaceholder: '请输入菜单名称',
+    menuNameRequired: '菜单名称不能为空',
+    groupDescription: '菜单描述',
+    groupDescriptionPlaceholder: '请输入菜单描述',
+    menuRoute: '菜单路由',
+    menuRoutePlaceholder: '请选择菜单路由',
+    menuRouteRequired: '菜单路由不能为空',
+    treeName: '树形名称',
+    treeNamePlaceholder: '请输入表格名称',
+    treeNameRequired: '表格名称不能为空',
+    treeTable: '树形表格',
+    treeTablePlaceholder: '请选择关联表格',
+    treeTableRequired: '树形表格不能为空',
+    tablePrimaryKeyPlaceholder: '请选择表格主键',
+    tablePrimaryKeyRequired: '表格主键不能为空',
+    matchMode: '匹配模式',
+    matchModePlaceholder: '请选择匹配模式',
+    matchModeRequired: '匹配模式不能为空',
+    recursiveColumn: '递归列',
+    recursiveColumnPlaceholder: '请选择表格递归列',
+    recursiveColumnRequired: '递归列不能为空',
+    displayColumn: '展示列',
+    displayColumnPlaceholder: '请选择表格展示列',
+    displayColumnRequired: '展示列不能为空',
+    matchByValue: '根据value关联',
+    matchByLabel: '根据label关联',
+    relatedTable: '关联表格',
+    relatedTablePlaceholder: '请选择关联表格',
+    relatedTableRequired: '关联表格不能为空',
+    relatedField: '关联字段',
+    relatedFieldPlaceholder: '请选择表格关联字段',
+    relatedFieldRequired: '关联字段不能为空',
+    tablePrimaryKey: '表格主键',
+    tableName: '表格名称',
+    tableAlias: '表格别名',
+    tableNumber: 'table编号',
+    sqlNumber: 'sql编号',
+    boundTableName: '绑定表名称',
+    tableDescription: '表格描述',
+    timeFormat: '时间格式',
+    equalJoin: '等值连接',
+    leftJoin: '左连接',
+    rightJoin: '右连接',
+    customDependency: '自定义依赖值',
+    dependencyOtherField: '依赖其他字段',
+  },
+  tableList: {
+    tableName: '表格名称',
+    tableNamePlaceholder: '请输入表格名称',
+    boundTableName: '绑定表名称',
+    boundTableNamePlaceholder: '请输入绑定表名称',
+    tableAlias: '表格别名',
+    tableAliasPlaceholder: '请输入表格别名',
+    tableNumber: 'table编号',
+    tableNumberPlaceholder: '请输入table编号',
+    sqlNumber: 'sql编号',
+    sqlNumberPlaceholder: '请输入sql编号',
+    tableDescription: '表格描述',
+    tableDescriptionPlaceholder: '请输入表格描述',
+    columnTitle: '列字段标题名称',
+    columnTitlePlaceholder: '请输入内容',
+    timeFormat: '时间格式',
+    timeFormatPlaceholder: '请输入内容',
+    spareColumn: '备用列',
+    spareColumnPlaceholder: '请输入备用列',
+    logicalDelete: '逻辑删除',
+    logicalDeletePlaceholder: '请输入逻辑删除',
+    showCheckbox: '是否显示列表复选框',
+    showCheckboxPlaceholder: '请输入是否显示列表复选框(0:显示;1;不显示)',
+    tablePrimaryKey: '表格主键',
+    search: '搜索',
+    reset: '重置',
+    add: '新增',
+    edit: '修改',
+    delete: '删除',
+    export: '导出',
+    handle: '处理',
+    confirm: '确 定',
+    cancel: '取 消',
+    confirmDelete: '是否确认删除动态格编号为"{0}"的数据项?删除后菜单中相关数据也将删除!',
+    deleteSuccess: '删除成功',
+    addSuccess: '新增成功',
+    editSuccess: '修改成功'
+  },
+  tableMange: {
+    fieldEdit: '字段编辑',
+    selectTable: '请选择数据表',
+    tableComment: '表注释',
+    tableName: '表名',
+    serialNumber: '序号',
+    dataField: '数据字段',
+    fieldDescription: '字段描述',
+    relatedTable: '关联表',
+    relatedField: '关联字段',
+    relatedType: '关联方式',
+    isShow: '是否显示',
+    isSearch: '是否包含查询',
+    isExport: '是否导出',
+    menuEdit: '菜单编辑',
+    menuType: '菜单类型',
+    tableMenu: '表格菜单',
+    treeMenu: '树形菜单',
+    menuName: '菜单名称',
+    menuRoute: '菜单路由',
+    selectParentRoute: '请选择父级路由',
+    showList: '是否显示列表',
+    timeFormat: '时间格式',
+    tablePrimaryKey: '表格主键',
+    sortDependency: '排序依赖字段',
+    sortMethod: '排序方式',
+    ascending: '升序',
+    descending: '降序',
+    preview: '预览',
+    confirmModify: '确认修改',
+    confirmCreate: '确认创建',
+    dataStatistics: '数据统计',
+    addDataField: '添加数据字段',
+    statisticTitle: '统计标题',
+    statisticData: '统计数据',
+    statisticType: '统计类型',
+    selectStatisticField: '请选择统计字段',
+    selectStatisticType: '请选择统计类型',
+    cancel: '取消',
+    confirm: '确定',
+    modify: '修改',
+    delete: '删除',
+    styleEdit: '样式编辑',
+    dataFilter: '数据筛选',
+    classificationQuery: '联合查询',
+    effectPreview: '效果预览',
+    search: '搜索',
+    reset: '重置',
+    add: '新增',
+    edit: '修改',
+    import: '导入',
+    export: '导出',
+    operation: '操作',
+    pagination: '分页',
+    close: '关闭',
+    selectTableError: '请选择数据表',
+    fieldDescriptionErrorNotNull: '需要显示的字段描述不能为空',
+    relatedConditionError: '请补全关联条件',
+    searchFieldError: '请至少选择一个包含查询字段',
+    completeForm: '请完善表单',
+    modifySuccess: '修改成功',
+    createSuccess: '创建成功',
+    modifyFailed: '修改失败',
+    createFailed: '创建失败',
+    menuDeletedTip: '该表格菜单路由已经删除,请重新配置',
+    addSuccess: '新增成功',
+    editSuccess: '修改成功',
+    deleteSuccess: '删除成功',
+    deleteFailed: '删除失败',
+    selectMenuType: '请选择菜单类型',
+    pleaseEnterMenuName: '请输入菜单名称',
+    selectTimeFormat: '请选择时间格式',
+    selectTablePrimaryKey: '请选择表格主键',
+    fieldDescriptionError: '请输入字段描述',
+  },
+  dialog: {
+    addStatisticField: '添加统计数据字段',
+    equalJoin: '等值连接',
+    leftJoin: '左连接',
+    rightJoin: '右连接',
+    customDependency: '自定义依赖值',
+    dependOnOtherField: '依赖其他表字段'
+  },
+  classificationQuery: {
+    add: '添加',
+    conditionName: '条件名称',
+    conditionField: '条件字段',
+    conditionType: '条件类型',
+    defaultValue: '默认条件值',
+    renderOrder: '渲染顺序',
+    more: '更多',
+    delete: '删除',
+    settings: {
+      title: '设置条件',
+      displayType: '显示类型',
+      displaySize: '显示尺寸',
+      displayIcon: '显示图标',
+      conditionDescription: '条件描述',
+      dropdownSql: '下拉sql',
+      placeholder: {
+        selectField: '请选择条件字段',
+        selectIcon: '点击选择图标',
+        enterDescription: '描述例句(请输入姓名、请输入编号...)',
+        enterSql: '请输入当前下拉框数据来源sql语句,例如:SELECT custom_name AS `label`, custom_no AS `value`, id AS id FROM {DBNAME}.customer'
+      }
+    }
+  },
+  dataFilter: {
+    addCondition: '添加条件',
+    conditionField: '条件字段',
+    condition: '条件',
+    referenceValue: '参照值',
+    delete: '删除',
+    placeholder: {
+      selectField: '请选择条件字段'
+    }
+  },
+  styleForm: {
+    addStyle: '添加样式',
+    serialNumber: '序号',
+    styleName: '样式名',
+    description: '描述',
+    operation: '操作',
+    process: '处理',
+    modify: '修改',
+    delete: '删除',
+    editStyle: '编辑样式',
+    styleDescription: '样式描述',
+    styleType: '样式类型',
+    rowStyle: '行样式',
+    fieldStyle: '字段样式',
+    dictionaryStyle: '字典样式',
+    backgroundColor: '背景颜色',
+    styleField: '样式生效字段',
+    selectTable: '请选择表',
+    selectField: '请选择字段',
+    textStyle: '文本样式',
+    normalText: '普通文本',
+    tag: '标签',
+    fontColor: '字体颜色',
+    tagStyle: '标签样式',
+    backgroundFill: '背景填充',
+    textOnly: '仅文字',
+    tagType: '标签类型',
+    default: '默认',
+    success: '成功',
+    info: '普通',
+    warning: '警告',
+    danger: '危险',
+    dictionaryField: '字典生效字段',
+    dictionary: '字典',
+    conditionEdit: '条件编辑',
+    tableName: '表名',
+    fieldName: '字段名',
+    condition: '条件',
+    referenceValue: '参照值',
+    addCondition: '添加条件',
+    cancel: '取 消',
+    confirm: '确 定'
+  },
+  excuteBtn: {
+    search: '搜索',
+    reset: '重置',
+    add: '新增',
+    expandCollapse: '展开/折叠',
+    operationColumnBtn: '操作列按钮',
+    topBtn: '顶部按钮',
+    icon: '图标',
+    permission: '权限标识',
+    operation: '操作',
+    process: '处理',
+    modify: '修改',
+    addBtn: '新增',
+    addBtnGroup: '添加按钮组',
+    addButton: '新增按钮',
+    parentBtn: '上级按钮',
+    selectParentBtn: '选择上级按钮',
+    btnName: '按钮名',
+    btnIcon: '按钮图标',
+    clickSelectIcon: '点击选择图标',
+    btnStyle: '按钮样式',
+    sort: '排序',
+    permissionChar: '权限字符',
+    btnType: '按钮类型',
+    selectBtnType: '请选择按钮类型',
+    formType: '表单类型',
+    selectFormType: '请选择表单类型',
+    bindForm: '绑定表单',
+    selectForm: '请选择表单',
+    promptType: '提示类型',
+    selectPromptType: '请选择提示类型',
+    promptContent: '提示内容',
+    enterPromptContent: '请输入提示内容',
+    executeProcess: '执行流程',
+    selectProcess: '请选择执行流程',
+    bindTable: '绑定表格',
+    selectTable: '请选择表格',
+    bindScript: '绑定脚本',
+    selectScript: '请选择绑定节点',
+    jumpRoute: '跳转路由',
+    enterRoute: '请输入跳转的路由地址',
+    defaultModifyField: '默认修改字段',
+    queryParam: 'query参数',
+    serialNumber: '序号',
+    fieldName: '字段名',
+    defaultValue: '默认值',
+    addParam: '添加参数',
+    conditionParam: '条件参数',
+    addCondition: '添加条件',
+    btnHideCondition: '按钮隐藏条件',
+    symbol: '符号',
+    selectSymbol: '请选择',
+    referenceValue: '参考值',
+    enterDefaultValue: '请输入默认值',
+    confirm: '确 定',
+    cancel: '取 消',
+    pleaseBindTable: '请先将按钮组绑定给表格',
+    addSuccess: '添加成功',
+    networkError: '网络异常,请稍后添加',
+    updateSuccess: '修改成功',
+    updateError: '网络异常,请稍后修改',
+    confirmDelete: '是否确认删除名称为"{0}"的数据项?',
+    deleteSuccess: '删除成功',
+    networkErrorRetry: '网络异常请稍后再试',
+    unknownProcess: '未知流程',
+    primary: '主要',
+    success: '成功',
+    warning: '警告',
+    danger: '危险',
+    info: '信息',
+    text: '文本',
+    noNeedForm: '不需表单',
+    singleForm: '单独表单',
+    formGroup: '表单组',
+    calculateForm: '计算表单',
+    other: '其它',
+    directory: '目录',
+    outLink: '外链',
+    innerLink: '内链',
+    insert: '新增',
+    update: '修改',
+    delete: '删除',
+    execute: '执行脚本',
+    initiated: '发起流程',
+    print: '打印',
+    toast: '消息提示',
+    calculate: '计算合计',
+    import: '导入',
+    export: '导出',
+    addBtnGroupName:'新建按钮组',
+    addBtnName: "新建按钮组",
+  },
+  formGroup: {
+    title: '表单组管理',
+    fGName: '动态组名称',
+    fGNamePlaceholder: '请输入动态组名称',
+    mainTable: '主表名称',
+    mainTablePlaceholder: '请输入表单组主表名称',
+    search: '搜索',
+    reset: '重置',
+    add: '新增',
+    edit: '修改',
+    delete: '删除',
+    process: '处理',
+    id: '主键',
+    remark: '备注',
+    formKeys: '当前表单组中所绑定的表单',
+    operation: '操作',
+    setLayout: '设置布局',
+    dialogTitle: {
+      add: '新增表单组',
+      edit: '修改表单组',
+      layout: '布局'
+    },
+    form: {
+      groupName: '组名称',
+      groupDesc: '组描述',
+      mainForm: '主表单',
+      mainFormPlaceholder: '请选择主表单',
+      formPrimaryKey: '表单主键',
+      formPrimaryKeyPlaceholder: '请选择表单主键',
+      isShow: '是否显示',
+      subFormData: '从表单数据',
+      subForm: '从表单',
+      subFormKey: '子表单键',
+      dependMainFormKey: '依赖的主表单键',
+      isDisplay: '是否展示',
+      queryCondition: '查询条件',
+      insertCondition: '插入条件',
+      editCondition: '编辑条件',
+      add: '新增',
+      cancel: '取消',
+      confirm: '确认'
+    },
+    condition: {
+      title: {
+        query: '查询条件编辑',
+        insert: '插入条件编辑'
+      },
+      fieldName: '子表单键',
+      fieldNamePlaceholder: '请选择子表单键',
+      type: '类型',
+      typePlaceholder: '请选择类型',
+      dependForm: '依赖表单',
+      dependFormPlaceholder: '请选择依赖表单',
+      dependField: '依赖字段',
+      dependFieldPlaceholder: '请选择依赖字段',
+      defaultValue: '默认值',
+      defaultValuePlaceholder: '请输入默认值',
+      addCondition: '新增条件',
+      customValue: '自定义值',
+      dependValue: '依赖值'
+    },
+    message: {
+      deleteConfirm: '是否确认删除动态表单组编号为"{0}"的数据项?',
+      deleteSuccess: '删除成功',
+      addSuccess: '新增成功',
+      editSuccess: '修改成功',
+      networkError: '网络异常,请稍后再试'
+    }
+  },
+  system:{
+    dept: {
+      title: '部门管理',
+      deptName: '部门名称',
+      status: '状态',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      expandCollapse: '展开/折叠',
+      orderNum: '排序',
+      createTime: '创建时间',
+      operation: '操作',
+      process: '处理',
+      modify: '修改',
+      delete: '删除',
+      parentDept: '上级部门',
+      selectParentDept: '选择上级部门',
+      displayOrder: '显示排序',
+      leader: '负责人',
+      phone: '联系电话',
+      email: '邮箱',
+      deptStatus: '部门状态',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除名称为"{0}"的数据项?',
+        deleteSuccess: '删除成功',
+        hasChildren: '当前部门存在子部门,不可删除!请先删除子部门'
+      },
+      rules: {
+        deptName: '部门名称不能为空',
+        orderNum: '显示排序不能为空',
+        email: '请输入正确的邮箱地址',
+        phone: '请输入正确的手机号码'
+      }
+    },
+    role: {
+      title: '角色管理',
+      roleName: '角色名称',
+      roleKey: '权限字符',
+      roleSort: '角色顺序',
+      status: '状态',
+      createTime: '创建时间',
+      operation: '操作',
+      pleaseEnterRoleName: '请输入角色名称',
+      pleaseEnterRoleKey: '请输入权限字符',
+      pleaseSelectStatus: '请选择角色状态',
+      startDate: '开始日期',
+      endDate: '结束日期',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      modify: '修改',
+      delete: '删除',
+      export: '导出',
+      process: '处理',
+      more: '更多',
+      dataPermission: '数据权限',
+      assignUser: '分配用户',
+      roleId: '角色编号',
+      displayOrder: '显示顺序',
+      menuPermission: '菜单权限',
+      expandCollapse: '展开/折叠',
+      selectAll: '全选/全不选',
+      parentChildLink: '父子联动',
+      loading: '加载中,请稍候',
+      remark: '备注',
+      pleaseEnterContent: '请输入内容',
+      permissionScope: '权限范围',
+      allData: '全部数据权限',
+      customData: '自定数据权限',
+      deptData: '本部门数据权限',
+      deptAndBelow: '本部门及以下数据权限',
+      personalData: '仅本人数据权限',
+      confirm: '确 定',
+      cancel: '取 消',
+      exportSelect: '导出已选',
+      messages: {
+        enableConfirm: '确认要"启用""{0}"角色吗?',
+        disableConfirm: '确认要"停用""{0}"角色吗?',
+        enableSuccess: '启用成功',
+        disableSuccess: '停用成功',
+        modifySuccess: '修改成功',
+        addSuccess: '新增成功',
+        deleteConfirm: '是否确认删除角色编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功'
+      },
+      rules: {
+        roleName: '角色名称不能为空',
+        roleKey: '权限字符不能为空',
+        roleSort: '角色顺序不能为空'
+      },
+      titles: {
+        addRole: '添加角色',
+        modifyRole: '修改角色',
+        dataPermission: '分配数据权限',
+        selectUser: '选择用户'
+      },
+      tooltip: {
+        roleKey: '控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole("admin")`)'
+      },
+      dataScope: {
+        title: '分配数据权限',
+        allData: '全部数据权限',
+        customData: '自定数据权限',
+        deptData: '本部门数据权限',
+        deptAndBelow: '本部门及以下数据权限',
+        personalData: '仅本人数据权限'
+      },
+      authUser: {
+        title: '分配用户',
+        userName: '用户名称',
+        nickName: '用户昵称',
+        email: '邮箱',
+        phone: '手机',
+        status: '状态',
+        createTime: '创建时间',
+        operation: '操作',
+        pleaseEnterUserName: '请输入用户名称',
+        pleaseEnterPhone: '请输入手机号码',
+        addUser: '添加用户',
+        batchCancelAuth: '批量取消授权',
+        close: '关闭',
+        cancelAuth: '取消授权',
+        messages: {
+          cancelAuthConfirm: '确认要取消该用户"{0}"角色吗?',
+          cancelAuthSuccess: '取消授权成功',
+          batchCancelAuthConfirm: '是否取消选中用户授权数据项?'
+        }
+      }
+    },
+    menu: {
+      title: '菜单管理',
+      menuName: '菜单名称',
+      status: '状态',
+      menuStatus: '菜单状态',
+      search: '搜索',
+      reset: '重置',
+      addMenu: '新增菜单',
+      expandCollapse: '展开/折叠',
+      icon: '图标',
+      orderNum: '排序',
+      perms: '权限标识',
+      component: '组件路径',
+      createTime: '创建时间',
+      operation: '操作',
+      process: '处理',
+      modify: '修改',
+      delete: '删除',
+      parentMenu: '上级菜单',
+      selectParentMenu: '选择上级菜单',
+      menuType: '菜单类型',
+      directory: '目录',
+      menu: '菜单',
+      button: '按钮',
+      menuIcon: '菜单图标',
+      clickSelectIcon: '点击选择图标',
+      displayOrder: '显示排序',
+      isFrame: '是否外链',
+      yes: '是',
+      no: '否',
+      routeAddress: '路由地址',
+      pleaseEnterRouteAddress: '请输入路由地址',
+      pleaseEnterComponentPath: '请输入组件路径',
+      pleaseEnterPermissionChar: '请输入权限标识',
+      routeParam: '路由参数',
+      pleaseEnterRouteParam: '请输入路由参数',
+      isCache: '是否缓存',
+      cache: '缓存',
+      noCache: '不缓存',
+      visible: '显示状态',
+      menuStatus: '菜单状态',
+      enterTheName: '请输入图标名称',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除名称为"{0}"的数据项?',
+        deleteSuccess: '删除成功'
+      },
+      rules: {
+        menuName: '菜单名称不能为空',
+        orderNum: '菜单顺序不能为空',
+        path: '路由地址不能为空'
+      },
+      tooltips: {
+        isFrame: '选择是外链则路由地址需要以`http(s)://`开头',
+        path: '访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头',
+        component: '访问的组件路径,如:`system/user/index`,默认在`views`目录下',
+        perms: '控制器中定义的权限字符,如://@PreAuthorize(`@ss.hasPermi(\'system:user:list\')`)',
+        query: '访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`',
+        isCache: '选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致',
+        visible: '选择隐藏则路由将不会出现在侧边栏,但仍然可以访问',
+        status: '选择停用则路由将不会出现在侧边栏,也不能被访问'
+      }
+    },
+    post: {
+      title: '岗位管理',
+      postCode: '岗位编码',
+      postName: '岗位名称',
+      status: '状态',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      modify: '修改',
+      delete: '删除',
+      export: '导出',
+      process: '处理',
+      postSort: '岗位排序',
+      createTime: '创建时间',
+      operation: '操作',
+      displayOrder: '显示排序',
+      postStatus: '岗位状态',
+      remark: '备注',
+      pleaseEnterContent: '请输入内容',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除岗位编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功'
+      },
+      rules: {
+        postName: '岗位名称不能为空',
+        postCode: '岗位编码不能为空',
+        postSort: '岗位顺序不能为空'
+      }
+    },
+    dict: {
+      title: '字典管理',
+      dictName: '字典名称',
+      dictType: '字典类型',
+      status: '状态',
+      dictStatus: '字典状态',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      modify: '修改',
+      delete: '删除',
+      export: '导出',
+      process: '处理',
+      refreshCache: '刷新缓存',
+      dictId: '字典编号',
+      remark: '备注',
+      createTime: '创建时间',
+      operation: '操作',
+      startDate: '开始日期',
+      endDate: '结束日期',
+      pleaseEnterDictName: '请输入字典名称',
+      pleaseEnterDictType: '请输入字典类型',
+      pleaseEnterContent: '请输入内容',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除字典编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功',
+        refreshSuccess: '刷新成功'
+      },
+      rules: {
+        dictName: '字典名称不能为空',
+        dictType: '字典类型不能为空'
+      },
+      titles: {
+        addDict: '添加字典类型',
+        modifyDict: '修改字典类型'
+      }
+    },
+    config: {
+      configId:'参数主键',
+      title: '参数配置',
+      configName: '参数名称',
+      configKey: '参数键名',
+      configValue: '参数键值',
+      configType: '系统内置',
+      remark: '备注',
+      createTime: '创建时间',
+      operation: '操作',
+      process: '处理',
+      modify: '修改',
+      delete: '删除',
+      export: '导出',
+      refreshCache: '刷新缓存',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      startDate: '开始日期',
+      endDate: '结束日期',
+      pleaseEnterConfigName: '请输入参数名称',
+      pleaseEnterConfigKey: '请输入参数键名',
+      pleaseEnterConfigValue: '请输入参数键值',
+      pleaseEnterContent: '请输入内容',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除参数编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功',
+        refreshSuccess: '刷新成功'
+      },
+      rules: {
+        configName: '参数名称不能为空',
+        configKey: '参数键名不能为空',
+        configValue: '参数键值不能为空'
+      },
+      titles: {
+        addConfig: '添加参数',
+        modifyConfig: '修改参数'
+      }
+    },
+    notice: {
+      noticeId:'公告Id',
+      title: '公告管理',
+      noticeTitle: '公告标题',
+      noticeType: '公告类型',
+      noticeContent: '内容',
+      status: '状态',
+      createBy: '创建者',
+      createTime: '创建时间',
+      operation: '操作',
+      process: '处理',
+      modify: '修改',
+      delete: '删除',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      pleaseEnterNoticeTitle: '请输入公告标题',
+      pleaseEnterCreateBy: '请输入操作人员',
+      pleaseSelectNoticeType: '请选择公告类型',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除公告编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功'
+      },
+      rules: {
+        noticeTitle: '公告标题不能为空',
+        noticeType: '公告类型不能为空'
+      },
+      titles: {
+        addNotice: '添加公告',
+        modifyNotice: '修改公告'
+      }
+    },
+    style: {
+      id: '编号',
+      title: '样式管理',
+      styleKey: '样式key',
+      styleName: '样式名称',
+      styleType: '样式类型',
+      styleCode: '样式代码',
+      styleDescription: '样式描述',
+      styleStatus: '样式状态',
+      createById: '创建者ID',
+      updateById: '更新者ID',
+      operation: '操作',
+      process: '处理',
+      modify: '修改',
+      delete: '删除',
+      export: '导出',
+      search: '搜索',
+      reset: '重置',
+      add: '新增',
+      pleaseEnterStyleKey: '请输入样式key',
+      pleaseEnterStyleName: '请输入样式名称',
+      pleaseEnterStyleDescription: '请输入样式描述',
+      pleaseEnterCreateById: '请输入创建者ID',
+      pleaseEnterUpdateById: '请输入更新者ID',
+      pleaseSelectStyleType: '请选择样式类型',
+      pleaseEnterContent: '请输入内容',
+      messages: {
+        addSuccess: '新增成功',
+        modifySuccess: '修改成功',
+        deleteConfirm: '是否确认删除样式编号为"{0}"的数据项?',
+        deleteSuccess: '删除成功'
+      },
+      rules: {
+        styleName: '请输入样式名',
+        styleType: '请选择样式类型',
+        styleCode: '请输入样式代码',
+        styleDescription: '请输入样式样式描述'
+      },
+      titles: {
+        addStyle: '添加动态格样式模板',
+        modifyStyle: '修改动态格样式模板'
+      }
+    }
+  }
+};

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

@@ -29,8 +29,8 @@
             auto-complete="off"
             :placeholder="$t('login.username')"
             class="input"
-            @blur="handleBlur"
         />
+            <!-- @blur="handleBlur" -->
       </el-row>
       <el-row class="roww">
         <el-col :span="12" class="text" prop="password">{{$t('login.password')}}</el-col>

+ 585 - 0
zkqy-ui/src/views/formCreate/layout/home/components/optionData.vue

@@ -0,0 +1,585 @@
+<template>
+  <el-tabs v-model="activeName" @tab-click="handleClick">
+    <!-- 同表父子节点 -->
+    <el-tab-pane label="同表父子节点" name="first">
+      <div class="node parent-node">
+        <div class="zzbjd-templateLabel">
+          <div>{{ typeZZShow ? '父节点表:' : '关联表:' }}</div>
+          <el-select v-model="singleNode.tableName" @change="loadSingleTableColumns" clearable>
+            <el-option v-for="(item, index) in tableOptions" :key="index" :label="item.label" :value="item.value" />
+          </el-select>
+        </div>
+        <div class="zzbjd-templateLabel">
+          <div>展示列:</div>
+          <el-select v-model="singleNode.showValue" :disabled="!singleNode.tableName" clearable>
+            <el-option v-for="col in singleColumnOptions" :key="col.value" :label="col.label" :value="col.value" />
+          </el-select>
+        </div>
+        <div class="zzbjd-templateLabel">
+            <div>{{ typeZZShow ? 'id列:' : '实际列:' }}</div>
+            <el-select v-model="singleNode.primaryIdField" :disabled="!singleNode.tableName" clearable>
+              <el-option v-for="col in singleColumnOptions" :key="col.value" :label="col.label" :value="col.value" />
+            </el-select>
+          </div>
+        <template v-if="typeZZShow">
+          
+          <div class="zzbjd-templateLabel">
+            <div>子表列:</div>
+            <el-select v-model="singleNode.parentIdField" :disabled="!singleNode.tableName" clearable>
+              <el-option v-for="col in singleColumnOptions" :key="col.value" :label="col.label" :value="col.value" />
+            </el-select>
+          </div>
+        </template>
+      </div>
+    </el-tab-pane>
+    <el-tab-pane label="主子表节点" name="second" v-if="typeZZShow">
+      <div>
+        <!-- 父节点 -->
+        <div class="node parent-node">
+          <div class="zzbjd-templateLabel">
+            <div>父节点表:</div>
+            <el-select v-model="parentNode.tableName" @change="loadParentColumns" clearable>
+              <el-option v-for="(item, index) in tableOptions" :key="index" :label="item.label" :value="item.value"
+                :disabled="isTableUsed(item.value, -1)" />
+            </el-select>
+          </div>
+          <div class="zzbjd-templateLabel">
+            <div>展示列:</div>
+            <el-select v-model="parentNode.showValue" :disabled="!parentNode.tableName" clearable>
+              <el-option v-for="col in parentColumnOptions" :key="col.value" :label="col.label" :value="col.value" />
+            </el-select>
+          </div>
+          <div class="zzbjd-templateLabel">
+            <div>id列:</div>
+            <el-select v-model="parentNode.primaryIdField" :disabled="!parentNode.tableName" clearable>
+              <el-option v-for="col in parentColumnOptions" :key="col.value" :label="col.label" :value="col.value" />
+            </el-select>
+          </div>
+        </div>
+        <!-- 子节点列表 -->
+        <div v-for="(child, index) in parentNode.childrenTree" :key="index" class="node child-node">
+          <div class="zzbjd-templateLabel">
+            <div>子节点表:</div>
+            <el-select v-model="child.tableName" @change="loadChildColumns(index)" clearable>
+              <el-option v-for="(item, index) in getAvailableTables(index)" :key="index" :label="item.label"
+                :value="item.value" :disabled="isTableUsed(item.value, index)" />
+            </el-select>
+          </div>
+          <div class="zzbjd-templateLabel">
+            <div>展示列:</div>
+            <el-select v-model="child.showValue" :disabled="!child.tableName" clearable>
+              <el-option v-for="col in childColumnOptions[index]" :key="col.value" :label="col.label"
+                :value="col.value" />
+            </el-select>
+          </div>
+          <div class="zzbjd-templateLabel">
+            <div>id列:</div>
+            <el-select v-model="child.primaryIdField" :disabled="!child.tableName" clearable>
+              <el-option v-for="col in childColumnOptions[index]" :key="col.value" :label="col.label"
+                :value="col.value" />
+            </el-select>
+          </div>
+          <div class="zzbjd-templateLabel">
+            <div>关联列:</div>
+            <el-select 
+    v-model="child.parentIdField" 
+    :disabled="!child.tableName" 
+    clearable>
+    <!-- 使用子表字段作为选项 -->
+    <el-option 
+      v-for="col in childColumnOptions[index] || []" 
+      :key="col.value" 
+      :label="col.label" 
+      :value="col.value" />
+  </el-select>
+          </div>
+          <el-button @click="removeChild(index)">删除</el-button>
+        </div>
+
+        <!-- 添加子节点按钮 -->
+        <el-button @click="addChild" :disabled="!canAddChild">添加子节点</el-button>
+      </div>
+    </el-tab-pane>
+    <el-button @click="save">确定</el-button>
+  </el-tabs>
+</template>
+
+<script>
+import { mapState } from "vuex";
+import {
+  getAllTable,
+  getListName,
+} from "@/api/formCreateMange/mobilePageDesignData.js";
+export default {
+  name: 'OptionData',
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    mode: {
+      type: String,
+      default: "2",
+    },
+    optionDataDisplay: {
+      type: Boolean,
+      default: true,
+    },
+    optionDataComponentType: {
+      type: Object,
+      required: true,
+    },
+    multipleTables: {
+      type: Array
+    },
+  },
+  data() {
+    return {
+      activeName: 'second',
+      // 同表父子节点数据
+      singleNode: {
+        treeType: "singleTable",
+        tableName: "",
+        showValue: "",
+        primaryIdField: "",
+        parentIdField: ""
+      },
+      singleColumnOptions: [],
+      // 主子表节点
+      // 所有可选的表
+      typeZZShow: false,
+      tableOptions: [],
+      // 父节点数据
+      parentNode: {
+        treeType: "multiTable",
+        tableName: "",
+        showValue: "",
+        primaryIdField: "",
+        childrenTree: []
+      },
+      // 父表的列选项(根据 tableName 动态加载)
+      parentColumnOptions: [],
+      // 子表的列选项(按索引存储)
+      childColumnOptions: {},
+      // 已选中的表(用于禁用已选项)
+      selectedTables: new Set()
+    };
+  },
+  watch: {
+    // 监听 optionDataDisplay 属性的变化
+    optionDataDisplay: {
+      handler(newVal, oldVal) {
+        if (newVal !== oldVal || oldVal === undefined) {
+          console.log(`visible 值从 ${oldVal} 变为 ${newVal}`);
+          if (newVal) {
+            // 判断传入值
+            let type = this.optionDataComponentType.type
+            let _fc_id = this.optionDataComponentType._fc_id
+            this.getAllTableApi(type, _fc_id);
+            this.checkAndAssignTableData();
+          } else {
+            // 清空
+            console.log('弹窗隐藏');
+          }
+        }
+      },
+      immediate: true // 初始化时立即调用一次
+    }
+  },
+  computed: {
+    ...mapState({
+      databaseName: (state) => state.user.dataSource.databaseName,
+      databaseType: (state) => state.user.dataSource.databaseType,
+    }),
+    // 是否可以继续添加子节点
+    canAddChild() {
+      const usedTables = new Set([
+        this.parentNode.tableName,
+        ...this.parentNode.childrenTree.map(child => child.tableName)
+      ].filter(Boolean));
+      return usedTables.size < this.tableOptions.length;
+    }
+  },
+  methods: {
+    // 加载同表父子节点的表列数据
+    loadSingleTableColumns() {
+      console.log('[this.singleNode]', this.singleNode)
+      if (!this.singleNode.tableName) {
+        this.singleColumnOptions = [];
+        return;
+      }
+
+      let data = {
+        databaseName: this.databaseName,
+        databaseType: this.databaseType,
+        tableName: this.singleNode.tableName,
+      };
+
+      getListName(data).then((res) => {
+        this.$set(this, 'singleColumnOptions', res.map(item => ({
+          label: item.fieldDescription,
+          value: item.fieldName
+        })));
+        console.log(' this.singleColumnOptions', this.singleColumnOptions)
+      }).catch((err) => {
+        console.error('[加载同表列错误]', err);
+        this.singleColumnOptions = [];
+      });
+    },
+    checkAndAssignTableData() {
+      if (!this.multipleTables || !this.optionDataComponentType) return;
+      const currentFcId = this.optionDataComponentType._fc_id;
+      const matchedTable = this.multipleTables.find(
+        table => table._fc_id == currentFcId
+      );
+      console.log('[匹配到的matchedTable的值]', matchedTable)
+      if (matchedTable) {
+        // 判断是单表还是多表数据
+        if (matchedTable.parentNode.treeType === "singleTable") {
+          // 同表父子节点数据
+          this.singleNode = { ...matchedTable.parentNode };
+          this.activeName = 'first';
+          if (this.singleNode.tableName) {
+            this.loadSingleTableColumns();
+          }
+          // 清空主子表数据
+          this.parentNode = {
+            treeType: "multiTable",
+            tableName: "",
+            showValue: "",
+            primaryIdField: "",
+            childrenTree: []
+          };
+          this.parentColumnOptions = [];
+          this.childColumnOptions = {};
+        } else {
+          // 主子表节点数据
+          const flattenedParentNode = {
+            ...matchedTable.parentNode,
+            childrenTree: this.flattenChildrenTree(matchedTable.parentNode)
+          };
+          this.parentNode = flattenedParentNode;
+          this.activeName = 'second';
+          // 清空同表数据
+          this.singleNode = {
+            treeType: "singleTable",
+            tableName: "",
+            showValue: "",
+            primaryIdField: "",
+            parentIdField: ""
+          };
+          this.singleColumnOptions = [];
+          // 加载主子表数据
+          if (this.parentNode.tableName) {
+            this.loadTableColumns(this.parentNode.tableName, 'parent');
+            this.parentNode.childrenTree.forEach((child, index) => {
+              if (child.tableName) {
+                this.loadTableColumns(child.tableName, 'child', index);
+              }
+            });
+          }
+        }
+
+
+      } else {
+        // 如果没有匹配项,重置表单为空
+        this.resetAllData();
+      }
+    },
+    // 重置所有数据
+    resetAllData() {
+      this.singleNode = {
+        treeType: "singleTable",
+        tableName: "",
+        showValue: "",
+        primaryIdField: "",
+        parentIdField: ""
+      };
+      this.singleColumnOptions = [];
+      this.parentNode = {
+        treeType: "multiTable",
+        tableName: "",
+        showValue: "",
+        primaryIdField: "",
+        childrenTree: []
+      };
+      this.parentColumnOptions = [];
+      this.childColumnOptions = {};
+    },
+    loadTableColumns(tableName, type, index = null) {
+      const data = {
+        databaseName: this.databaseName,
+        databaseType: this.databaseType,
+        tableName: tableName
+      };
+
+      getListName(data).then(res => {
+        const options = res.map(item => ({
+          label: item.fieldDescription,
+          value: item.fieldName
+        }));
+
+        if (type === 'parent') {
+          this.parentColumnOptions = options;
+        } else if (type === 'child' && index !== null) {
+          this.$set(this.childColumnOptions, index, options);
+        }
+      }).catch(err => {
+        console.error(`加载${type}表列错误`, err);
+        if (type === 'parent') {
+          this.parentColumnOptions = [];
+        } else if (type === 'child' && index !== null) {
+          this.$set(this.childColumnOptions, index, []);
+        }
+      });
+    },
+    // 将嵌套的 childrenTree 转换为平铺数组
+    flattenChildrenTree(node) {
+      const result = [];
+
+      function traverse(currentNode, parentIndex = -1) {
+        if (!currentNode.childrenTree || currentNode.childrenTree.length === 0) {
+          return;
+        }
+
+        currentNode.childrenTree.forEach((child, index) => {
+          // 如果是第一层子节点,parentIndex 为 -1
+          const flatChild = {
+            ...child,
+            // 保留原始 childrenTree 用于可能的后续处理
+            // _originalChildrenTree: child.childrenTree
+          };
+
+          // 移除 childrenTree 属性以实现平铺
+          delete flatChild.childrenTree;
+
+          result.push(flatChild);
+
+          // 递归处理子节点的子节点
+          traverse(child, index);
+        });
+      }
+      traverse(node);
+      return result;
+    },
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+    loadParentColumns() {
+      // 加载父表的关联下拉列
+      if (!this.parentNode.tableName) return;
+
+      // 重置所有子节点(因为父表变了)
+      this.parentNode.childrenTree = [];
+      this.childColumnOptions = {};
+
+      // 更新已选表(只包含父表)
+      this.selectedTables = new Set([this.parentNode.tableName]);
+
+      // 加载父表列数据...
+      let data = {
+        databaseName: this.databaseName,
+        databaseType: this.databaseType,
+        tableName: this.parentNode.tableName,
+      };
+
+      getListName(data).then((res) => {
+        this.parentColumnOptions = res.map(item => ({
+          label: item.fieldDescription,
+          value: item.fieldName,
+        }));
+      }).catch((err) => {
+        console.error('[加载父表列错误]', err);
+        this.parentColumnOptions = [];
+      });
+    },
+    // 加载子节点表的列
+    async loadChildColumns(childIndex) {
+  const child = this.parentNode.childrenTree[childIndex];
+  if (!child.tableName) return;
+  
+  // 重置子节点的字段
+  child.showValue = "";
+  child.parentIdField = "";
+  child.primaryIdField = "";
+  
+  let data = {
+    databaseName: this.databaseName,
+    databaseType: this.databaseType,
+    tableName: child.tableName,
+  };
+
+  try {
+    const res = await getListName(data);
+    this.$set(this.childColumnOptions, childIndex, res.map(item => ({
+      label: item.fieldDescription,
+      value: item.fieldName
+    })));
+  } catch (err) {
+    console.error('[加载子节点列错误]', err);
+    this.$set(this.childColumnOptions, childIndex, []);
+  }
+},
+   
+    // 获取可选的表(排除已选的)
+    getAvailableTables(currentIndex) {
+      return this.tableOptions.filter(table => {
+        // 当前子节点已选中的表仍然显示(允许修改)
+        const currentChild = this.parentNode.childrenTree[currentIndex];
+        if (currentChild && currentChild.tableName === table.value) {
+          return true;
+        }
+        // 检查表是否被父节点或其他子节点选中
+        return !this.isTableUsed(table.value, currentIndex);
+      });
+    },
+    // 检查表是否已被使用(包括父节点和其他子节点)
+    isTableUsed(tableValue, excludeIndex) {
+      // 检查父节点
+      if (this.parentNode.tableName === tableValue) return true;
+
+      // 检查其他子节点
+      return this.parentNode.childrenTree.some((child, index) =>
+        index !== excludeIndex && child.tableName === tableValue
+      );
+    },
+    // 检查表是否被其他子节点使用
+    isTableUsedByOtherChildren(tableValue, currentIndex) {
+      return this.parentNode.childrenTree.some((child, index) =>
+        index !== currentIndex && child.tableName === tableValue
+      );
+    },
+    // 检查表是否已被选择(排除当前子节点自身的选择)
+    isTableSelected(tableValue, currentIndex) {
+      // 父节点已选且不是当前正在选择的表
+      if (this.parentNode.tableName === tableValue) return true;
+      // 检查其他子节点是否已选此表
+      return Array.from(this.selectedTables).includes(tableValue);
+    },
+    // 添加子节点
+    addChild() {
+      if (this.canAddChild) {
+        this.parentNode.childrenTree.push({
+          tableName: "",
+          showValue: "",
+          parentIdField: "",
+          primaryIdField: ""
+        });
+      }
+    },
+    // 删除子节点
+    removeChild(index) {
+      const removedTable = this.parentNode.childrenTree[index].tableName;
+      this.parentNode.childrenTree.splice(index, 1);
+      this.selectedTables.delete(removedTable);
+    },
+    getAllTableApi(type, _fc_id) {
+      let data = {
+    databaseName: this.databaseName,
+    databaseType: this.databaseType,
+  };
+  
+  // 始终获取表数据
+  getAllTable(data).then((response) => {
+    if (response.code == 200) {
+      this.tableOptions = response.data.map(item => ({
+        ...item,
+        label: item.tableComment,
+        value: item.tableName,
+      }));
+    } else {
+      this.tableOptions = [];
+    }
+    
+    // 只有类型是cascader或tree时才显示高级选项和第二个tab
+    if (type == "cascader" || type == "tree") {
+      this.typeZZShow = true;
+      this.activeName = 'second'; // 默认显示主子表节点
+    } else {
+      this.typeZZShow = false;
+      this.activeName = 'first'; // 只显示同表父子节点
+    }
+  }).catch(err => {
+    console.error('获取表数据错误', err);
+    this.tableOptions = [];
+  });
+    },
+    // 点击保存
+    save() {
+      // 根据当前激活的tab决定保存哪种数据
+      if (this.activeName === 'first') {
+       // 简化版保存数据
+    const dataToSave = {
+      parentNode: {
+        treeType: "singleTable",
+        tableName: this.singleNode.tableName,
+        showValue: this.singleNode.showValue,
+        primaryIdField: this.singleNode.primaryIdField,
+        // 只有typeZZShow为true时才保存这些字段
+        ...(this.typeZZShow ? {
+          parentIdField: this.singleNode.parentIdField
+        } : {})
+      },
+      type: this.optionDataComponentType.type,
+      _fc_id: this.optionDataComponentType._fc_id
+    };
+    this.$emit("saveRule", dataToSave);
+      } else if (this.activeName === 'second') {
+        // 保存主子表节点数据
+        let parentNode = this.transformFlatToTree(this.parentNode);
+        this.$emit("saveRule", {
+          parentNode,
+          type: this.optionDataComponentType.type,
+          _fc_id: this.optionDataComponentType._fc_id
+        });
+      }
+    },
+    // 转换主子表的最终数据格式
+    transformFlatToTree(flatData) {
+      console.log('[转换数据格式接收到的传参]', flatData)
+      if (!flatData.childrenTree || flatData.childrenTree.length <= 1) {
+        return flatData; // 无需转换
+      }
+      // 定义递归函数
+      const buildTree = (data, startIndex) => {
+        // 当前节点
+        const currentNode = { ...data[startIndex] };
+
+        // 如果当前节点后面还有节点,则递归处理
+        if (startIndex + 1 < data.length) {
+          currentNode.childrenTree = [buildTree(data, startIndex + 1)];
+        } else {
+          // 如果是最后一个节点,设置空的 childrenTree
+          currentNode.childrenTree = [];
+        }
+        return currentNode;
+      };
+      // 构建新的树形结构
+      const newChildrenTree = [buildTree(flatData.childrenTree, 0)];
+      // 返回新的树形结构
+      return {
+        ...flatData,
+        childrenTree: newChildrenTree
+      };
+    }
+  },
+  mounted() {
+
+
+  },
+  created() {
+  },
+}
+</script>
+
+<style scoped>
+.node {
+  display: flex;
+  align-items: center;
+}
+
+.zzbjd-templateLabel {
+  display: flex;
+  align-items: center;
+}
+</style>

+ 62 - 56
zkqy-ui/src/views/system/config/index.vue

@@ -8,28 +8,28 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="参数名称" prop="configName">
+      <el-form-item :label="$t('system.config.configName')" prop="configName">
         <el-input
           v-model="queryParams.configName"
-          placeholder="请输入参数名称"
+          :placeholder="$t('system.config.pleaseEnterConfigName')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="参数键名" prop="configKey">
+      <el-form-item :label="$t('system.config.configKey')" prop="configKey">
         <el-input
           v-model="queryParams.configKey"
-          placeholder="请输入参数键名"
+          :placeholder="$t('system.config.pleaseEnterConfigKey')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="系统内置" prop="configType">
+      <el-form-item :label="$t('system.config.configType')" prop="configType">
         <el-select
           v-model="queryParams.configType"
-          placeholder="系统内置"
+          :placeholder="$t('system.config.configType')"
           clearable
         >
           <el-option
@@ -40,15 +40,15 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间">
+      <el-form-item :label="$t('system.config.createTime')">
         <el-date-picker
           v-model="dateRange"
           style="width: 240px"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="$t('system.config.startDate')"
+          :end-placeholder="$t('system.config.endDate')"
         ></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -57,10 +57,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索</el-button
+        >{{ $t('system.config.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置</el-button
+        >{{ $t('system.config.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -74,7 +74,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:config:add']"
-        >新增</el-button
+        >{{ $t('system.config.add') }}</el-button
         >
       </el-col>
       <!-- <el-col :span="1.5">
@@ -97,7 +97,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:config:remove']"
-        >删除</el-button
+        >{{ $t('system.config.delete') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -109,7 +109,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:config:export']"
-        >导出</el-button
+        >{{ $t('system.config.export') }}</el-button
         >
         <ExcelDownLoad
           v-else
@@ -126,7 +126,7 @@
           size="mini"
           @click="handleRefreshCache"
           v-hasPermi="['system:config:remove']"
-        >刷新缓存</el-button
+        >{{ $t('system.config.refreshCache') }}</el-button
         >
       </el-col>
       <right-toolbar
@@ -141,26 +141,26 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="参数主键" align="center" prop="configId" />
+      <el-table-column :label="$t('system.config.configId')" align="center" prop="configId" />
       <el-table-column
-        label="参数名称"
+        :label="$t('system.config.configName')"
         align="center"
         prop="configName"
         :show-overflow-tooltip="true"
       />
       <el-table-column
-        label="参数键名"
+        :label="$t('system.config.configKey')"
         align="center"
         prop="configKey"
         :show-overflow-tooltip="true"
       />
       <el-table-column
-        label="参数键值"
+        :label="$t('system.config.configValue')"
         align="center"
         prop="configValue"
         :show-overflow-tooltip="true"
       />
-      <el-table-column label="系统内置" align="center" prop="configType">
+      <el-table-column :label="$t('system.config.configType')" align="center" prop="configType">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_yes_no"
@@ -169,13 +169,13 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="备注"
+        :label="$t('system.config.remark')"
         align="center"
         prop="remark"
         :show-overflow-tooltip="true"
       />
       <el-table-column
-        label="创建时间"
+        :label="$t('system.config.createTime')"
         align="center"
         prop="createTime"
         width="180"
@@ -185,14 +185,14 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="操作"
+        :label="$t('system.config.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('system.config.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -202,7 +202,7 @@
                 icon="el-icon-edit"
                 @click="handleUpdate(scope.row)"
                 v-hasPermi="['system:config:edit']"
-              >修改</el-button
+              >{{ $t('system.config.modify') }}</el-button
               ></el-dropdown-item
               >
               <el-dropdown-item
@@ -212,7 +212,7 @@
                 icon="el-icon-delete"
                 @click="handleDelete(scope.row)"
                 v-hasPermi="['system:config:remove']"
-              >删除</el-button
+              >{{ $t('system.config.delete') }}</el-button
               >
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -247,16 +247,16 @@
     <!-- 添加或修改参数配置对话框 -->
     <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="configName">
-          <el-input v-model="form.configName" placeholder="请输入参数名称" />
+        <el-form-item :label="$t('system.config.configName')" prop="configName">
+          <el-input v-model="form.configName" :placeholder="$t('system.config.pleaseEnterConfigName')" />
         </el-form-item>
-        <el-form-item label="参数键名" prop="configKey">
-          <el-input v-model="form.configKey" placeholder="请输入参数键名" />
+        <el-form-item :label="$t('system.config.configKey')" prop="configKey">
+          <el-input v-model="form.configKey" :placeholder="$t('system.config.pleaseEnterConfigKey')" />
         </el-form-item>
-        <el-form-item label="参数键值" prop="configValue">
-          <el-input v-model="form.configValue" placeholder="请输入参数键值" />
+        <el-form-item :label="$t('system.config.configValue')" prop="configValue">
+          <el-input v-model="form.configValue" :placeholder="$t('system.config.pleaseEnterConfigValue')" />
         </el-form-item>
-        <el-form-item label="系统内置" prop="configType">
+        <el-form-item :label="$t('system.config.configType')" prop="configType">
           <el-radio-group v-model="form.configType">
             <el-radio
               v-for="dict in dict.type.sys_yes_no"
@@ -266,17 +266,17 @@
             >
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
+        <el-form-item :label="$t('system.config.remark')" prop="remark">
           <el-input
             v-model="form.remark"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('system.config.pleaseEnterContent')"
           />
         </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -304,11 +304,11 @@ export default {
       // 前端导出数据
       selection: [],
       headerList: {
-        参数主键: "configId",
-        参数名称: "configName",
-        参数键名: "configKey",
-        参数键值: "configValue",
-        系统内置: "configType",
+        [this.$t('system.config.configId')]: "configId",
+        [this.$t('system.config.configName')]: "configName",
+        [this.$t('system.config.configKey')]: "configKey",
+        [this.$t('system.config.configValue')]: "configValue",
+        [this.$t('system.config.configType')]: "configType",
       },
       excelTitle: "config",
       // 遮罩层
@@ -344,13 +344,13 @@ export default {
       // 表单校验
       rules: {
         configName: [
-          { required: true, message: "参数名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.config.rules.configName'), trigger: "blur" },
         ],
         configKey: [
-          { required: true, message: "参数键名不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.config.rules.configKey'), trigger: "blur" },
         ],
         configValue: [
-          { required: true, message: "参数键值不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.config.rules.configValue'), trigger: "blur" },
         ],
       },
     };
@@ -385,7 +385,11 @@ export default {
         configType: "Y",
         remark: undefined,
       };
-      this.resetForm("form");
+     this.$nextTick(() => {
+      if (this.$refs.form) {
+        this.$refs.form.resetFields();
+      }
+    });
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -395,15 +399,18 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.dateRange = [];
-      this.resetForm("queryForm");
+      this.$nextTick(() => {
+    if (this.$refs.queryForm) {
+      this.$refs.queryForm.resetFields(); 
+    }
+  });
       this.handleQuery();
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.open = true;
       this.reset();
       this.open = true;
-      this.title = "添加参数";
+      this.title = this.$t('system.config.titles.addConfig');
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
@@ -414,13 +421,12 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      this.open = true;
       this.reset();
       const configId = row.configId || this.ids;
       getConfig(configId).then((response) => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改参数";
+        this.title = this.$t('system.config.titles.modifyConfig');
       });
     },
     /** 提交按钮 */
@@ -429,13 +435,13 @@ export default {
         if (valid) {
           if (this.form.configId != undefined) {
             updateConfig(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.config.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addConfig(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.config.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -447,13 +453,13 @@ export default {
     handleDelete(row) {
       const configIds = row.configId || this.ids;
       this.$modal
-        .confirm('是否确认删除参数编号为"' + configIds + '"的数据项?')
+        .confirm(this.$t('system.config.messages.deleteConfirm', [configIds]))
         .then(function () {
           return delConfig(configIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.config.messages.deleteSuccess'));
         })
         .catch(() => {});
     },
@@ -470,7 +476,7 @@ export default {
     /** 刷新缓存按钮操作 */
     handleRefreshCache() {
       refreshCache().then(() => {
-        this.$modal.msgSuccess("刷新成功");
+        this.$modal.msgSuccess(this.$t('system.config.messages.refreshSuccess'));
       });
     },
   },

+ 53 - 80
zkqy-ui/src/views/system/dept/index.vue

@@ -8,18 +8,18 @@
       v-show="showSearch"
       @submit.native.prevent
     >
-      <el-form-item label="部门名称" prop="deptName">
+      <el-form-item :label="$t('system.dept.deptName')" prop="deptName">
         <el-input
           v-model="queryParams.deptName"
-          placeholder="请输入部门名称"
+          :placeholder="$t('system.dept.deptName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="$t('system.dept.status')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="部门状态"
+          :placeholder="$t('system.dept.status')"
           clearable
         >
           <el-option
@@ -36,11 +36,9 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索
-        </el-button>
+        >{{ $t('system.dept.search') }}</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置
-        </el-button>
+        >{{ $t('system.dept.reset') }}</el-button>
       </el-form-item>
     </el-form>
 
@@ -53,8 +51,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:dept:add']"
-        >新增
-        </el-button>
+        >{{ $t('system.dept.add') }}</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -63,8 +60,7 @@
           icon="el-icon-sort"
           size="mini"
           @click="toggleExpandAll"
-        >展开/折叠
-        </el-button>
+        >{{ $t('system.dept.expandCollapse') }}</el-button>
       </el-col>
       <right-toolbar
         :showSearch.sync="showSearch"
@@ -82,15 +78,15 @@
     >
       <el-table-column
         prop="deptName"
-        label="部门名称"
+        :label="$t('system.dept.deptName')"
         width="260"
       ></el-table-column>
       <el-table-column
         prop="orderNum"
-        label="排序"
+        :label="$t('system.dept.orderNum')"
         width="200"
       ></el-table-column>
-      <el-table-column prop="status" label="状态" width="100">
+      <el-table-column prop="status" :label="$t('system.dept.status')" width="100">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_normal_disable"
@@ -99,7 +95,7 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="创建时间"
+        :label="$t('system.dept.createTime')"
         align="center"
         prop="createTime"
         width="200"
@@ -109,14 +105,14 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="操作"
+        :label="$t('system.dept.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('system.dept.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -124,10 +120,9 @@
                   size="mini"
                   type="text"
                   icon="el-icon-edit"
-                  @click="handleUpdate(scope.row)"
+                  @click="handleUpdate(scope?.row)"
                   v-hasPermi="['system:dept:edit']"
-                >修改
-                </el-button>
+                >{{ $t('system.dept.modify') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -136,8 +131,7 @@
                   icon="el-icon-plus"
                   @click="handleAdd(scope.row)"
                   v-hasPermi="['system:dept:add']"
-                >新增
-                </el-button>
+                >{{ $t('system.dept.add') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -146,34 +140,10 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:dept:remove']"
-                >删除
-                </el-button>
+                >{{ $t('system.dept.delete') }}</el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
-
-          <!-- <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:dept:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-plus"
-            @click="handleAdd(scope.row)"
-            v-hasPermi="['system:dept:add']"
-          >新增</el-button>
-          <el-button
-            v-if="scope.row.parentId != 0"
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:dept:remove']"
-          >删除</el-button> -->
         </template>
       </el-table-column>
     </el-table>
@@ -183,24 +153,24 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="24" v-if="form.parentId !== 0">
-            <el-form-item label="上级部门" prop="parentId">
+            <el-form-item :label="$t('system.dept.parentDept')" prop="parentId">
               <treeselect
                 v-model="form.parentId"
                 :options="deptOptions"
                 :normalizer="normalizer"
-                placeholder="选择上级部门"
+                :placeholder="$t('system.dept.selectParentDept')"
               />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="部门名称" prop="deptName">
-              <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+            <el-form-item :label="$t('system.dept.deptName')" prop="deptName">
+              <el-input v-model="form.deptName" :placeholder="$t('system.dept.deptName')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="显示排序" prop="orderNum">
+            <el-form-item :label="$t('system.dept.displayOrder')" prop="orderNum">
               <el-input-number
                 v-model="form.orderNum"
                 controls-position="right"
@@ -211,19 +181,19 @@
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="负责人" prop="leader">
+            <el-form-item :label="$t('system.dept.leader')" prop="leader">
               <el-input
                 v-model="form.leader"
-                placeholder="请输入负责人"
+                :placeholder="$t('system.dept.leader')"
                 maxlength="20"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="联系电话" prop="phone">
+            <el-form-item :label="$t('system.dept.phone')" prop="phone">
               <el-input
                 v-model="form.phone"
-                placeholder="请输入联系电话"
+                :placeholder="$t('system.dept.phone')"
                 maxlength="11"
               />
             </el-form-item>
@@ -231,31 +201,30 @@
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="邮箱" prop="email">
+            <el-form-item :label="$t('system.dept.email')" prop="email">
               <el-input
                 v-model="form.email"
-                placeholder="请输入邮箱"
+                :placeholder="$t('system.dept.email')"
                 maxlength="50"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="部门状态">
+            <el-form-item :label="$t('system.dept.deptStatus')">
               <el-radio-group v-model="form.status">
                 <el-radio
                   v-for="dict in dict.type.sys_normal_disable"
                   :key="dict.value"
                   :label="dict.value"
-                >{{ dict.label }}
-                </el-radio>
+                >{{ dict.label }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
       </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -304,26 +273,23 @@ export default {
       form: {},
       // 表单校验
       rules: {
-        // parentId: [
-        //   { required: true, message: "上级部门不能为空", trigger: "blur" },
-        // ],
         deptName: [
-          { required: true, message: "部门名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.dept.rules.deptName'), trigger: "blur" },
         ],
         orderNum: [
-          { required: true, message: "显示排序不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.dept.rules.orderNum'), trigger: "blur" },
         ],
         email: [
           {
             type: "email",
-            message: "请输入正确的邮箱地址",
+            message: this.$t('system.dept.rules.email'),
             trigger: ["blur", "change"],
           },
         ],
         phone: [
           {
             pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-            message: "请输入正确的手机号码",
+            message: this.$t('system.dept.rules.phone'),
             trigger: "blur",
           },
         ],
@@ -370,7 +336,9 @@ export default {
         email: undefined,
         status: "0",
       };
-      this.resetForm("form");
+      this.$nextTick(() => {
+    this.resetForm("form"); // 确保 DOM 更新后再重置表单校验
+  });
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -388,7 +356,7 @@ export default {
       if (row != undefined) {
         this.form.parentId = row.deptId;
       }
-      this.title = "添加部门";
+      this.title = this.$t('system.dept.add');
       listDept().then((response) => {
         this.deptOptions = this.handleTree(response.data, "deptId");
       });
@@ -403,12 +371,17 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+
       this.open = true;
       this.reset();
-      getDept(row.deptId).then((response) => {
+      console.log('row.deptId',row)
+
+      getDept(row?.deptId).then((response) => {
+      console.log('response.data',response.data)
+
         this.form = response.data;
         this.open = true;
-        this.title = "修改部门";
+        this.title = this.$t('system.dept.modify');
         listDeptExcludeChild(row.deptId).then((response) => {
           this.deptOptions = this.handleTree(response.data, "deptId");
           if (this.deptOptions.length == 0) {
@@ -429,7 +402,7 @@ export default {
           if (this.form.deptId != undefined) {
             this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
             updateDept(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.dept.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
@@ -439,7 +412,7 @@ export default {
             }
             this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
             addDept(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.dept.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -450,17 +423,17 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       if (row.children?.length) {
-        this.$message.error("当前部门存在子部门,不可删除!请先删除子部门");
+        this.$message.error(this.$t('system.dept.messages.hasChildren'));
         return;
       }
       this.$modal
-        .confirm('是否确认删除名称为"' + row.deptName + '"的数据项?')
+        .confirm(this.$t('system.dept.messages.deleteConfirm', [row.deptName]))
         .then(function () {
           return delDept(row.deptId);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.dept.messages.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 51 - 45
zkqy-ui/src/views/system/dict/index.vue

@@ -8,28 +8,28 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="字典名称" prop="dictName">
+      <el-form-item :label="$t('system.dict.dictName')" prop="dictName">
         <el-input
           v-model="queryParams.dictName"
-          placeholder="请输入字典名称"
+          :placeholder="$t('system.dict.pleaseEnterDictName')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="字典类型" prop="dictType">
+      <el-form-item :label="$t('system.dict.dictType')" prop="dictType">
         <el-input
           v-model="queryParams.dictType"
-          placeholder="请输入字典类型"
+          :placeholder="$t('system.dict.pleaseEnterDictType')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="$t('system.dict.status')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="字典状态"
+          :placeholder="$t('system.dict.dictStatus')"
           clearable
           style="width: 240px"
         >
@@ -41,15 +41,15 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间">
+      <el-form-item :label="$t('system.dict.createTime')">
         <el-date-picker
           v-model="dateRange"
           style="width: 240px"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="$t('system.dict.startDate')"
+          :end-placeholder="$t('system.dict.endDate')"
         ></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -58,10 +58,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('system.dict.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('system.dict.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -75,7 +75,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:dict:add']"
-          >新增</el-button
+          >{{ $t('system.dict.add') }}</el-button
         >
       </el-col>
       <!-- <el-col :span="1.5">
@@ -99,7 +99,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:dict:remove']"
-          >删除</el-button
+          >{{ $t('system.dict.delete') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -111,7 +111,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:dict:export']"
-          >导出</el-button
+          >{{ $t('system.dict.export') }}</el-button
         >
         <ExcelDownLoad
           v-else
@@ -128,7 +128,7 @@
           size="mini"
           @click="handleRefreshCache"
           v-hasPermi="['system:dict:remove']"
-          >刷新缓存</el-button
+          >{{ $t('system.dict.refreshCache') }}</el-button
         >
       </el-col>
       <right-toolbar
@@ -143,15 +143,15 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="字典编号" align="center" prop="dictId" />
+      <el-table-column :label="$t('system.dict.dictId')" align="center" prop="dictId" />
       <el-table-column
-        label="字典名称"
+        :label="$t('system.dict.dictName')"
         align="center"
         prop="dictName"
         :show-overflow-tooltip="true"
       />
       <el-table-column
-        label="字典类型"
+        :label="$t('system.dict.dictType')"
         align="center"
         :show-overflow-tooltip="true"
       >
@@ -164,7 +164,7 @@
           </router-link>
         </template>
       </el-table-column>
-      <el-table-column label="状态" align="center" prop="status">
+      <el-table-column :label="$t('system.dict.status')" align="center" prop="status">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_normal_disable"
@@ -173,13 +173,13 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="备注"
+        :label="$t('system.dict.remark')"
         align="center"
         prop="remark"
         :show-overflow-tooltip="true"
       />
       <el-table-column
-        label="创建时间"
+        :label="$t('system.dict.createTime')"
         align="center"
         prop="createTime"
         width="180"
@@ -189,14 +189,14 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="操作"
+        :label="$t('system.dict.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('system.dict.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -206,7 +206,7 @@
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:dict:edit']"
-                  >修改</el-button
+                  >{{ $t('system.dict.modify') }}</el-button
                 ></el-dropdown-item
               >
               <el-dropdown-item
@@ -216,7 +216,7 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:dict:remove']"
-                  >删除</el-button
+                  >{{ $t('system.dict.delete') }}</el-button
                 >
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -251,13 +251,13 @@
     <!-- 添加或修改参数配置对话框 -->
     <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="dictName">
-          <el-input v-model="form.dictName" placeholder="请输入字典名称" />
+        <el-form-item :label="$t('system.dict.dictName')" prop="dictName">
+          <el-input v-model="form.dictName" :placeholder="$t('system.dict.pleaseEnterDictName')" />
         </el-form-item>
-        <el-form-item label="字典类型" prop="dictType">
-          <el-input v-model="form.dictType" placeholder="请输入字典类型" />
+        <el-form-item :label="$t('system.dict.dictType')" prop="dictType">
+          <el-input v-model="form.dictType" :placeholder="$t('system.dict.pleaseEnterDictType')" />
         </el-form-item>
-        <el-form-item label="状态" prop="status">
+        <el-form-item :label="$t('system.dict.status')" prop="status">
           <el-radio-group v-model="form.status">
             <el-radio
               v-for="dict in dict.type.sys_normal_disable"
@@ -267,17 +267,17 @@
             >
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
+        <el-form-item :label="$t('system.dict.remark')" prop="remark">
           <el-input
             v-model="form.remark"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('system.dict.pleaseEnterContent')"
           ></el-input>
         </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -344,10 +344,10 @@ export default {
       // 表单校验
       rules: {
         dictName: [
-          { required: true, message: "字典名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.dict.rules.dictName'), trigger: "blur" },
         ],
         dictType: [
-          { required: true, message: "字典类型不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.dict.rules.dictType'), trigger: "blur" },
         ],
       },
     };
@@ -383,7 +383,7 @@ export default {
       };
       this.$nextTick(() => {
         console.log( this.$refs['form'])
-        this.$refs['form'].resetFields();
+        this.$refs['form']?.resetFields();
       });
     },
     /** 搜索按钮操作 */
@@ -394,14 +394,20 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.dateRange = [];
-      this.resetForm("queryForm");
+      this.$nextTick(() => {
+        if (this.$refs.queryForm) {
+          this.$refs.queryForm.resetFields(); 
+        } else {
+          console.error("queryForm ref 未找到!");
+        }
+      });
       this.handleQuery();
     },
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加字典类型";
+      this.title = this.$t('system.dict.titles.addDict');
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
@@ -417,7 +423,7 @@ export default {
       getType(dictId).then((response) => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改字典类型";
+        this.title = this.$t('system.dict.titles.modifyDict');
       });
     },
     /** 提交按钮 */
@@ -426,13 +432,13 @@ export default {
         if (valid) {
           if (this.form.dictId != undefined) {
             updateType(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.dict.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addType(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.dict.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -444,13 +450,13 @@ export default {
     handleDelete(row) {
       const dictIds = row.dictId || this.ids;
       this.$modal
-        .confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?')
+        .confirm(this.$t('system.dict.messages.deleteConfirm', [dictIds]))
         .then(function () {
           return delType(dictIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.dict.messages.deleteSuccess'));
         })
         .catch(() => {});
     },
@@ -467,7 +473,7 @@ export default {
     /** 刷新缓存按钮操作 */
     handleRefreshCache() {
       refreshCache().then(() => {
-        this.$modal.msgSuccess("刷新成功");
+        this.$modal.msgSuccess(this.$t('system.dict.messages.refreshSuccess'));
         this.$store.dispatch("dict/cleanDict");
       });
     },

+ 73 - 109
zkqy-ui/src/views/system/menu/index.vue

@@ -7,26 +7,18 @@
       :inline="true"
       v-show="showSearch"
     >
-      <el-form-item label="菜单名称" prop="menuName">
+      <el-form-item :label="$t('system.menu.menuName')" prop="menuName">
         <el-input
           v-model="queryParams.menuName"
-          placeholder="请输入菜单名称"
+          :placeholder="$t('system.menu.menuName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <!-- <el-form-item label="租户名称" prop="tenantName">
-        <el-input
-          v-model="queryParams.tenantName"
-          placeholder="请输入租户名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item> -->
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="$t('system.menu.status')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="菜单状态"
+          :placeholder="$t('system.menu.menuStatus')"
           clearable
         >
           <el-option
@@ -43,10 +35,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('system.menu.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('system.menu.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -60,7 +52,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:menu:add']"
-          >新增菜单</el-button
+          >{{ $t('system.menu.addMenu') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -70,7 +62,7 @@
           icon="el-icon-sort"
           size="mini"
           @click="toggleExpandAll"
-          >展开/折叠</el-button
+          >{{ $t('system.menu.expandCollapse') }}</el-button
         >
       </el-col>
       <right-toolbar
@@ -89,31 +81,31 @@
     >
       <el-table-column
         prop="menuName"
-        label="菜单名称"
+        :label="$t('system.menu.menuName')"
         :show-overflow-tooltip="true"
         width="160"
       ></el-table-column>
-      <el-table-column prop="icon" label="图标" align="center" width="100">
+      <el-table-column prop="icon" :label="$t('system.menu.icon')" align="center" width="100">
         <template slot-scope="scope">
           <svg-icon :icon-class="scope.row.icon" />
         </template>
       </el-table-column>
       <el-table-column
         prop="orderNum"
-        label="排序"
+        :label="$t('system.menu.orderNum')"
         width="60"
       ></el-table-column>
       <el-table-column
         prop="perms"
-        label="权限标识"
+        :label="$t('system.menu.perms')"
         :show-overflow-tooltip="true"
       ></el-table-column>
       <el-table-column
         prop="component"
-        label="组件路径"
+        :label="$t('system.menu.component')"
         :show-overflow-tooltip="true"
       ></el-table-column>
-      <el-table-column prop="status" label="状态" width="80">
+      <el-table-column prop="status" :label="$t('system.menu.status')" width="80">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_normal_disable"
@@ -121,26 +113,20 @@
           />
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
+      <el-table-column :label="$t('system.menu.createTime')" align="center" prop="createTime">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <!-- <el-table-column
-        prop="tenantName"
-        label="租户名称"
-        v-if="$store.state.user.name == 'admin'"
-        :show-overflow-tooltip="true"
-      ></el-table-column> -->
       <el-table-column
-        label="操作"
+        :label="$t('system.menu.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('system.menu.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -150,7 +136,7 @@
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:menu:edit']"
-                  >修改</el-button
+                  >{{ $t('system.menu.modify') }}</el-button
                 ></el-dropdown-item
               >
               <el-dropdown-item
@@ -160,7 +146,7 @@
                   icon="el-icon-plus"
                   @click="handleAdd(scope.row)"
                   v-hasPermi="['system:menu:add']"
-                  >新增菜单</el-button
+                  >{{ $t('system.menu.addMenu') }}</el-button
                 ></el-dropdown-item
               >
               <el-dropdown-item
@@ -170,33 +156,11 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:menu:remove']"
-                  >删除</el-button
+                  >{{ $t('system.menu.delete') }}</el-button
                 ></el-dropdown-item
               >
             </el-dropdown-menu>
           </el-dropdown>
-
-          <!-- <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:menu:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-plus"
-            @click="handleAdd(scope.row)"
-            v-hasPermi="['system:menu:add']"
-          >新增</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:menu:remove']"
-          >删除</el-button> -->
         </template>
       </el-table-column>
     </el-table>
@@ -206,27 +170,27 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
         <el-row>
           <el-col :span="24">
-            <el-form-item label="上级菜单" prop="parentId">
+            <el-form-item :label="$t('system.menu.parentMenu')" prop="parentId">
               <treeselect
                 v-model="form.parentId"
                 :options="menuOptions"
-                :normalizer="normalizer"   parentId
+                :normalizer="normalizer"
                 :show-count="true"
-                placeholder="选择上级菜单"
+                :placeholder="$t('system.menu.selectParentMenu')"
               />
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="菜单类型" prop="menuType">
+            <el-form-item :label="$t('system.menu.menuType')" prop="menuType">
               <el-radio-group v-model="form.menuType">
-                <el-radio label="M">目录</el-radio>
-                <el-radio label="C">菜单</el-radio>
-                <el-radio label="F">按钮</el-radio>
+                <el-radio label="M">{{ $t('system.menu.directory') }}</el-radio>
+                <el-radio label="C">{{ $t('system.menu.menu') }}</el-radio>
+                <el-radio label="F">{{ $t('system.menu.button') }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
           <el-col :span="24" v-if="form.menuType != 'F'">
-            <el-form-item label="菜单图标" prop="icon">
+            <el-form-item :label="$t('system.menu.menuIcon')" prop="icon">
               <el-popover
                 placement="bottom-start"
                 width="460"
@@ -241,7 +205,7 @@
                 <el-input
                   slot="reference"
                   v-model="form.icon"
-                  placeholder="点击选择图标"
+                  :placeholder="$t('system.menu.clickSelectIcon')"
                   readonly
                 >
                   <svg-icon
@@ -260,12 +224,12 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="菜单名称" prop="menuName">
-              <el-input v-model="form.menuName" placeholder="请输入菜单名称" />
+            <el-form-item :label="$t('system.menu.menuName')" prop="menuName">
+              <el-input v-model="form.menuName" :placeholder="$t('system.menu.menuName')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="显示排序" prop="orderNum">
+            <el-form-item :label="$t('system.menu.displayOrder')" prop="orderNum">
               <el-input-number
                 v-model="form.orderNum"
                 controls-position="right"
@@ -277,16 +241,16 @@
             <el-form-item prop="isFrame">
               <span slot="label">
                 <el-tooltip
-                  content="选择是外链则路由地址需要以`http(s)://`开头"
+                  :content="$t('system.menu.tooltips.isFrame')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                是否外链
+                {{ $t('system.menu.isFrame') }}
               </span>
               <el-radio-group v-model="form.isFrame">
-                <el-radio label="0"></el-radio>
-                <el-radio label="1"></el-radio>
+                <el-radio label="0">{{ $t('system.menu.yes') }}</el-radio>
+                <el-radio label="1">{{ $t('system.menu.no') }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -294,45 +258,45 @@
             <el-form-item prop="path">
               <span slot="label">
                 <el-tooltip
-                  content="访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头"
+                  :content="$t('system.menu.tooltips.path')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                路由地址
+                {{ $t('system.menu.routeAddress') }}
               </span>
-              <el-input v-model="form.path" placeholder="请输入路由地址" />
+              <el-input v-model="form.path" :placeholder="$t('system.menu.pleaseEnterRouteAddress')" />
             </el-form-item>
           </el-col>
           <el-col :span="12" v-if="form.menuType == 'C'">
             <el-form-item prop="component">
               <span slot="label">
                 <el-tooltip
-                  content="访问的组件路径,如:`system/user/index`,默认在`views`目录下"
+                  :content="$t('system.menu.tooltips.component')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                组件路径
+                {{ $t('system.menu.component') }}
               </span>
-              <el-input v-model="form.component" placeholder="请输入组件路径" />
+              <el-input v-model="form.component" :placeholder="$t('system.menu.pleaseEnterComponentPath')" />
             </el-form-item>
           </el-col>
           <el-col :span="12" v-if="form.menuType != 'M'">
             <el-form-item prop="perms">
               <el-input
                 v-model="form.perms"
-                placeholder="请输入权限标识"
+                :placeholder="$t('system.menu.pleaseEnterPermissionChar')"
                 maxlength="100"
               />
               <span slot="label">
                 <el-tooltip
-                  content="控制器中定义的权限字符,如://@PreAuthorize(`@ss.hasPermi('system:user:list')`)"
+                  :content="$t('system.menu.tooltips.perms')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                权限字符
+                {{ $t('system.menu.perms') }}
               </span>
             </el-form-item>
           </el-col>
@@ -340,17 +304,17 @@
             <el-form-item prop="query">
               <el-input
                 v-model="form.query"
-                placeholder="请输入路由参数"
+                :placeholder="$t('system.menu.pleaseEnterRouteParam')"
                 maxlength="255"
               />
               <span slot="label">
                 <el-tooltip
-                  content='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`'
+                  :content="$t('system.menu.tooltips.query')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                路由参数
+                {{ $t('system.menu.routeParam') }}
               </span>
             </el-form-item>
           </el-col>
@@ -358,16 +322,16 @@
             <el-form-item prop="isCache">
               <span slot="label">
                 <el-tooltip
-                  content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致"
+                  :content="$t('system.menu.tooltips.isCache')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                是否缓存
+                {{ $t('system.menu.isCache') }}
               </span>
               <el-radio-group v-model="form.isCache">
-                <el-radio label="0">缓存</el-radio>
-                <el-radio label="1">不缓存</el-radio>
+                <el-radio label="0">{{ $t('system.menu.cache') }}</el-radio>
+                <el-radio label="1">{{ $t('system.menu.noCache') }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -375,12 +339,12 @@
             <el-form-item prop="visible">
               <span slot="label">
                 <el-tooltip
-                  content="选择隐藏则路由将不会出现在侧边栏,但仍然可以访问"
+                  :content="$t('system.menu.tooltips.visible')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                显示状态
+                {{ $t('system.menu.visible') }}
               </span>
               <el-radio-group v-model="form.visible">
                 <el-radio
@@ -396,12 +360,12 @@
             <el-form-item prop="status">
               <span slot="label">
                 <el-tooltip
-                  content="选择停用则路由将不会出现在侧边栏,也不能被访问"
+                  :content="$t('system.menu.tooltips.status')"
                   placement="top"
                 >
                   <i class="el-icon-question"></i>
                 </el-tooltip>
-                菜单状态
+                {{ $t('system.menu.menuStatus') }}
               </span>
               <el-radio-group v-model="form.status">
                 <el-radio
@@ -416,8 +380,8 @@
         </el-row>
       </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('system.menu.yes') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.menu.no') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -480,13 +444,13 @@ export default {
       // 表单校验
       rules: {
         menuName: [
-          { required: true, message: "菜单名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.menu.rules.menuName'), trigger: "blur" },
         ],
         orderNum: [
-          { required: true, message: "菜单顺序不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.menu.rules.orderNum'), trigger: "blur" },
         ],
         path: [
-          { required: true, message: "路由地址不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.menu.rules.path'), trigger: "blur" },
         ],
       },
     };
@@ -503,7 +467,7 @@ export default {
     getList() {
       this.loading = true;
       listMenu(this.queryParams).then((response) => {
-        this.menuList = this.handleTree(response.data, "menuId");
+        this.menuList = this.handleTree(response?.data, "menuId");
         this.loading = false;
       });
     },
@@ -522,8 +486,8 @@ export default {
     getTreeselect() {
       listMenu().then((response) => {
         this.menuOptions = [];
-        const menu = { menuId: 0, menuName: "主类目", children: [] };
-        menu.children = this.handleTree(response.data, "menuId");
+        const menu = { menuId: 0, menuName: this.$t('system.menu.directory'), children: [] };
+        menu.children = this.handleTree(response?.data, "menuId");
         this.menuOptions.push(menu);
       });
     },
@@ -572,7 +536,7 @@ export default {
         this.form.parentId = 0;
       }
       this.open = true;
-      this.title = "添加菜单";
+      this.title = this.$t('system.menu.addMenu');
     },
     /** 展开/折叠操作 */
     toggleExpandAll() {
@@ -589,7 +553,7 @@ export default {
       getMenu(row.menuId).then((response) => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改菜单";
+        this.title = this.$t('system.menu.modify');
       });
     },
     /** 提交按钮 */
@@ -600,24 +564,24 @@ export default {
             this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
             updateMenu(this.form).then((response) => {
               if (response.code == 200) {
-                this.$modal.msgSuccess("修改成功");
+                this.$modal.msgSuccess(this.$t('system.menu.messages.modifySuccess'));
                 this.open = false;
                 this.getList();
                 this.reloadRouter();
               } else {
-                this.$modal.msgError("修改失败");
+                this.$modal.msgError(this.$t('system.menu.messages.modifySuccess'));
               }
             });
           } else {
             this.form["tenantId"] = this.$store.state.user.tenant.tenantId;
             addMenu(this.form).then((response) => {
               if (response.code == 200) {
-                this.$modal.msgSuccess("新增成功");
+                this.$modal.msgSuccess(this.$t('system.menu.messages.addSuccess'));
                 this.open = false;
                 this.getList();
                 this.reloadRouter();
               } else {
-                this.$modal.msgError("新增失败");
+                this.$modal.msgError(this.$t('system.menu.messages.addSuccess'));
               }
             });
           }
@@ -633,20 +597,20 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       this.$modal
-        .confirm('是否确认删除名称为"' + row.menuName + '"的数据项?')
+        .confirm(this.$t('system.menu.messages.deleteConfirm', [row.menuName]))
         .then(function () {
           return delMenu(row.menuId);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.menu.messages.deleteSuccess'));
         })
         .catch(() => {});
     },
   },
 };
 </script>
-<style scoped lang="scss" scoped>
+<style scoped lang="scss">
 /* #app .sidebar-container .submenu-title-noDropdown:hover, #app .sidebar-container .el-submenu__title:hover {
     background-color: rgba(0, 0, 0, 0.06) !important;
 }  */

+ 58 - 40
zkqy-ui/src/views/system/notice/index.vue

@@ -8,26 +8,26 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="公告标题" prop="noticeTitle">
+      <el-form-item :label="$t('system.notice.noticeTitle')" prop="noticeTitle">
         <el-input
           v-model="queryParams.noticeTitle"
-          placeholder="请输入公告标题"
+          :placeholder="$t('system.notice.pleaseEnterNoticeTitle')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="操作人员" prop="createBy">
+      <el-form-item :label="$t('system.notice.createBy')" prop="createBy">
         <el-input
           v-model="queryParams.createBy"
-          placeholder="请输入操作人员"
+          :placeholder="$t('system.notice.pleaseEnterCreateBy')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="类型" prop="noticeType">
+      <el-form-item :label="$t('system.notice.noticeType')" prop="noticeType">
         <el-select
           v-model="queryParams.noticeType"
-          placeholder="公告类型"
+          :placeholder="$t('system.notice.noticeType')"
           clearable
         >
           <el-option
@@ -44,10 +44,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索</el-button
+        >{{ $t('system.notice.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置</el-button
+        >{{ $t('system.notice.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -61,7 +61,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:notice:add']"
-        >新增</el-button
+        >{{ $t('system.notice.add') }}</el-button
         >
       </el-col>
       <!-- <el-col :span="1.5">
@@ -84,7 +84,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:notice:remove']"
-        >删除</el-button
+        >{{ $t('system.notice.delete') }}</el-button
         >
       </el-col>
       <right-toolbar
@@ -100,19 +100,19 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column
-        label="序号"
+        :label="$t('system.notice.noticeId')"
         align="center"
         prop="noticeId"
         width="100"
       />
       <el-table-column
-        label="公告标题"
+        :label="$t('system.notice.noticeTitle')"
         align="center"
         prop="noticeTitle"
         :show-overflow-tooltip="true"
       />
       <el-table-column
-        label="公告类型"
+        :label="$t('system.notice.noticeType')"
         align="center"
         prop="noticeType"
         width="100"
@@ -124,7 +124,7 @@
           />
         </template>
       </el-table-column>
-      <el-table-column label="状态" align="center" prop="status" width="100">
+      <el-table-column :label="$t('system.notice.status')" align="center" prop="status" width="100">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_notice_status"
@@ -133,13 +133,13 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="创建者"
+        :label="$t('system.notice.createBy')"
         align="center"
         prop="createBy"
         width="100"
       />
       <el-table-column
-        label="创建时间"
+        :label="$t('system.notice.createTime')"
         align="center"
         prop="createTime"
         width="100"
@@ -149,14 +149,14 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="操作"
+        :label="$t('system.notice.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('system.notice.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -166,7 +166,7 @@
                 icon="el-icon-edit"
                 @click="handleUpdate(scope.row)"
                 v-hasPermi="['system:notice:edit']"
-              >修改</el-button
+              >{{ $t('system.notice.modify') }}</el-button
               ></el-dropdown-item
               >
               <el-dropdown-item
@@ -176,7 +176,7 @@
                 icon="el-icon-delete"
                 @click="handleDelete(scope.row)"
                 v-hasPermi="['system:notice:remove']"
-              >删除</el-button
+              >{{ $t('system.notice.delete') }}</el-button
               >
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -213,16 +213,16 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="公告标题" prop="noticeTitle">
+            <el-form-item :label="$t('system.notice.noticeTitle')" prop="noticeTitle">
               <el-input
                 v-model="form.noticeTitle"
-                placeholder="请输入公告标题"
+                :placeholder="$t('system.notice.pleaseEnterNoticeTitle')"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="公告类型" prop="noticeType">
-              <el-select v-model="form.noticeType" placeholder="请选择公告类型">
+            <el-form-item :label="$t('system.notice.noticeType')" prop="noticeType">
+              <el-select v-model="form.noticeType" :placeholder="$t('system.notice.pleaseSelectNoticeType')">
                 <el-option
                   v-for="dict in dict.type.sys_notice_type"
                   :key="dict.value"
@@ -233,7 +233,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="状态">
+            <el-form-item :label="$t('system.notice.status')">
               <el-radio-group v-model="form.status">
                 <el-radio
                   v-for="dict in dict.type.sys_notice_status"
@@ -245,15 +245,15 @@
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="内容">
+            <el-form-item :label="$t('system.notice.noticeContent')">
               <editor v-model="form.noticeContent" :min-height="192" />
             </el-form-item>
           </el-col>
         </el-row>
       </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -304,10 +304,10 @@ export default {
       // 表单校验
       rules: {
         noticeTitle: [
-          { required: true, message: "公告标题不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.notice.rules.noticeTitle'), trigger: "blur" },
         ],
         noticeType: [
-          { required: true, message: "公告类型不能为空", trigger: "change" },
+          { required: true, message: this.$t('system.notice.rules.noticeType'), trigger: "change" },
         ],
       },
     };
@@ -339,7 +339,11 @@ export default {
         noticeContent: undefined,
         status: "0",
       };
-      this.resetForm("form");
+      this.$nextTick(() => {
+        if (this.$refs.form) {
+          this.$refs.form.resetFields();
+        }
+      });
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -348,7 +352,23 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
+      // this.resetForm("queryForm");
+       // 先手动重置查询参数
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        noticeTitle: undefined,
+        createBy: undefined,
+        noticeType:undefined,
+        status: undefined
+      };
+      
+      // 使用 $nextTick 确保 DOM 更新后操作
+      this.$nextTick(() => {
+        if (this.$refs.queryForm) {
+          this.$refs.queryForm.resetFields();
+        }
+      });
       this.handleQuery();
     },
     // 多选框选中数据
@@ -361,8 +381,7 @@ export default {
     handleAdd() {
       this.open = true;
       this.reset();
-      this.open = true;
-      this.title = "添加公告";
+      this.title = this.$t('system.notice.titles.addNotice');
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -371,8 +390,7 @@ export default {
       const noticeId = row.noticeId || this.ids;
       getNotice(noticeId).then((response) => {
         this.form = response.data;
-        this.open = true;
-        this.title = "修改公告";
+        this.title = this.$t('system.notice.titles.modifyNotice');
       });
     },
     /** 提交按钮 */
@@ -381,13 +399,13 @@ export default {
         if (valid) {
           if (this.form.noticeId != undefined) {
             updateNotice(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.notice.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addNotice(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.notice.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -399,13 +417,13 @@ export default {
     handleDelete(row) {
       const noticeIds = row.noticeId || this.ids;
       this.$modal
-        .confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?')
+        .confirm(this.$t('system.notice.messages.deleteConfirm', [noticeIds]))
         .then(function () {
           return delNotice(noticeIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.notice.messages.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 44 - 44
zkqy-ui/src/views/system/post/index.vue

@@ -8,26 +8,26 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="岗位编码" prop="postCode">
+      <el-form-item :label="$t('system.post.postCode')" prop="postCode">
         <el-input
           v-model="queryParams.postCode"
-          placeholder="请输入岗位编码"
+          :placeholder="$t('system.post.postCode')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="岗位名称" prop="postName">
+      <el-form-item :label="$t('system.post.postName')" prop="postName">
         <el-input
           v-model="queryParams.postName"
-          placeholder="请输入岗位名称"
+          :placeholder="$t('system.post.postName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="$t('system.post.status')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="岗位状态"
+          :placeholder="$t('system.post.status')"
           clearable
         >
           <el-option
@@ -44,10 +44,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索</el-button
+        >{{ $t('system.post.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置</el-button
+        >{{ $t('system.post.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -61,7 +61,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:post:add']"
-        >新增</el-button
+        >{{ $t('system.post.add') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -73,7 +73,7 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['system:post:edit']"
-        >修改</el-button
+        >{{ $t('system.post.modify') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -85,7 +85,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:post:remove']"
-        >删除</el-button
+        >{{ $t('system.post.delete') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -97,7 +97,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:post:export']"
-        >导出</el-button
+        >{{ $t('system.post.export') }}</el-button
         >
         <ExcelDownLoad
           v-else
@@ -120,10 +120,10 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <!-- <el-table-column label="岗位编号" align="center" prop="postId" /> -->
-      <el-table-column label="岗位编码" align="center" prop="postCode" />
-      <el-table-column label="岗位名称" align="center" prop="postName" />
-      <el-table-column label="岗位排序" align="center" prop="postSort" />
-      <el-table-column label="状态" align="center" prop="status">
+      <el-table-column :label="$t('system.post.postCode')" align="center" prop="postCode" />
+      <el-table-column :label="$t('system.post.postName')" align="center" prop="postName" />
+      <el-table-column :label="$t('system.post.postSort')" align="center" prop="postSort" />
+      <el-table-column :label="$t('system.post.status')" align="center" prop="status">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_normal_disable"
@@ -132,7 +132,7 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="创建时间"
+        :label="$t('system.post.createTime')"
         align="center"
         prop="createTime"
         width="180"
@@ -160,14 +160,14 @@
         </template>
       </el-table-column> -->
       <el-table-column
-        label="操作"
+        :label="$t('system.post.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('system.post.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item>
@@ -177,8 +177,7 @@
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:post:edit']"
-                >修改
-                </el-button>
+                >{{ $t('system.post.modify') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -188,8 +187,7 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:post:remove']"
-                >删除
-                </el-button>
+                >{{ $t('system.post.delete') }}</el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
@@ -208,20 +206,20 @@
     <!-- 添加或修改岗位对话框 -->
     <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="postName">
-          <el-input v-model="form.postName" placeholder="请输入岗位名称" />
+        <el-form-item :label="$t('system.post.postName')" prop="postName">
+          <el-input v-model="form.postName" :placeholder="$t('system.post.postName')" />
         </el-form-item>
-        <el-form-item label="岗位编码" prop="postCode">
-          <el-input v-model="form.postCode" placeholder="请输入编码名称" />
+        <el-form-item :label="$t('system.post.postCode')" prop="postCode">
+          <el-input v-model="form.postCode" :placeholder="$t('system.post.postCode')" />
         </el-form-item>
-        <el-form-item label="岗位顺序" prop="postSort">
+        <el-form-item :label="$t('system.post.displayOrder')" prop="postSort">
           <el-input-number
             v-model="form.postSort"
             controls-position="right"
             :min="0"
           />
         </el-form-item>
-        <el-form-item label="岗位状态" prop="status">
+        <el-form-item :label="$t('system.post.postStatus')" prop="status">
           <el-radio-group v-model="form.status">
             <el-radio
               v-for="dict in dict.type.sys_normal_disable"
@@ -231,17 +229,17 @@
             >
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="备注" prop="remark">
+        <el-form-item :label="$t('system.post.remark')" prop="remark">
           <el-input
             v-model="form.remark"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('system.post.pleaseEnterContent')"
           />
         </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -305,13 +303,13 @@ export default {
       // 表单校验
       rules: {
         postName: [
-          { required: true, message: "岗位名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.post.rules.postName'), trigger: "blur" },
         ],
         postCode: [
-          { required: true, message: "岗位编码不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.post.rules.postCode'), trigger: "blur" },
         ],
         postSort: [
-          { required: true, message: "岗位顺序不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.post.rules.postSort'), trigger: "blur" },
         ],
       },
     };
@@ -356,7 +354,9 @@ export default {
         status: "0",
         remark: undefined,
       };
-      this.resetForm("form");
+      this.$nextTick(() => {
+        this.$refs.form?.resetFields(); // 确保 DOM 更新后再调用
+      });
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -379,7 +379,7 @@ export default {
     handleAdd() {
       this.open = true;
       this.reset();
-      this.title = "添加岗位";
+      this.title = this.$t('system.post.add');
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -387,9 +387,9 @@ export default {
       this.reset();
       const postId = row.postId || this.ids;
       getPost(postId).then((response) => {
-        this.form = response.data;
+        this.form = response?.data;
         this.open = true;
-        this.title = "修改岗位";
+        this.title = this.$t('system.post.modify');
       });
     },
     /** 提交按钮 */
@@ -398,13 +398,13 @@ export default {
         if (valid) {
           if (this.form.postId != undefined) {
             updatePost(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.post.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addPost(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.post.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -416,13 +416,13 @@ export default {
     handleDelete(row) {
       const postIds = row.postId || this.ids;
       this.$modal
-        .confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?')
+        .confirm(this.$t('system.post.messages.deleteConfirm', [postIds]))
         .then(function () {
           return delPost(postIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.post.messages.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 21 - 21
zkqy-ui/src/views/system/role/authUser.vue

@@ -1,27 +1,27 @@
 <template>
   <div class="app-container">
      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
-      <el-form-item label="用户名称" prop="userName">
+      <el-form-item :label="$t('system.role.authUser.userName')" prop="userName">
         <el-input
           v-model="queryParams.userName"
-          placeholder="请输入用户名称"
+          :placeholder="$t('system.role.authUser.pleaseEnterUserName')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="手机号码" prop="phonenumber">
+      <el-form-item :label="$t('system.role.authUser.phone')" prop="phonenumber">
         <el-input
           v-model="queryParams.phonenumber"
-          placeholder="请输入手机号码"
+          :placeholder="$t('system.role.authUser.pleaseEnterPhone')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t('system.role.search') }}</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('system.role.reset') }}</el-button>
       </el-form-item>
     </el-form>
 
@@ -34,7 +34,7 @@
           size="mini"
           @click="openSelectUser"
           v-hasPermi="['system:role:add']"
-        >添加用户</el-button>
+        >{{ $t('system.role.authUser.addUser') }}</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -45,7 +45,7 @@
           :disabled="multiple"
           @click="cancelAuthUserAll"
           v-hasPermi="['system:role:remove']"
-        >批量取消授权</el-button>
+        >{{ $t('system.role.authUser.batchCancelAuth') }}</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -54,28 +54,28 @@
           icon="el-icon-close"
           size="mini"
           @click="handleClose"
-        >关闭</el-button>
+        >{{ $t('system.role.authUser.close') }}</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
     <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="用户名称" prop="userName" :show-overflow-tooltip="true" />
-      <el-table-column label="用户昵称" prop="nickName" :show-overflow-tooltip="true" />
-      <el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
-      <el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
-      <el-table-column label="状态" align="center" prop="status">
+      <el-table-column :label="$t('system.role.authUser.userName')" prop="userName" :show-overflow-tooltip="true" />
+      <el-table-column :label="$t('system.role.authUser.nickName')" prop="nickName" :show-overflow-tooltip="true" />
+      <el-table-column :label="$t('system.role.authUser.email')" prop="email" :show-overflow-tooltip="true" />
+      <el-table-column :label="$t('system.role.authUser.phone')" prop="phonenumber" :show-overflow-tooltip="true" />
+      <el-table-column :label="$t('system.role.authUser.status')" align="center" prop="status">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+      <el-table-column :label="$t('system.role.authUser.createTime')" align="center" prop="createTime" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column :label="$t('system.role.authUser.operation')" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -83,7 +83,7 @@
             icon="el-icon-circle-close"
             @click="cancelAuthUser(scope.row)"
             v-hasPermi="['system:role:remove']"
-          >取消授权</el-button>
+          >{{ $t('system.role.authUser.cancelAuth') }}</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -176,22 +176,22 @@ export default {
     /** 取消授权按钮操作 */
     cancelAuthUser(row) {
       const roleId = this.queryParams.roleId;
-      this.$modal.confirm('确认要取消该用户"' + row.userName + '"角色吗?').then(function() {
+      this.$modal.confirm(this.$t('system.role.authUser.messages.cancelAuthConfirm', [row.userName])).then(function() {
         return authUserCancel({ userId: row.userId, roleId: roleId });
       }).then(() => {
         this.getList();
-        this.$modal.msgSuccess("取消授权成功");
+        this.$modal.msgSuccess(this.$t('system.role.authUser.messages.cancelAuthSuccess'));
       }).catch(() => {});
     },
     /** 批量取消授权按钮操作 */
     cancelAuthUserAll(row) {
       const roleId = this.queryParams.roleId;
       const userIds = this.userIds.join(",");
-      this.$modal.confirm('是否取消选中用户授权数据项?').then(function() {
+      this.$modal.confirm(this.$t('system.role.authUser.messages.batchCancelAuthConfirm')).then(function() {
         return authUserCancelAll({ roleId: roleId, userIds: userIds });
       }).then(() => {
         this.getList();
-        this.$modal.msgSuccess("取消授权成功");
+        this.$modal.msgSuccess(this.$t('system.role.authUser.messages.cancelAuthSuccess'));
       }).catch(() => {});
     }
   }

+ 79 - 125
zkqy-ui/src/views/system/role/index.vue

@@ -7,37 +7,28 @@
       :inline="true"
       v-show="showSearch"
     >
-      <el-form-item label="角色名称" prop="roleName">
+      <el-form-item :label="$t('system.role.roleName')" prop="roleName">
         <el-input
           v-model="queryParams.roleName"
-          placeholder="请输入角色名称"
+          :placeholder="$t('system.role.pleaseEnterRoleName')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <!-- <el-form-item label="租户名称" prop="tenantName">
-        <el-input
-          v-model="queryParams.tenantName"
-          placeholder="请输入租户名称"
-          clearable
-          style="width: 240px"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item> -->
-      <el-form-item label="权限字符" prop="roleKey">
+      <el-form-item :label="$t('system.role.roleKey')" prop="roleKey">
         <el-input
           v-model="queryParams.roleKey"
-          placeholder="请输入权限字符"
+          :placeholder="$t('system.role.pleaseEnterRoleKey')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="$t('system.role.status')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="角色状态"
+          :placeholder="$t('system.role.pleaseSelectStatus')"
           clearable
           style="width: 240px"
         >
@@ -49,15 +40,15 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间">
+      <el-form-item :label="$t('system.role.createTime')">
         <el-date-picker
           v-model="dateRange"
           style="width: 240px"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="$t('system.role.startDate')"
+          :end-placeholder="$t('system.role.endDate')"
         ></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -66,10 +57,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索</el-button
+        >{{ $t('system.role.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置</el-button
+        >{{ $t('system.role.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -83,21 +74,9 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:role:add']"
-        >新增</el-button
+        >{{ $t('system.role.add') }}</el-button
         >
       </el-col>
-      <!-- <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:role:edit']"
-          >修改</el-button
-        >
-      </el-col> -->
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -107,7 +86,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:role:remove']"
-        >删除</el-button
+        >{{ $t('system.role.delete') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -119,7 +98,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:role:export']"
-        >导出</el-button
+        >{{ $t('system.role.export') }}</el-button
         >
         <ExcelDownLoad
           v-else
@@ -141,28 +120,28 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="角色编号" prop="roleId" width="120" />
+      <el-table-column :label="$t('system.role.roleId')" prop="roleId" width="120" />
       <el-table-column
-        label="角色名称"
+        :label="$t('system.role.roleName')"
         prop="roleName"
         :show-overflow-tooltip="true"
         width="150"
       />
       <el-table-column
-        label="租户名称"
+        :label="$t('system.role.tenantName')"
         prop="tenantName"
-        v-if="$store.state.user.name == 'admin'"
+         v-if="$store.state.user.name == 'admin'"
         :show-overflow-tooltip="true"
         width="150"
       />
       <el-table-column
-        label="权限字符"
+        :label="$t('system.role.roleKey')"
         prop="roleKey"
         :show-overflow-tooltip="true"
         width="150"
       />
-      <el-table-column label="显示顺序" prop="roleSort" width="100" />
-      <el-table-column label="状态" align="center" width="100">
+      <el-table-column :label="$t('system.role.roleSort')" prop="roleSort" width="100" />
+      <el-table-column :label="$t('system.role.status')" align="center" width="100">
         <template slot-scope="scope">
           <el-switch
             v-model="scope.row.status"
@@ -173,7 +152,7 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="创建时间"
+        :label="$t('system.role.createTime')"
         align="center"
         prop="createTime"
         width="180"
@@ -183,14 +162,14 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="操作"
+        :label="$t('system.role.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope" v-if="scope.row.roleId !== 1">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('system.role.process') }}<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
@@ -200,7 +179,7 @@
                 icon="el-icon-edit"
                 @click="handleUpdate(scope.row)"
                 v-hasPermi="['system:tenant:edit']"
-              >修改</el-button
+              >{{ $t('system.role.modify') }}</el-button
               ></el-dropdown-item
               >
               <el-dropdown-item
@@ -210,7 +189,7 @@
                 icon="el-icon-delete"
                 @click="handleDelete(scope.row)"
                 v-hasPermi="['system:tenant:remove']"
-              >删除</el-button
+              >{{ $t('system.role.delete') }}</el-button
               > </el-dropdown-item
               ><el-dropdown-item>
               <el-dropdown
@@ -222,50 +201,26 @@
                   size="mini"
                   type="text"
                   icon="el-icon-d-arrow-right"
-                >更多</el-button
+                >{{ $t('system.role.more') }}</el-button
                 >
                 <el-dropdown-menu slot="dropdown">
                   <el-dropdown-item
                     command="handleDataScope"
                     icon="el-icon-circle-check"
                     v-hasPermi="['system:role:edit']"
-                  >数据权限</el-dropdown-item
+                  >{{ $t('system.role.dataPermission') }}</el-dropdown-item
                   >
                   <el-dropdown-item
                     command="handleAuthUser"
                     icon="el-icon-user"
                     v-hasPermi="['system:role:edit']"
-                  >分配用户</el-dropdown-item
+                  >{{ $t('system.role.assignUser') }}</el-dropdown-item
                   >
                 </el-dropdown-menu>
               </el-dropdown>
             </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
-
-          <!-- <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:role:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:role:remove']"
-          >删除</el-button>
-          <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
-            <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
-            <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"
-                v-hasPermi="['system:role:edit']">数据权限</el-dropdown-item>
-              <el-dropdown-item command="handleAuthUser" icon="el-icon-user"
-                v-hasPermi="['system:role:edit']">分配用户</el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown> -->
         </template>
       </el-table-column>
     </el-table>
@@ -281,29 +236,29 @@
     <!-- 添加或修改角色配置对话框 -->
     <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="roleName">
-          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        <el-form-item :label="$t('system.role.roleName')" prop="roleName">
+          <el-input v-model="form.roleName" :placeholder="$t('system.role.pleaseEnterRoleName')" />
         </el-form-item>
-        <el-form-item prop="roleKey">
+        <el-form-item :label="$t('system.role.roleKey')" prop="roleKey">
           <span slot="label">
             <el-tooltip
-              content="控制器中定义的权限字符,如://@PreAuthorize(`@ss.hasRole('admin')`)"
+              :content="$t('system.role.tooltip.roleKey')"
               placement="top"
             >
               <i class="el-icon-question"></i>
             </el-tooltip>
-            权限字符
+            {{ $t('system.role.roleKey') }}
           </span>
-          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+          <el-input v-model="form.roleKey" :placeholder="$t('system.role.pleaseEnterRoleKey')" />
         </el-form-item>
-        <el-form-item label="角色顺序" prop="roleSort">
+        <el-form-item :label="$t('system.role.roleSort')" prop="roleSort">
           <el-input-number
             v-model="form.roleSort"
             controls-position="right"
             :min="0"
           />
         </el-form-item>
-        <el-form-item label="状态">
+        <el-form-item :label="$t('system.role.status')">
           <el-radio-group v-model="form.status">
             <el-radio
               v-for="dict in dict.type.sys_normal_disable"
@@ -313,21 +268,21 @@
             >
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="菜单权限">
+        <el-form-item :label="$t('system.role.menuPermission')">
           <el-checkbox
             v-model="menuExpand"
             @change="handleCheckedTreeExpand($event, 'menu')"
-          >展开/折叠</el-checkbox
+            >{{ $t('system.role.expandCollapse') }}</el-checkbox
           >
           <el-checkbox
             v-model="menuNodeAll"
             @change="handleCheckedTreeNodeAll($event, 'menu')"
-          >全选/全不选</el-checkbox
+            >{{ $t('system.role.selectAll') }}</el-checkbox
           >
           <el-checkbox
             v-model="form.menuCheckStrictly"
             @change="handleCheckedTreeConnect($event, 'menu')"
-          >父子联动</el-checkbox
+            >{{ $t('system.role.parentChildLink') }}</el-checkbox
           >
           <el-tree
             class="tree-border"
@@ -336,21 +291,21 @@
             ref="menu"
             node-key="id"
             :check-strictly="!form.menuCheckStrictly"
-            empty-text="加载中,请稍候"
+            :empty-text="$t('system.role.loading')"
             :props="defaultProps"
           ></el-tree>
         </el-form-item>
-        <el-form-item label="备注">
+        <el-form-item :label="$t('system.role.remark')">
           <el-input
             v-model="form.remark"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('system.role.pleaseEnterRemark')"
           ></el-input>
         </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
 
@@ -362,13 +317,13 @@
       append-to-body
     >
       <el-form :model="form" label-width="80px">
-        <el-form-item label="角色名称">
+        <el-form-item :label="$t('system.role.roleName')">
           <el-input v-model="form.roleName" :disabled="true" />
         </el-form-item>
-        <el-form-item label="权限字符">
+        <el-form-item :label="$t('system.role.roleKey')">
           <el-input v-model="form.roleKey" :disabled="true" />
         </el-form-item>
-        <el-form-item label="权限范围">
+        <el-form-item :label="$t('system.role.dataScope')">
           <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
             <el-option
               v-for="item in dataScopeOptions"
@@ -378,21 +333,21 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+        <el-form-item :label="$t('system.role.dataPermission')" v-show="form.dataScope == 2">
           <el-checkbox
             v-model="deptExpand"
             @change="handleCheckedTreeExpand($event, 'dept')"
-          >展开/折叠</el-checkbox
+          >{{ $t('system.role.expandCollapse') }}</el-checkbox
           >
           <el-checkbox
             v-model="deptNodeAll"
             @change="handleCheckedTreeNodeAll($event, 'dept')"
-          >全选/全不选</el-checkbox
+          >{{ $t('system.role.selectAll') }}</el-checkbox
           >
           <el-checkbox
             v-model="form.deptCheckStrictly"
             @change="handleCheckedTreeConnect($event, 'dept')"
-          >父子联动</el-checkbox
+          >{{ $t('system.role.parentChildLink') }}</el-checkbox
           >
           <el-tree
             class="tree-border"
@@ -402,14 +357,14 @@
             ref="dept"
             node-key="id"
             :check-strictly="!form.deptCheckStrictly"
-            empty-text="加载中,请稍候"
+            :empty-text="$t('system.role.loading')"
             :props="defaultProps"
           ></el-tree>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitDataScope">确 定</el-button>
-        <el-button @click="cancelDataScope">取 消</el-button>
+        <el-button type="primary" @click="submitDataScope">{{ $t('system.role.confirm') }}</el-button>
+        <el-button @click="cancelDataScope">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -482,23 +437,23 @@ export default {
       dataScopeOptions: [
         {
           value: "1",
-          label: "全部数据权限",
+          label: this.$t('system.role.dataScope.allData'),
         },
         {
           value: "2",
-          label: "自定数据权限",
+          label: this.$t('system.role.dataScope.customData'),
         },
         {
           value: "3",
-          label: "本部门数据权限",
+          label: this.$t('system.role.dataScope.deptData'),
         },
         {
           value: "4",
-          label: "本部门及以下数据权限",
+          label: this.$t('system.role.dataScope.deptAndBelow'),
         },
         {
           value: "5",
-          label: "仅本人数据权限",
+          label: this.$t('system.role.dataScope.personalData'),
         },
       ],
       // 菜单列表
@@ -523,14 +478,14 @@ export default {
       // 表单校验
       rules: {
         roleName: [
-          { required: true, message: "角色名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.role.rules.roleName'), trigger: "blur" }
         ],
         roleKey: [
-          { required: true, message: "权限字符不能为空", trigger: "blur" },
+          { required: true, message: this.$t('system.role.rules.roleKey'), trigger: "blur" }
         ],
         roleSort: [
-          { required: true, message: "角色顺序不能为空", trigger: "blur" },
-        ],
+          { required: true, message: this.$t('system.role.rules.roleSort'), trigger: "blur" }
+        ]
       },
     };
   },
@@ -601,14 +556,14 @@ export default {
     },
     // 角色状态修改
     handleStatusChange(row) {
-      let text = row.status === "0" ? "启用" : "停用";
+      let text = row.status === "0" ? this.$t('system.role.messages.enableConfirm') : this.$t('system.role.messages.disableConfirm');
       this.$modal
-        .confirm('确认要"' + text + '""' + row.roleName + '"角色吗?')
+        .confirm(text)
         .then(function () {
           return changeRoleStatus(row.roleId, row.status);
         })
         .then(() => {
-          this.$modal.msgSuccess(text + "成功");
+          this.$modal.msgSuccess(this.$t(row.status === "0" ? 'system.role.messages.enableSuccess' : 'system.role.messages.disableSuccess'));
         })
         .catch(function () {
           row.status = row.status === "0" ? "1" : "0";
@@ -645,7 +600,7 @@ export default {
           deptCheckStrictly: true,
           remark: undefined,
         });
-      this.resetForm("form");
+      this.$refs.form.resetFields();
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -713,8 +668,7 @@ export default {
       this.open = true;
       this.reset();
       this.getMenuTreeselect();
-      this.open = true;
-      this.title = "添加角色";
+      this.title = this.$t('system.role.titles.addRole');
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -735,7 +689,7 @@ export default {
             });
           });
         });
-        this.title = "修改角色";
+        this.title = this.$t('system.role.titles.modifyRole');
       });
     },
     /** 选择角色权限范围触发 */
@@ -756,7 +710,7 @@ export default {
             this.$refs.dept.setCheckedKeys(res.checkedKeys);
           });
         });
-        this.title = "分配数据权限";
+        this.title = this.$t('system.role.dataScope.title');
       });
     },
     /** 分配用户操作 */
@@ -765,21 +719,21 @@ export default {
       this.$router.push("/system/role-auth/user/" + roleId);
     },
     /** 提交按钮 */
-    submitForm: function () {
-      this.$refs["form"].validate((valid) => {
+    submitForm() {
+      this.$refs["form"].validate(valid => {
         if (valid) {
           this.form.tenantId = this.$store.state.user.tenant.tenantId;
           if (this.form.roleId != undefined) {
             this.form.menuIds = this.getMenuAllCheckedKeys();
             updateRole(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.role.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             this.form.menuIds = this.getMenuAllCheckedKeys();
             addRole(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.role.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -792,7 +746,7 @@ export default {
       if (this.form.roleId != undefined) {
         this.form.deptIds = this.getDeptAllCheckedKeys();
         dataScope(this.form).then((response) => {
-          this.$modal.msgSuccess("修改成功");
+          this.$modal.msgSuccess(this.$t('system.role.messages.modifySuccess'));
           this.openDataScope = false;
           this.getList();
         });
@@ -802,13 +756,13 @@ export default {
     handleDelete(row) {
       const roleIds = row.roleId || this.ids;
       this.$modal
-        .confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?')
+        .confirm(this.$t('system.role.messages.deleteConfirm', [roleIds]))
         .then(function () {
           return delRole(roleIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.role.messages.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 27 - 47
zkqy-ui/src/views/system/tenant/code/index.vue

@@ -7,54 +7,36 @@
         :rules="rulesActivationCode"
         label-width="80px"
       >
-        <el-form-item label="租户信息" prop="tenantCode">
+        <el-form-item :label="$t('tenant.activationCode.tenantInfo')" prop="tenantCode">
               <treeselect v-model="activationCode.tenantCode" :options="tenantRows" :multiple="false" :disable-branch-nodes="false"
-                      :clear-on-select="true" :flat="true" :show-count="true" placeholder="请选择租户" style="width: 217px" />
+                      :clear-on-select="true" :flat="true" :show-count="true" :placeholder="$t('tenant.activationCode.pleaseSelectTenant')" style="width: 217px" />
         </el-form-item>
-
-<!--        <el-form-item label="租户信息" prop="tenantCode">-->
-<!--          <el-select-->
-<!--            v-model="activationCode.tenantCode"-->
-<!--            placeholder="请选择"-->
-<!--            filterable-->
-<!--          >-->
-<!--            <el-option-->
-<!--              v-for="item in tenantList"-->
-<!--              :key="item.tenantId"-->
-<!--              :label="item.tenantName"-->
-<!--              :value="item.tenantId"-->
-<!--            >-->
-<!--            </el-option>-->
-<!--          </el-select>-->
-<!--        </el-form-item>-->
         <el-form-item
-          label="充值时间"
+          :label="$t('tenant.activationCode.rechargeTime')"
           prop="tenantExpirationDate"
           style="width: 300px"
         >
           <el-input
             v-model="activationCode.tenantExpirationDate"
-            placeholder="请输入充值天数"
+            :placeholder="$t('tenant.activationCode.pleaseEnterRechargeDays')"
           ></el-input>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="crateCode">生成激活码</el-button>
-        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="crateCode">{{ $t('tenant.activationCode.generateCode') }}</el-button>
+        <el-button @click="cancel">{{ $t('tenant.activationCode.cancel') }}</el-button>
       </div>
       <!-- 激活码生成成功-->
       <el-dialog
-        :title="title"
+        :title="$t('tenant.activationCode.generateSuccess')"
         :visible.sync="activationCodeForm"
         width="500px"
         append-to-body
       >
         <span v-html="actCode"></span>
         <div slot="footer" class="dialog-footer">
-          <el-button type="primary" @click="copyToClipboard"
-            >一键复制</el-button
-          >
-          <el-button @click="activationCodeForm = false">取 消</el-button>
+          <el-button type="primary" @click="copyToClipboard">{{ $t('tenant.activationCode.oneClickCopy') }}</el-button>
+          <el-button @click="activationCodeForm = false">{{ $t('tenant.activationCode.cancel') }}</el-button>
         </div>
       </el-dialog>
     </div>
@@ -68,33 +50,33 @@
         v-show="showSearch"
         label-width="68px"
       >
-        <el-form-item label="登录地址" prop="ipAddress">
+        <el-form-item :label="$t('tenant.activationCode.loginAddress')" prop="ipAddress">
           <el-input
             v-model="queryParams.ipAddress"
-            placeholder="请输入登录地址"
+            :placeholder="$t('tenant.activationCode.pleaseEnterLoginAddress')"
             clearable
             style="width: 240px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="操作人员" prop="operator">
+        <el-form-item :label="$t('tenant.activationCode.operator')" prop="operator">
           <el-input
             v-model="queryParams.operator"
-            placeholder="请输入操作人员"
+            :placeholder="$t('tenant.activationCode.pleaseEnterOperator')"
             clearable
             style="width: 240px"
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="操作时间">
+        <el-form-item :label="$t('tenant.activationCode.operationTime')">
           <el-date-picker
             v-model="dateRange"
             style="width: 240px"
             value-format="yyyy-MM-dd HH:mm:ss"
             type="daterange"
             range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
+            :start-placeholder="$t('tenant.activationCode.startDate')"
+            :end-placeholder="$t('tenant.activationCode.endDate')"
             :default-time="['00:00:00', '23:59:59']"
           ></el-date-picker>
         </el-form-item>
@@ -105,11 +87,9 @@
             icon="el-icon-search"
             size="mini"
             @click="handleQuery"
-            >搜索</el-button
-          >
+          >{{ $t('tenant.activationCode.search') }}</el-button>
           <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-            >重置</el-button
-          >
+          >{{ $t('tenant.activationCode.reset') }}</el-button>
         </el-form-item>
       </el-form>
 
@@ -124,16 +104,16 @@
         style="margin-top: 20px"
       >
         <el-table-column type="selection" width="50" align="center" />
-        <el-table-column label="日志编号" align="center" prop="logId" />
-        <el-table-column label="操作人员" align="center" prop="operator" />
+        <el-table-column :label="$t('tenant.activationCode.logId')" align="center" prop="logId" />
+        <el-table-column :label="$t('tenant.activationCode.operator')" align="center" prop="operator" />
         <el-table-column
-          label="操作ip地址"
+          :label="$t('tenant.activationCode.operationIp')"
           align="center"
           prop="ipAddress"
           :show-overflow-tooltip="true"
         />
         <el-table-column
-          label="操作日期"
+          :label="$t('tenant.activationCode.operationDate')"
           align="center"
           prop="generationTime"
           sortable="custom"
@@ -143,7 +123,7 @@
             <span>{{ parseTime(scope.row.generationTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="备注" align="center" prop="note">
+        <el-table-column :label="$t('tenant.activationCode.remark')" align="center" prop="note">
         </el-table-column>
       </el-table>
       <!--分页器-->
@@ -181,10 +161,10 @@ export default {
       //表单校验
       rulesActivationCode: {
         tenantCode: [
-          { required: true, message: "未选择租户信息", trigger: "change" },
+          { required: true, message: this.$t('tenant.activationCode.messages.tenantNotSelected'), trigger: "change" },
         ],
         tenantExpirationDate: [
-          { required: true, message: "租户到期时间未设置", trigger: "blur" },
+          { required: true, message: this.$t('tenant.activationCode.messages.expirationDateNotSet'), trigger: "blur" },
         ],
       },
       activationCode: {},
@@ -266,13 +246,13 @@ export default {
         this.activationCodeForm = false;
         this.$message({
           showClose: true,
-          message: "文本已成功复制到剪贴板",
+          message: this.$t('tenant.activationCode.messages.copySuccess'),
           type: "success",
         });
         clipboard.destroy(); //清除 Clipboard 实例
       });
       clipboard.on("error", () => {
-        console.error("复制失败");
+        console.error(this.$t('tenant.activationCode.messages.copyFailed'));
         clipboard.destroy(); //清除 Clipboard 实例
       });
       //触发按钮点击事件,开始复制操作

+ 1 - 1
zkqy-ui/src/views/system/tenant/dict/index.vue

@@ -479,7 +479,7 @@ export default {
     /** 刷新缓存按钮操作 */
     handleRefreshCache() {
       refreshCache().then(() => {
-        this.$modal.msgSuccess("刷新成功");
+        this.$modal.msgSuccess(this.$t('system.dict.messages.refreshSuccess'));
         this.$store.dispatch("dict/cleanDict");
       });
     },

+ 111 - 157
zkqy-ui/src/views/system/tenant/index.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,11 +54,9 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索
-        </el-button>
+          >{{ $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>
 
@@ -71,8 +69,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:tenant:add']"
-          >新增
-        </el-button>
+          >{{ $t('insert') }}</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -83,7 +80,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:tenant:export']"
-          >导出
+          >{{ $t('normal.export') }}
         </el-button>
         <ExcelDownLoad
           v-else
@@ -111,38 +108,36 @@
       :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
       @cell-dblclick="copyText"
     >
-      <el-table-column label="租户ID" align="center" prop="tenantId" />
-      <el-table-column label="租户编号" align="center" prop="tenantCode" />
-      <el-table-column label="租户名称" align="center" prop="tenantName" />
-      <el-table-column label="联系方式" align="center" prop="contactInfo" />
-      <el-table-column label="租户地址" align="center" prop="address" />
-      <el-table-column label="负责人" align="center" prop="owner" />
-      <!--      <el-table-column label="租户父级ID" align="center" prop="tenantParentId"/>-->
+      <el-table-column :label="$t('tenant.tenantId')" align="center" prop="tenantId" />
+      <el-table-column :label="$t('tenant.tenantCode')" align="center" prop="tenantCode" />
+      <el-table-column :label="$t('tenant.tenantName')" align="center" prop="tenantName" />
+      <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="$t('tenant.owner')" align="center" prop="owner" />
       <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="到期天数"
+        :label="$t('tenant.tenantExpirationTime')"
         align="center"
         prop="tenantExpirationTime"
       />
       <el-table-column
-        label="操作"
+        :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>
@@ -152,8 +147,7 @@
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:tenant:edit']"
-                  >修改
-                </el-button>
+                  >{{ $t('update') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -162,8 +156,7 @@
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:tenant:remove']"
-                  >删除
-                </el-button>
+                  >{{ $t('delete') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -172,8 +165,7 @@
                   icon="el-icon-position"
                   @click="bindDatasource(scope.row)"
                   v-show="scope.row.datasourceId == null"
-                  >绑定数据源
-                </el-button>
+                  >{{ $t('tenant.bindDatasource') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -182,8 +174,7 @@
                   icon="el-icon-s-custom"
                   @click="openTenantExpirationTime(scope.row)"
                   v-hasPermi="['system:tenant:remove']"
-                  >激活租户
-                </el-button>
+                  >{{ $t('tenant.activateTenant') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -192,8 +183,7 @@
                   icon="el-icon-s-open"
                   @click="openLoginConfig(scope.row, 'client')"
                   v-hasPermi="['system:tenant:remove']"
-                  >客户端登录信息
-                </el-button>
+                  >{{ $t('tenant.configLoginPage') }}</el-button>
               </el-dropdown-item>
               <el-dropdown-item>
                 <el-button
@@ -202,8 +192,7 @@
                   icon="el-icon-s-open"
                   @click="openLoginConfig(scope.row, 'tool')"
                   v-hasPermi="['system:tenant:remove']"
-                  >工具端登录信息
-                </el-button>
+                  >{{ $t('tenant.configLoginPage') }}</el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
@@ -220,13 +209,14 @@
     />
 
     <!-- 添加或修改租户信息对话框 -->
-    <el-dialog :title="title"  :visible.sync="open" width="800px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-row>
         <el-form ref="form" :model="form" :rules="rules" label-width="120px">
           <el-col :span="12">
-            <el-form-item label="上级租户" prop="tenantParentId">
+            <el-form-item :label="$t('tenant.selectParentTenant')" prop="tenantParentId">
               <el-cascader
                 v-model="form.tenantParentId"
+                :placeholder="$t('tenant.pleaseEnterSelect')"
                 :options="tenantAllList"
                 :props="{
                   checkStrictly: true,
@@ -239,8 +229,8 @@
                 style="width: 250px"
               ></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"
@@ -250,37 +240,36 @@
                 </el-option>
               </el-select>
             </el-form-item>
-            <el-form-item label="租户名称" prop="tenantName">
+            <el-form-item :label="$t('tenant.tenantName')" prop="tenantName">
               <el-input
                 v-model="form.tenantName"
-                placeholder="请输入租户名称"
+                :placeholder="$t('tenant.pleaseEnterTenantName')"
               />
             </el-form-item>
-            <el-form-item label="租户编号" prop="tenantCode">
+            <el-form-item :label="$t('tenant.tenantCode')" prop="tenantCode">
               <el-input
                 v-model="form.tenantCode"
-                placeholder="请输入租户编号"
+                :placeholder="$t('tenant.pleaseEnterTenantCode')"
               />
             </el-form-item>
           </el-col>
 
           <el-col :span="12">
-            <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="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="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-col>
-
         </el-form>
       </el-row>
       <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>
 
@@ -297,8 +286,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"
@@ -306,7 +295,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"
@@ -321,47 +310,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>
@@ -371,15 +359,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.titles.activateTenant')"
       :visible.sync="tenantExpirationTimeOpen"
       width="500px"
       append-to-body
@@ -391,25 +379,25 @@
         label-width="80px"
       >
         <el-form-item
-          label="激活租户"
+          :label="$t('tenant.titles.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')"
-            >确 定
-          </el-button>
-          <el-button @click="tanentCancel">取 消</el-button>
+            >{{ $t('normal.confirm') }}</el-button>
+          <el-button @click="tanentCancel">{{ $t('normal.cancel') }}</el-button>
         </el-form-item>
       </el-form>
     </el-dialog>
+
     <!-- 登录页面配置信息列表 -->
     <el-dialog
       :title="login_title"
@@ -424,50 +412,50 @@
         :rules="rules"
         label-width="80px"
       >
-        <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-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-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-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-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"
@@ -477,8 +465,8 @@
       </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>
@@ -604,13 +592,13 @@ export default {
       // 表单校验
       rules: {
         tenantName: [
-          { required: true, message: "租户名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.tenantName'), trigger: "blur" },
         ],
         tenantCode: [
-          { required: true, message: "租户编号不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.tenantCode'), trigger: "blur" },
         ],
         tenantParentId: [
-          { required: true, message: "请选择上级租户", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.tenantParentId'), trigger: "blur" },
           { validator: this.checkTenantParentId, trigger: "change" },
         ],
       },
@@ -630,31 +618,31 @@ export default {
       fromTenantId: null,
       dataSourceFormRules: {
         databaseType: [
-          { required: true, message: "数据源类型不能为空", trigger: "change" },
+          { required: true, message: this.$t('tenant.rules.databaseType'), trigger: "change" },
         ],
         databaseName: [
-          { required: true, message: "数据库名不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.databaseName'), trigger: "blur" },
           { validator: this.databaseNameValidator, trigger: "blur" },
         ],
         tenantAccount: [
           {
             required: true,
-            message: "租户管理员账号不能为空",
+            message: this.$t('tenant.rules.tenantAccount'),
             trigger: "change",
           },
           { validator: this.tenantAccountValidator, trigger: "blur" },
         ],
         databaseIp: [
-          { required: true, message: "数据库IP不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.databaseIp'), trigger: "blur" },
         ],
         username: [
-          { required: true, message: "用户名不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.username'), trigger: "blur" },
         ],
         password: [
-          { required: true, message: "密码不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.password'), trigger: "blur" },
         ],
         portNumber: [
-          { required: true, message: "端口号不能为空", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.portNumber'), trigger: "blur" },
         ],
       },
       //租户激活码弹窗表单
@@ -667,7 +655,7 @@ export default {
       //租户激活码规则验证
       rulesTenantExpirationTime: {
         tenantExpirationTime: [
-          { required: true, message: "请输入租户激活码", trigger: "blur" },
+          { required: true, message: this.$t('tenant.rules.activationCode'), trigger: "blur" },
         ],
       },
       currentPage: "",
@@ -700,19 +688,18 @@ export default {
       if (!this.form.tenantId) {
         callback();
       }
-      console.log(value, this.form.tenantId, typeof value);
       if (typeof value == "object") {
         let isIncludeCurrentTenant = value.some(
           (item) => item == this.form.tenantId
         );
         if (isIncludeCurrentTenant) {
-          callback(new Error("不能选择自己作为上级租户"));
+          callback(new Error(this.$t('tenant.messages.cannotSelectSelf')));
         } else {
           callback();
         }
       } else {
         if (value == this.form.tenantId) {
-          callback(new Error("不能选择自己作为上级租户"));
+          callback(new Error(this.$t('tenant.messages.cannotSelectSelf')));
         } else {
           callback();
         }
@@ -890,17 +877,15 @@ export default {
     // },
     // 数据库名称校验规则
     databaseNameValidator(rule, value, callback) {
-      // 正则校验
       let regex = /^[a-z][a-z0-9]*$/;
       if (regex.test(value)) {
-        // callback(); // 输入内容符合规则
+        // callback();
       } else {
-        callback(new Error("只能包含小写字母和数字,且以小写字母开头"));
+        callback(new Error(this.$t('tenant.messages.databaseNameFormat')));
       }
-      // 重名校验
       let isRepeat = this.databaseNameList.filter((item) => item == value);
       if (isRepeat.length !== 0) {
-        callback(new Error("数据库名重复"));
+        callback(new Error(this.$t('tenant.messages.databaseNameDuplicate')));
       } else {
         callback();
       }
@@ -1010,11 +995,9 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
-      // // 获取所有租户信息¬
-      console.log("abc")
       this.getTenantAllList();
       this.open = true;
-      this.title = "添加租户信息";
+      this.title = this.$t('tenant.titles.addTenant');
       this.reset();
     },
     /** 修改按钮操作 */
@@ -1031,7 +1014,7 @@ export default {
         }
         this.form.tenantParentId = tempArr;
         this.open = true;
-        this.title = "修改租户信息";
+        this.title = this.$t('tenant.titles.modifyTenant');
       });
     },
     /** 绑定数据源按钮操作 */
@@ -1040,52 +1023,24 @@ export default {
       this.reset1();
       this.dialogLoading = false;
       this.dataSourceOpen = true;
-      this.dataSourceTitle = row.tenantName + "配置数据库";
+      this.dataSourceTitle = row.tenantName + this.$t('tenant.titles.configureDatabase');
       this.fromTenantId = row.tenantId;
       this.dataSourceTypeChange();
-
-      // const tenantId = row.tenantId || this.ids;
-      // getTenant(tenantId).then((response) => {
-      //   this.form = response.data;
-      //   this.open = true;
-      //   this.title = "修改租户信息";
-      // });
     },
     /** 提交按钮 */
-    async submitForm() {
-
-      console.log("租户信息")
-      console.log("租户地址信息:", this.dict.type.system_login_url);
-      let valid = await this.$refs.form.validate();
-      if (!valid) return;
-      if (this.form.tenantParentId.length >= 0) {
-        // 处理当前租户的上级租户id
-        this.form.tenantParentId =
-          this.form.tenantParentId[this.form.tenantParentId.length - 1] !=
-          undefined
-            ? this.form.tenantParentId[this.form.tenantParentId.length - 1]
-            : "";
-      }
-      this.form.tenantClientLoginUrl = this.dict.type.system_login_url
-        .find((item) => item.label == "client_login_url")
-        ?.value.replace("#{val}", this.form.tenantCode);
-      this.form.tenantToolLoginUrl = this.dict.type.system_login_url
-        .find((item) => item.label == "crm_login_url")
-        ?.value.replace("#{val}", this.form.tenantCode);
-      // this.form.tenantClientLoginUrl = this.dict.type.system_login_url.find((item) => item.label == "client_login_url")?.value.replace("#{val}", this.form.tenantCode + "client");
-      // this.form.tenantToolLoginUrl = this.dict.type.system_login_url.find((item) => item.label == "crm_login_url")?.value.replace("#{val}", this.form.tenantCode + "tool");
+    submitForm() {
       this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.form.tenantId != null) {
             updateTenant(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('tenant.messages.modifySuccess'));
               this.reset();
               this.open = false;
               this.getList();
             });
           } else {
             addTenant(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('tenant.messages.addSuccess'));
               this.reset();
               this.open = false;
               this.getList();
@@ -1156,13 +1111,13 @@ export default {
     handleDelete(row) {
       const tenantIds = row.tenantId || this.ids;
       this.$modal
-        .confirm('是否确认删除租户信息编号为"' + tenantIds + '"的数据项?')
+        .confirm(this.$t('tenant.messages.deleteConfirm').replace('{0}', tenantIds))
         .then(function () {
           return delTenant(tenantIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('tenant.messages.deleteSuccess'));
         })
         .catch(() => {});
     },
@@ -1241,11 +1196,10 @@ export default {
             this.tenantExpirationTimeFrom
           );
           if (response.code == 200) {
-            this.$message.success("激活成功");
-            //重新刷新列表
+            this.$message.success(this.$t('tenant.messages.activationSuccess'));
             this.getList();
           } else {
-            this.$message.error("激活失败");
+            this.$message.error(this.$t('tenant.messages.activationFailed'));
           }
           this.tenantExpirationTimeOpen = false;
           this.tenantExpirationTimeFrom = {

+ 107 - 123
zkqy-ui/src/views/system/user/index.vue

@@ -7,37 +7,37 @@
       :inline="true"
       v-show="showSearch"
     >
-      <el-form-item label="角色名称" prop="roleName">
+      <el-form-item :label="$t('user.management.roleName')" prop="roleName">
         <el-input
           v-model="queryParams.roleName"
-          placeholder="请输入角色名称"
+          :placeholder="$t('user.management.pleaseEnterRoleName')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <!-- <el-form-item label="租户名称" prop="tenantName">
+      <!-- <el-form-item :label="$t('user.management.tenantName')" prop="tenantName">
         <el-input
           v-model="queryParams.tenantName"
-          placeholder="请输入租户名称"
+          :placeholder="$t('user.management.pleaseEnterTenantName')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item> -->
-      <el-form-item label="权限字符" prop="roleKey">
+      <el-form-item :label="$t('user.management.permissionChar')" prop="roleKey">
         <el-input
           v-model="queryParams.roleKey"
-          placeholder="请输入权限字符"
+          :placeholder="$t('user.management.pleaseEnterPermissionChar')"
           clearable
           style="width: 240px"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item :label="$t('user.management.status')" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="角色状态"
+          :placeholder="$t('user.management.roleStatus')"
           clearable
           style="width: 240px"
         >
@@ -49,15 +49,15 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="创建时间">
+      <el-form-item :label="$t('user.management.createTime')">
         <el-date-picker
           v-model="dateRange"
           style="width: 240px"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
+          :start-placeholder="$t('user.management.startDate')"
+          :end-placeholder="$t('user.management.endDate')"
         ></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -66,11 +66,9 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-        >搜索</el-button
-        >
+        >{{ $t('user.management.search') }}</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-        >重置</el-button
-        >
+        >{{ $t('user.management.reset') }}</el-button>
       </el-form-item>
     </el-form>
 
@@ -83,8 +81,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:role:add']"
-        >新增</el-button
-        >
+        >{{ $t('user.management.add') }}</el-button>
       </el-col>
       <!-- <el-col :span="1.5">
         <el-button
@@ -107,8 +104,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:role:remove']"
-        >删除</el-button
-        >
+        >{{ $t('user.management.delete') }}</el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -119,8 +115,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:role:export']"
-        >导出</el-button
-        >
+        >{{ $t('user.management.export') }}</el-button>
         <ExcelDownLoad
           v-else
           :headerList="headerList"
@@ -141,28 +136,28 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="角色编号" prop="roleId" width="120" />
+      <el-table-column :label="$t('user.management.roleId')" prop="roleId" width="120" />
       <el-table-column
-        label="角色名称"
+        :label="$t('user.management.roleName')"
         prop="roleName"
         :show-overflow-tooltip="true"
         width="150"
       />
       <el-table-column
-        label="租户名称"
+        :label="$t('user.management.tenantName')"
         prop="tenantName"
         v-if="$store.state.user.name == 'admin'"
         :show-overflow-tooltip="true"
         width="150"
       />
       <el-table-column
-        label="权限字符"
+        :label="$t('user.management.permissionChar')"
         prop="roleKey"
         :show-overflow-tooltip="true"
         width="150"
       />
-      <el-table-column label="显示顺序" prop="roleSort" width="100" />
-      <el-table-column label="状态" align="center" width="100">
+      <el-table-column :label="$t('user.management.displayOrder')" prop="roleSort" width="100" />
+      <el-table-column :label="$t('user.management.status')" align="center" width="100">
         <template slot-scope="scope">
           <el-switch
             v-model="scope.row.status"
@@ -173,7 +168,7 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="创建时间"
+        :label="$t('user.management.createTime')"
         align="center"
         prop="createTime"
         width="180"
@@ -183,63 +178,59 @@
         </template>
       </el-table-column>
       <el-table-column
-        label="操作"
+        :label="$t('user.management.process')"
         align="center"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope" v-if="scope.row.roleId !== 1">
           <el-dropdown>
             <el-button type="warning" plain size="small">
-              处理<i class="el-icon-arrow-down el-icon--right"></i>
+              {{ $t('user.management.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)"
-                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-dropdown
-                size="mini"
-                @command="(command) => handleCommand(command, scope.row)"
-                v-hasPermi="['system:role:edit']"
-              >
+              <el-dropdown-item>
                 <el-button
                   size="mini"
                   type="text"
-                  icon="el-icon-d-arrow-right"
-                >更多</el-button
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:tenant:edit']"
+                >{{ $t('user.management.modify') }}</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']"
+                >{{ $t('user.management.delete') }}</el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-dropdown
+                  size="mini"
+                  @command="(command) => handleCommand(command, scope.row)"
+                  v-hasPermi="['system:role:edit']"
                 >
-                <el-dropdown-menu slot="dropdown">
-                  <el-dropdown-item
-                    command="handleDataScope"
-                    icon="el-icon-circle-check"
-                    v-hasPermi="['system:role:edit']"
-                  >数据权限</el-dropdown-item
-                  >
-                  <el-dropdown-item
-                    command="handleAuthUser"
-                    icon="el-icon-user"
-                    v-hasPermi="['system:role:edit']"
-                  >分配用户</el-dropdown-item
-                  >
-                </el-dropdown-menu>
-              </el-dropdown>
-            </el-dropdown-item>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-d-arrow-right"
+                  >{{ $t('user.management.more') }}</el-button>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item
+                      command="handleDataScope"
+                      icon="el-icon-circle-check"
+                      v-hasPermi="['system:role:edit']"
+                    >{{ $t('user.management.dataPermission') }}</el-dropdown-item>
+                    <el-dropdown-item
+                      command="handleAuthUser"
+                      icon="el-icon-user"
+                      v-hasPermi="['system:role:edit']"
+                    >{{ $t('user.management.assignUser') }}</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
 
@@ -281,8 +272,8 @@
     <!-- 添加或修改角色配置对话框 -->
     <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="roleName">
-          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        <el-form-item :label="$t('user.management.roleName')" prop="roleName">
+          <el-input v-model="form.roleName" :placeholder="$t('user.management.pleaseEnterRoleName')" />
         </el-form-item>
         <el-form-item prop="roleKey">
           <span slot="label">
@@ -292,43 +283,39 @@
             >
               <i class="el-icon-question"></i>
             </el-tooltip>
-            权限字符
+            {{ $t('user.management.permissionChar') }}
           </span>
-          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+          <el-input v-model="form.roleKey" :placeholder="$t('user.management.pleaseEnterPermissionChar')" />
         </el-form-item>
-        <el-form-item label="角色顺序" prop="roleSort">
+        <el-form-item :label="$t('user.management.displayOrder')" prop="roleSort">
           <el-input-number
             v-model="form.roleSort"
             controls-position="right"
             :min="0"
           />
         </el-form-item>
-        <el-form-item label="状态">
+        <el-form-item :label="$t('user.management.status')">
           <el-radio-group v-model="form.status">
             <el-radio
               v-for="dict in dict.type.sys_normal_disable"
               :key="dict.value"
               :label="dict.value"
-            >{{ dict.label }}</el-radio
-            >
+            >{{ dict.label }}</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="菜单权限">
+        <el-form-item :label="$t('user.management.menuPermission')">
           <el-checkbox
             v-model="menuExpand"
             @change="handleCheckedTreeExpand($event, 'menu')"
-          >展开/折叠</el-checkbox
-          >
+          >{{ $t('user.management.expandCollapse') }}</el-checkbox>
           <el-checkbox
             v-model="menuNodeAll"
             @change="handleCheckedTreeNodeAll($event, 'menu')"
-          >全选/全不选</el-checkbox
-          >
+          >{{ $t('user.management.selectAll') }}</el-checkbox>
           <el-checkbox
             v-model="form.menuCheckStrictly"
             @change="handleCheckedTreeConnect($event, 'menu')"
-          >父子联动</el-checkbox
-          >
+          >{{ $t('user.management.parentChildLink') }}</el-checkbox>
           <el-tree
             class="tree-border"
             :data="menuOptions"
@@ -336,21 +323,21 @@
             ref="menu"
             node-key="id"
             :check-strictly="!form.menuCheckStrictly"
-            empty-text="加载中,请稍候"
+            :empty-text="$t('user.management.loading')"
             :props="defaultProps"
           ></el-tree>
         </el-form-item>
-        <el-form-item label="备注">
+        <el-form-item :label="$t('user.management.remark')">
           <el-input
             v-model="form.remark"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('user.management.pleaseEnterContent')"
           ></el-input>
         </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('user.management.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('user.management.cancel') }}</el-button>
       </div>
     </el-dialog>
 
@@ -362,13 +349,13 @@
       append-to-body
     >
       <el-form :model="form" label-width="80px">
-        <el-form-item label="角色名称">
+        <el-form-item :label="$t('user.management.roleName')">
           <el-input v-model="form.roleName" :disabled="true" />
         </el-form-item>
-        <el-form-item label="权限字符">
+        <el-form-item :label="$t('user.management.permissionChar')">
           <el-input v-model="form.roleKey" :disabled="true" />
         </el-form-item>
-        <el-form-item label="权限范围">
+        <el-form-item :label="$t('user.management.permissionScope')">
           <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
             <el-option
               v-for="item in dataScopeOptions"
@@ -378,22 +365,19 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+        <el-form-item :label="$t('user.management.dataPermission')" v-show="form.dataScope == 2">
           <el-checkbox
             v-model="deptExpand"
             @change="handleCheckedTreeExpand($event, 'dept')"
-          >展开/折叠</el-checkbox
-          >
+          >{{ $t('user.management.expandCollapse') }}</el-checkbox>
           <el-checkbox
             v-model="deptNodeAll"
             @change="handleCheckedTreeNodeAll($event, 'dept')"
-          >全选/全不选</el-checkbox
-          >
+          >{{ $t('user.management.selectAll') }}</el-checkbox>
           <el-checkbox
             v-model="form.deptCheckStrictly"
             @change="handleCheckedTreeConnect($event, 'dept')"
-          >父子联动</el-checkbox
-          >
+          >{{ $t('user.management.parentChildLink') }}</el-checkbox>
           <el-tree
             class="tree-border"
             :data="deptOptions"
@@ -402,14 +386,14 @@
             ref="dept"
             node-key="id"
             :check-strictly="!form.deptCheckStrictly"
-            empty-text="加载中,请稍候"
+            :empty-text="$t('user.management.loading')"
             :props="defaultProps"
           ></el-tree>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitDataScope">确 定</el-button>
-        <el-button @click="cancelDataScope">取 消</el-button>
+        <el-button type="primary" @click="submitDataScope">{{ $t('user.management.confirm') }}</el-button>
+        <el-button @click="cancelDataScope">{{ $t('user.management.cancel') }}</el-button>
       </div>
     </el-dialog>
   </div>
@@ -482,24 +466,24 @@ export default {
       dataScopeOptions: [
         {
           value: "1",
-          label: "全部数据权限",
+          label: this.$t('user.management.allData')
         },
         {
           value: "2",
-          label: "自定数据权限",
+          label: this.$t('user.management.customData')
         },
         {
           value: "3",
-          label: "本部门数据权限",
+          label: this.$t('user.management.deptData')
         },
         {
           value: "4",
-          label: "本部门及以下数据权限",
+          label: this.$t('user.management.deptAndBelow')
         },
         {
           value: "5",
-          label: "仅本人数据权限",
-        },
+          label: this.$t('user.management.personalData')
+        }
       ],
       // 菜单列表
       menuOptions: [],
@@ -523,14 +507,14 @@ export default {
       // 表单校验
       rules: {
         roleName: [
-          { required: true, message: "角色名称不能为空", trigger: "blur" },
+          { required: true, message: this.$t('user.management.rules.roleName'), trigger: "blur" }
         ],
         roleKey: [
-          { required: true, message: "权限字符不能为空", trigger: "blur" },
+          { required: true, message: this.$t('user.management.rules.permissionChar'), trigger: "blur" }
         ],
         roleSort: [
-          { required: true, message: "角色顺序不能为空", trigger: "blur" },
-        ],
+          { required: true, message: this.$t('user.management.rules.roleSort'), trigger: "blur" }
+        ]
       },
     };
   },
@@ -601,14 +585,14 @@ export default {
     },
     // 角色状态修改
     handleStatusChange(row) {
-      let text = row.status === "0" ? "启用" : "停用";
+      let text = row.status === "0" ? this.$t('user.management.messages.enableConfirm') : this.$t('user.management.messages.disableConfirm');
       this.$modal
-        .confirm('确认要"' + text + '""' + row.roleName + '"角色吗?')
+        .confirm(text.replace('{0}', row.roleName))
         .then(function () {
           return changeRoleStatus(row.roleId, row.status);
         })
         .then(() => {
-          this.$modal.msgSuccess(text + "成功");
+          this.$modal.msgSuccess(row.status === "0" ? this.$t('user.management.messages.enableSuccess') : this.$t('user.management.messages.disableSuccess'));
         })
         .catch(function () {
           row.status = row.status === "0" ? "1" : "0";
@@ -772,14 +756,14 @@ export default {
           if (this.form.roleId != undefined) {
             this.form.menuIds = this.getMenuAllCheckedKeys();
             updateRole(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('user.management.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             this.form.menuIds = this.getMenuAllCheckedKeys();
             addRole(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('user.management.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -802,13 +786,13 @@ export default {
     handleDelete(row) {
       const roleIds = row.roleId || this.ids;
       this.$modal
-        .confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?')
+        .confirm(this.$t('user.management.messages.deleteConfirm').replace('{0}', roleIds))
         .then(function () {
           return delRole(roleIds);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('user.management.messages.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 63 - 63
zkqy-ui/src/views/tableMange/styleMange/index.vue

@@ -8,42 +8,42 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="样式key" prop="styleKey">
+      <el-form-item :label="$t('system.style.styleKey')" prop="styleKey">
         <el-input
           v-model="queryParams.styleKey"
-          placeholder="请输入样式key"
+          :placeholder="$t('system.style.pleaseEnterStyleKey')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="样式名称" prop="styleName">
+      <el-form-item :label="$t('system.style.styleName')" prop="styleName">
         <el-input
           v-model="queryParams.styleName"
-          placeholder="请输入样式名称"
+          :placeholder="$t('system.style.pleaseEnterStyleName')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="样式描述" prop="styleDescription">
+      <el-form-item :label="$t('system.style.styleDescription')" prop="styleDescription">
         <el-input
           v-model="queryParams.styleDescription"
-          placeholder="请输入样式描述"
+          :placeholder="$t('system.style.pleaseEnterStyleDescription')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="创建者ID" prop="createById">
+      <el-form-item :label="$t('system.style.createById')" prop="createById">
         <el-input
           v-model="queryParams.createById"
-          placeholder="请输入创建者ID"
+          :placeholder="$t('system.style.pleaseEnterCreateById')"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="更新者ID" prop="updateById">
+      <el-form-item :label="$t('system.style.updateById')" prop="updateById">
         <el-input
           v-model="queryParams.updateById"
-          placeholder="请输入更新者ID"
+          :placeholder="$t('system.style.pleaseEnterUpdateById')"
           clearable
           @keyup.enter.native="handleQuery"
         />
@@ -54,10 +54,10 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
+          >{{ $t('system.style.search') }}</el-button
         >
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
+          >{{ $t('system.style.reset') }}</el-button
         >
       </el-form-item>
     </el-form>
@@ -71,7 +71,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:style:add']"
-          >新增</el-button
+          >{{ $t('system.style.add') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -83,7 +83,7 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['system:style:edit']"
-          >修改</el-button
+          >{{ $t('system.style.modify') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -95,7 +95,7 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:style:remove']"
-          >删除</el-button
+          >{{ $t('system.style.delete') }}</el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -107,7 +107,7 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:style:export']"
-          >导出</el-button
+          >{{ $t('system.style.export') }}</el-button
         >
         <ExcelDownLoad
           v-else
@@ -129,25 +129,20 @@
       @selection-change="handleSelectionChange"
     >
       <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="styleKey" /> -->
-      <el-table-column label="样式名称" align="center" prop="styleName" />
-      <el-table-column label="样式类型" align="center" prop="styleType">
+      <el-table-column :label="$t('system.style.id')" align="center" prop="id" />
+      <el-table-column :label="$t('system.style.styleName')" align="center" prop="styleName" />
+      <el-table-column :label="$t('system.style.styleType')" align="center" prop="styleType">
         <template slot-scope="scope">
           {{ theGetDictLabel(scope.row.styleType, dict.type.table_style_type) }}
         </template>
       </el-table-column>
-      <!-- <el-table-column label="样式代码" align="center" prop="styleCode" /> -->
       <el-table-column
-        label="样式描述"
+        :label="$t('system.style.styleDescription')"
         align="center"
         prop="styleDescription"
       />
-      <!-- <el-table-column label="样式状态" align="center" prop="styleStatus" /> -->
-      <!-- <el-table-column label="创建者ID" align="center" prop="createById" />
-      <el-table-column label="更新者ID" align="center" prop="updateById" /> -->
       <el-table-column
-        label="操作"
+        :label="$t('system.style.operation')"
         align="center"
         class-name="small-padding fixed-width"
       >
@@ -158,7 +153,7 @@
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:style:edit']"
-            >修改</el-button
+            >{{ $t('system.style.modify') }}</el-button
           >
           <el-button
             size="mini"
@@ -166,7 +161,7 @@
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['system:style:remove']"
-            >删除</el-button
+            >{{ $t('system.style.delete') }}</el-button
           >
         </template>
       </el-table-column>
@@ -183,16 +178,13 @@
     <!-- 添加或修改动态格样式模板对话框 -->
     <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="样式key" prop="styleKey">
-          <el-input v-model="form.styleKey" placeholder="请输入样式key" />
-        </el-form-item> -->
-        <el-form-item label="样式名称" prop="styleName">
-          <el-input v-model="form.styleName" placeholder="请输入样式名称" />
+        <el-form-item :label="$t('system.style.styleName')" prop="styleName">
+          <el-input v-model="form.styleName" :placeholder="$t('system.style.pleaseEnterStyleName')" />
         </el-form-item>
-        <el-form-item label="样式类型" prop="styleType">
+        <el-form-item :label="$t('system.style.styleType')" prop="styleType">
           <el-select
             v-model="form.styleType"
-            placeholder="请选择样式类型"
+            :placeholder="$t('system.style.pleaseSelectStyleType')"
             filterable
           >
             <el-option
@@ -204,33 +196,23 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="样式代码" prop="styleCode">
+        <el-form-item :label="$t('system.style.styleCode')" prop="styleCode">
           <el-input
             v-model="form.styleCode"
             type="textarea"
-            placeholder="请输入内容"
+            :placeholder="$t('system.style.pleaseEnterContent')"
           />
-          <!-- <el-button icon="el-icon-edit" @click="drawerOpenHandler"></el-button> -->
         </el-form-item>
-        <el-form-item label="样式描述" prop="styleDescription">
+        <el-form-item :label="$t('system.style.styleDescription')" prop="styleDescription">
           <el-input
             v-model="form.styleDescription"
-            placeholder="请输入样式描述"
+            :placeholder="$t('system.style.pleaseEnterStyleDescription')"
           />
         </el-form-item>
-        <!-- <el-form-item label="删除标志" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
-        </el-form-item>
-        <el-form-item label="创建者ID" prop="createById">
-          <el-input v-model="form.createById" placeholder="请输入创建者ID" />
-        </el-form-item>
-        <el-form-item label="更新者ID" prop="updateById">
-          <el-input v-model="form.updateById" placeholder="请输入更新者ID" />
-        </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('system.role.confirm') }}</el-button>
+        <el-button @click="cancel">{{ $t('system.role.cancel') }}</el-button>
       </div>
     </el-dialog>
     <el-drawer
@@ -313,16 +295,16 @@ export default {
       // 表单校验
       rules: {
         styleName: [
-          { required: true, message: "请输入样式名", trigger: "blur" },
+          { required: true, message: this.$t('system.style.rules.styleName'), trigger: "blur" },
         ],
         styleType: [
-          { required: true, message: "请选择样式类型", trigger: "change" },
+          { required: true, message: this.$t('system.style.rules.styleType'), trigger: "change" },
         ],
         styleCode: [
-          { required: true, message: "请输入样式代码", trigger: "blur" },
+          { required: true, message: this.$t('system.style.rules.styleCode'), trigger: "blur" },
         ],
         styleDescription: [
-          { required: true, message: "请输入样式样式描述", trigger: "blur" },
+          { required: true, message: this.$t('system.style.rules.styleDescription'), trigger: "blur" },
         ],
       },
       // 代码编辑器
@@ -338,7 +320,7 @@ export default {
     getList() {
       this.loading = true;
       listStyle(this.queryParams).then((response) => {
-        this.styleList = response.rows;
+        this.styleList = response?.rows;
         this.total = response.total;
         this.loading = false;
       });
@@ -378,7 +360,25 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
+      // this.resetForm("queryForm");
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        styleKey: null,
+        styleName: null,
+        styleType: null,
+        styleCode: null,
+        styleDescription: null,
+        styleStatus: null,
+        createById: null,
+        updateById: null
+      };
+      
+      this.$nextTick(() => {
+        if (this.$refs.queryForm) {
+          this.$refs.queryForm.resetFields();
+        }
+      });
       this.handleQuery();
     },
     // 多选框选中数据
@@ -392,7 +392,7 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加动态格样式模板";
+      this.title = this.$t('system.style.titles.addStyle');
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -401,7 +401,7 @@ export default {
       getStyle(id).then((response) => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改动态格样式模板";
+        this.title = this.$t('system.style.titles.modifyStyle');
       });
     },
     /** 提交按钮 */
@@ -410,13 +410,13 @@ export default {
         if (valid) {
           if (this.form.id != null) {
             updateStyle(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
+              this.$modal.msgSuccess(this.$t('system.style.messages.modifySuccess'));
               this.open = false;
               this.getList();
             });
           } else {
             addStyle(this.form).then((response) => {
-              this.$modal.msgSuccess("新增成功");
+              this.$modal.msgSuccess(this.$t('system.style.messages.addSuccess'));
               this.open = false;
               this.getList();
             });
@@ -428,13 +428,13 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$modal
-        .confirm('是否确认删除动态格样式模板编号为"' + ids + '"的数据项?')
+        .confirm(this.$t('system.style.messages.deleteConfirm', [ids]))
         .then(function () {
           return delStyle(ids);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess(this.$t('system.style.messages.deleteSuccess'));
         })
         .catch(() => {});
     },

+ 1 - 1
zkqy-ui/src/views/tool/build/IconsDialog.vue

@@ -14,7 +14,7 @@
           v-model="key"
           size="mini"
           :style="{width: '260px'}"
-          placeholder="请输入图标名称"
+          :placeholder="$t('system.menu.enterTheName')"
           prefix-icon="el-icon-search"
           clearable
         />