tangning 1 vuosi sitten
vanhempi
commit
5e52c38646
89 muutettua tiedostoa jossa 4798 lisäystä ja 6900 poistoa
  1. 15 0
      src/locales/lang/en.ts
  2. 32 81
      src/locales/lang/en/code.ts
  3. 54 41
      src/locales/lang/en/common.ts
  4. 57 57
      src/locales/lang/en/component.ts
  5. 93 99
      src/locales/lang/en/layout.ts
  6. 7 0
      src/locales/lang/en/routes/account.ts
  7. 1 1
      src/locales/lang/en/routes/basic.ts
  8. 7 7
      src/locales/lang/en/routes/config.ts
  9. 67 8
      src/locales/lang/en/routes/dashboard.ts
  10. 100 116
      src/locales/lang/en/routes/demo.ts
  11. 20 20
      src/locales/lang/en/routes/device.ts
  12. 0 75
      src/locales/lang/en/routes/equity.ts
  13. 17 17
      src/locales/lang/en/routes/finance.ts
  14. 9 0
      src/locales/lang/en/routes/operate.ts
  15. 40 0
      src/locales/lang/en/routes/product.ts
  16. 30 31
      src/locales/lang/en/routes/retailer.ts
  17. 41 97
      src/locales/lang/en/routes/scene.ts
  18. 67 67
      src/locales/lang/en/routes/system.ts
  19. 77 97
      src/locales/lang/en/sys.ts
  20. 8 5
      src/locales/lang/ja.ts
  21. 83 0
      src/locales/lang/ja/code.ts
  22. 43 0
      src/locales/lang/ja/common.ts
  23. 123 0
      src/locales/lang/ja/component.ts
  24. 95 0
      src/locales/lang/ja/layout.ts
  25. 4 0
      src/locales/lang/ja/routes/basic.ts
  26. 9 0
      src/locales/lang/ja/routes/config.ts
  27. 13 0
      src/locales/lang/ja/routes/dashboard.ts
  28. 199 0
      src/locales/lang/ja/routes/demo.ts
  29. 26 0
      src/locales/lang/ja/routes/device.ts
  30. 27 0
      src/locales/lang/ja/routes/finance.ts
  31. 44 0
      src/locales/lang/ja/routes/retailer.ts
  32. 107 0
      src/locales/lang/ja/routes/scene.ts
  33. 83 0
      src/locales/lang/ja/routes/system.ts
  34. 118 0
      src/locales/lang/ja/sys.ts
  35. 939 0
      src/locales/lang/json/en.json
  36. 926 0
      src/locales/lang/json/ja.json
  37. 1013 0
      src/locales/lang/json/zh.json
  38. 1 0
      src/locales/lang/zh-CN/common.ts
  39. 0 50
      src/locales/lang/zh-CN/routes/dashboard.ts
  40. 140 147
      src/locales/lang/zh-CN/routes/demo.ts
  41. 20 20
      src/locales/lang/zh-CN/routes/device.ts
  42. 0 76
      src/locales/lang/zh-CN/routes/equity.ts
  43. 2 0
      src/locales/lang/zh-CN/routes/scene.ts
  44. 3 1
      src/locales/lang/zh_CN.ts
  45. 4 0
      src/settings/localeSetting.ts
  46. 3 3
      src/views/config/index.vue
  47. 0 44
      src/views/dashboard/analysis/components/GrowCard.vue
  48. 0 63
      src/views/dashboard/analysis/components/SalesProductPie.vue
  49. 0 38
      src/views/dashboard/analysis/components/SiteAnalysis.vue
  50. 0 106
      src/views/dashboard/analysis/components/VisitAnalysis.vue
  51. 0 58
      src/views/dashboard/analysis/components/VisitAnalysisBar.vue
  52. 0 100
      src/views/dashboard/analysis/components/VisitRadar.vue
  53. 0 80
      src/views/dashboard/analysis/components/VisitSource.vue
  54. 0 165
      src/views/dashboard/analysis/components/lineEcharts.vue
  55. 0 156
      src/views/dashboard/analysis/components/lineEcharts2.vue
  56. 0 165
      src/views/dashboard/analysis/components/orderEchart.vue
  57. 0 52
      src/views/dashboard/analysis/components/props.ts
  58. 0 60
      src/views/dashboard/analysis/data.ts
  59. 0 209
      src/views/dashboard/analysis/index.vue
  60. 0 100
      src/views/dashboard/test/index.vue
  61. 0 31
      src/views/dashboard/workbench/components/DynamicInfo.vue
  62. 0 34
      src/views/dashboard/workbench/components/ProjectCard.vue
  63. 0 19
      src/views/dashboard/workbench/components/QuickNav.vue
  64. 0 100
      src/views/dashboard/workbench/components/SaleRadar.vue
  65. 0 33
      src/views/dashboard/workbench/components/WorkbenchHeader.vue
  66. 0 156
      src/views/dashboard/workbench/components/data.ts
  67. 0 36
      src/views/dashboard/workbench/index.vue
  68. 0 142
      src/views/device/OutflowModal.vue
  69. 0 140
      src/views/device/batchPutModal.vue
  70. 0 222
      src/views/device/detailsMoadl.vue
  71. 0 185
      src/views/device/distributeModal.vue
  72. 0 402
      src/views/device/index.vue
  73. 0 126
      src/views/device/putModal.vue
  74. 0 170
      src/views/equity/DownModal.vue
  75. 0 207
      src/views/equity/EditModal.vue
  76. 0 339
      src/views/equity/InvoiceModal.vue
  77. 0 247
      src/views/equity/data.tsx
  78. 0 195
      src/views/equity/index.vue
  79. 0 153
      src/views/finance/EditModal.vue
  80. 0 44
      src/views/finance/GrowCard.vue
  81. 0 193
      src/views/finance/InvoiceModal.vue
  82. 0 269
      src/views/finance/data.tsx
  83. 0 230
      src/views/finance/index.vue
  84. 0 243
      src/views/retailer/AddModal.vue
  85. 0 214
      src/views/retailer/EditModal.vue
  86. 0 252
      src/views/retailer/index.vue
  87. 3 3
      src/views/scene/list.vue
  88. 3 3
      src/views/scene/modal/SyncModal.vue
  89. 25 0
      translate.js

+ 15 - 0
src/locales/lang/en.ts

@@ -0,0 +1,15 @@
+import { genMessage } from '../helper';
+import antdLocale from 'ant-design-vue/es/locale/en_US';
+import momentLocale from 'moment/dist/locale/en-au';
+import en from './json/en.json';
+const modules = import.meta.globEager('./en/**/*.ts');
+console.log('genMessageen', genMessage(modules, 'en'));
+export default {
+  message: {
+    ...genMessage(modules, 'en'),
+    // ...en,
+    antdLocale,
+  },
+  momentLocale,
+  momentLocaleName: 'en',
+};

+ 32 - 81
src/locales/lang/en/code.ts

@@ -1,83 +1,34 @@
 export default {
-  500: 'システム例外',
-  3001: '必要なパラメータがありません',
-  3002: 'アクセス例外',
-  3003: '異常なアクセス',
-  3004: 'ユーザーがログインしていません',
-  3005: '確認コードの有効期限が切れています',
-  3006: '検証コードエラー',
-  3007: 'ニックネームは存在します',
-  3008: 'このメールアドレスは既に登録されています',
-  3009: '入力した2つのパスワードが一致しません',
-  3010: 'ニックネームの長さが間違いします',
-  3011: 'パスワードの長さは、英語の大文字と小文字、数字、および8~16文字です',
-  3012: '不適切な内容が含まれています。',
-  3013: '電話番号のフォーマットが間違います',
-  3014: 'アカウントまたはパスワードが誤っています。',
-  3015: 'ユーザーが存在しません',
-  3016: 'ログインに失敗しました。アカ​​ウントへのアクセスが許可されていません',
-  3017: '空のファイル',
-  3018: 'アップロードまたは使用できるファイルがありません。',
-  3019: 'メールの格式が合わないです。',
-  3020: 'メールアドレスが存在しています',
-  3021: 'アカウントが存在しません。確認して再入力してください。',
-  3022: 'このシーンにコラボレーターが追加されました。追加する前にコラボレーションをキャンセルしてください',
-  3023: '確認コードを取得する回数が多すぎます。明日もう一度お試しください',
-  3024: 'シーンを自分自身に割り当てることはできません',
-  3025: 'カメラを自分自身に割り当てることができません',
-  3026: '一部のシーンには共同編集者がいます。追加する前に共同作業をキャンセルしてください',
-  3027: '元のパスワードが間違います',
-  3028: '役割は存在します',
-  3029: '役割に関連付けられているユーザーがいます。ユーザーを削除、または属する役割を変更してください',
-  3030: '現在の会員特典はありません',
-  3031: 'カメラがバインドされています',
-  3032: '現在のカメラはバインドされています。別のカメラを選択してください',
-  3033: '確認コードを60秒以内に繰り返し取得することはできません',
-  3034: 'サーバーがビジーです。もう一度お試しください',
-  3035: 'ログインアカウントが承認されていません。もう一度お試しください',
-
-  4001: 'タイムアウトしました',
-  4002: 'ユーザーは既に存在します',
-  4003: '電話番号はすでに登録されています',
-  4004: '2回入力したパスワードが一致しません',
-  4005: '電話番号が確認コードと一致しません',
-  4006: '検証コードがエラー',
-  4007: 'ユーザー名は存在しません',
-  4008: 'ユーザーがログインしていません',
-  4009: 'エラー',
-  4010: 'バウンドカメラが存在しません',
-  4011: 'カメラはすでにバインドされています',
-  4012: 'ユーザーネームまたはパスワードが違います',
-  4013: 'ニックネームが重複しています',
-  4014: '残高が足りないので、モデルの生成ができません。ホームページからチャージまたは、アップロード時にモデル生成オプションを削除してください。',
-  4015: '不適切な内容が含まれています。',
-  4016: 'パラメータが空です',
-  4017: 'シーンは空です',
-  4018: 'シーンはこのカメラに属していません',
-  4019: 'シーン番号が空です',
-  4020: 'カメラはユーザーにバインドされていません',
-  4021: '注文はすでに請求されているので、失敗しました。',
-
-  5010: 'コピーに失敗しました。シーンのファイルが破損しています。',
-  5011: 'シーンは既にアーカイブされています。',
-  5013: 'シーンはアーカイブされてないため、復元できません。',
-  5014: 'シーンは既にインバイトされています。',
-  5015: 'この下請は存在しません。',
-  5016: '同じカメラが登録されていません。',
-  5017: 'レーザーエラー',
-  5018: '同じ企業アカウントはインバイトできません。',
-  5019: 'シーンを撮影した企業アカウントが存在しません。',
-  5020: '元請が存在しまん。',
-  5021: 'アーカイブに失敗しました。シーンが計算中です。',
-  5022: 'このシーンは点群モードのみ操作可能です。',
-  5023: 'このシーンはOBJの生成をサポートしません',
-  5024: '協同エディットに失敗、企業管理アカウントを入力してください。',
-
-  5025: '场景已生成obj',
-  5026: '场景已在改相机,无需迁移',
-  5027: '相机类型不同,不能迁移',
-
-  50006: 'メール送信テンプレートが存在しません',
-  50050: '長さが限界を超えています!',
-  50051: '記録が見当たりませんでした!',
+  '500': 'System abnormality',
+  '3004': 'User not logged in',
+  '3011':
+    'Password must contain uppercase and lowercase English letters, numbers, and be 8-16 characters long',
+  '3014': 'Account or password is incorrect',
+  '3027': 'Original password is incorrect',
+  '4001': 'No such role',
+  '4002': 'No such permission',
+  '4003': 'Mobile phone number has been registered',
+  '4004': 'Parameter missing',
+  '4007': 'User name does not exist',
+  '5010': 'Copy failed, scene resource file is incorrect',
+  '5011': 'Scene has been archived, no need to archive again',
+  '5013': 'Scene has not been archived, no need to restore',
+  '5014': 'The scene has been collaborated and cannot be collaborated again',
+  '5015': 'The contractor does not exist',
+  '5016': 'The restored camera type is different',
+  '5017': 'Laser system error',
+  '5018': 'Scene collaboration failed, please do not collaborate within the same company',
+  '5019':
+    'The company to which the scene belongs does not exist, or the company administrator does not exist',
+  '5020': 'General contractor does not exist',
+  '5021': 'Archive failed, the scene is not calculated',
+  '5022': 'Only laser scenes can be operated',
+  '5023': 'The current scene does not support the generation of obj',
+  '5024': 'Scene collaboration failed, please fill in the company administrator account',
+  '5025': 'Scene has generated obj',
+  '5026': 'The scene is already changing the camera, no migration is required',
+  '5027': 'The camera type is different and cannot be migrated',
+  '50006': 'The email sending template does not exist',
+  '50050': 'The length exceeds the limit! ',
+  '50051': 'The record cannot be found! ',
 };

+ 54 - 41
src/locales/lang/en/common.ts

@@ -1,43 +1,56 @@
 export default {
-  state: '調子',
-  type: 'の種類',
-  fullName: '名前',
-  print: 'プリント',
-  all: 'すべて',
-  optSuccess: '完了',
-  okText: '確認',
-  closeText: '閉じる',
-  cancelText: 'キャンセル',
-  searchText: '探す',
-  queryText: '検索実行',
-  inputText: '入力してください',
-  chooseText: '選択してください。',
-  edit: '編集',
-  redo: 'リフレッシュ',
-  light: '明るいテーマ',
-  optFail: '失敗しました!',
-  notConnect: 'まだ接続されていません',
-  delConfirm: '削除しますか?',
-  mobile: '携帯電話',
-  phone: '携帯電話番号を入力してください!',
-  phoneError: '携帯電話番号を正しく入力してください!',
-  isConfirm: 'よろしいですか?',
-  dark: 'ダークテーマ',
-  unbind: '解放',
-  details: '詳細',
-  bind: 'バインディング',
-  yes: 'はい',
-  no: 'いいえ',
-  roleName: '権限',
-  roleNameText: '役割名です',
-  unusual: '異常な',
-  operation: 'エディット',
-  delText: '削除',
-  operating: 'エディット',
-  resetText: 'リセット',
-  loadingText: '読み込み中...',
-  saveText: '保存',
-  back: '戻る',
-  checkTips: 'プロンプトを確認',
-  unNormal: '異常な',
+  okText: 'Confirm',
+  closeText: 'Close',
+  cancelText: 'Cancel',
+  EditorNot: 'Cancel editing',
+  loadingText: 'Loading...',
+  saveText: 'Save',
+  delText: 'Delete',
+  operating: 'Operation',
+  resetText: 'Reset',
+  searchText: 'Search',
+  queryText: 'Query',
+  inputText: 'Please enter',
+  chooseText: 'Please choose',
+  edit: 'Edit',
+  redo: 'Refresh',
+  see: 'View',
+  back: 'Back',
+  checkTips: 'Verification Tips',
+  light: 'Light theme',
+  dark: 'Dark theme',
+  unbind: 'Unbind',
+  details: 'Details',
+  bind: 'Bind',
+  yes: 'Yes',
+  no: 'No',
+  roleName: 'Role',
+  roleNameText: 'Role Name',
+  addRoleName: 'Add a new role',
+  editRoleName: 'Edit a role',
+  submitState: 'Submitted successfully! ',
+
+  unusual: 'Abnormal',
+  operation: 'Operation',
+  normal: 'Normal',
+  unNormal: 'Unnormal',
+  state: 'State',
+  type: 'Type',
+  fullName: 'Staff Name',
+  print: 'Print',
+  all: 'All',
+  tips: 'Tips',
+  optSuccess: 'Operation successful!',
+  optFail: 'Operation failed!',
+  notConnect: 'Not connected yet',
+  delConfirm: 'Confirm to delete',
+  mobile: 'Mobile phone',
+  phone: 'Please fill in your mobile phone number! ',
+  phoneError: 'Please fill in your mobile phone number correctly! ',
+  staffPhoneError: 'Please fill in your corporate account correctly! ',
+  uploadMessge: 'Please select the file to upload',
+  userNick: 'Please enter the employee name',
+  userCorrectNameNick: 'Please enter the correct employee name',
+  warning: 'Warning',
+  reminder: 'Warm reminder',
 };

+ 57 - 57
src/locales/lang/en/component.ts

@@ -1,26 +1,26 @@
 export default {
   app: {
     searchNotData: 'No search results yet',
-    toSearch: 'to search',
-    toNavigate: 'to navigate',
+    toSearch: 'Confirm',
+    toNavigate: 'Switch',
   },
   countdown: {
-    normalText: 'Get SMS code',
-    sendText: 'Reacquire in {0}s',
+    normalText: 'Get verification code',
+    sendText: 'Get again after {0} seconds',
   },
   cropper: {
-    selectImage: 'Select Image',
-    uploadSuccess: 'Uploaded success!',
-    modalTitle: 'Avatar upload',
+    selectImage: 'Select image',
+    uploadSuccess: 'Upload successful',
+    modalTitle: 'Upload avatar',
     okText: 'Confirm and upload',
     btn_reset: 'Reset',
     btn_rotate_left: 'Counterclockwise rotation',
     btn_rotate_right: 'Clockwise rotation',
-    btn_scale_x: 'Flip horizontal',
-    btn_scale_y: 'Flip vertical',
+    btn_scale_x: 'Horizontal flip',
+    btn_scale_y: 'Vertical flip',
     btn_zoom_in: 'Zoom in',
     btn_zoom_out: 'Zoom out',
-    preview: 'Preivew',
+    preview: 'Preview',
   },
   drawer: {
     loadingText: 'Loading...',
@@ -33,13 +33,14 @@ export default {
     fileName: 'File name',
   },
   form: {
-    putAway: 'Put away',
-    unfold: 'Unfold',
+    putAway: 'Collapse',
+    unfold: 'Expand',
+
     maxTip: 'The number of characters should be less than {0}',
-    apiSelectNotFound: 'Wait for data loading to complete...',
+    apiSelectNotFound: 'Please wait for data to load...',
   },
   icon: {
-    placeholder: 'Click the select icon',
+    placeholder: 'Click to select icon',
     search: 'Search icon',
     copy: 'Copy icon successfully!',
   },
@@ -56,74 +57,73 @@ export default {
   table: {
     settingDens: 'Density',
     settingDensDefault: 'Default',
-    settingDensMiddle: 'Middle',
+    settingDensMiddle: 'Medium',
     settingDensSmall: 'Compact',
     settingColumn: 'Column settings',
     settingColumnShow: 'Column display',
-    settingIndexColumnShow: 'Index Column',
-    settingSelectColumnShow: 'Selection Column',
-    settingFixedLeft: 'Fixed Left',
-    settingFixedRight: 'Fixed Right',
-    settingFullScreen: 'Full Screen',
-    index: 'Index',
-    total: 'total of {total}',
+    settingIndexColumnShow: 'Order column',
+    settingSelectColumnShow: 'Check column',
+    settingFixedLeft: 'Fixed to the left',
+    settingFixedRight: 'Fixed to the right',
+    settingFullScreen: 'Full screen',
+    index: 'Order number',
+
+    total: 'Total {total} data',
   },
   time: {
-    before: ' ago',
-    after: ' after',
-    just: 'just now',
-    seconds: ' seconds',
-    minutes: ' minutes',
-    hours: ' hours',
-    days: ' days',
+    before: 'Before',
+    after: 'After',
+    just: 'Just now',
+    seconds: 'Seconds',
+    minutes: 'Minutes',
+    hours: 'Hours',
+    days: 'days',
   },
   tree: {
-    selectAll: 'Select All',
-    unSelectAll: 'Cancel Select',
-    expandAll: 'Expand All',
+    selectAll: 'Select all',
+    unSelectAll: 'Unselect',
+    expandAll: 'Expand all',
     unExpandAll: 'Collapse all',
-
     checkStrictly: 'Hierarchical association',
     checkUnStrictly: 'Hierarchical independence',
   },
   upload: {
     save: 'Save',
     upload: 'Upload',
-    imgUpload: 'ImageUpload',
+    imgUpload: 'Image upload',
     uploaded: 'Uploaded',
-
-    operating: 'Operating',
+    operating: 'Operation',
     del: 'Delete',
-    download: 'download',
-    saveWarn: 'Please wait for the file to upload and save!',
-    saveError: 'There is no file successfully uploaded and cannot be saved!',
-
+    download: 'Download',
+    saveWarn: 'Please wait for the file to be uploaded before saving!',
+    saveError: 'No files were uploaded successfully, cannot be saved!',
     preview: 'Preview',
-    choose: 'Select the file',
-
+    choose: 'Choose a file',
     accept: 'Support {0} format',
-    acceptUpload: 'Only upload files in {0} format',
-    maxSize: 'A single file does not exceed {0}MB ',
-    maxSizeMultiple: 'Only upload files up to {0}MB!',
-    maxNumber: 'Only upload up to {0} files',
+    acceptUpload: 'Only {0} format files can be uploaded',
+    maxSize: 'Single file does not exceed {0}MB',
+    maxSizeMultiple: 'Only upload files not exceeding {0}MB!',
+    maxNumber: 'Only upload {0} files at most',
 
-    legend: 'Legend',
+    legend: 'Thumbnail',
     fileName: 'File name',
     fileSize: 'File size',
-    fileStatue: 'File status',
+    fileStatue: 'Status',
 
-    startUpload: 'Start upload',
-    uploadSuccess: 'Upload successfully',
+    startUpload: 'Start uploading',
+    uploadSuccess: 'Upload successful',
     uploadError: 'Upload failed',
     uploading: 'Uploading',
-    uploadWait: 'Please wait for the file upload to finish',
-    reUploadFailed: 'Re-upload failed files',
+    uploadWait: 'Please wait for the file to upload before operating',
+    reUploadFailed: 'Re-upload the failed file',
   },
   verify: {
-    error: 'verification failed!',
-    time: 'The verification is successful and it takes {time} seconds!',
-    redoTip: 'Click the picture to refresh',
-    dragText: 'Hold down the slider and drag',
-    successText: 'Verified',
+    error: 'Verification failed! ',
+    time: 'Verification successful, took {time} seconds! ',
+
+    redoTip: 'Click the image to refresh',
+
+    dragText: 'Please hold down the slider and drag',
+    successText: 'Verification passed',
   },
 };

+ 93 - 99
src/locales/lang/en/layout.ts

@@ -1,116 +1,110 @@
 export default {
-  footer: { onlinePreview: 'オンラインプレビュー', onlineDocument: 'オンラインドキュメント' },
+  footer: { onlinePreview: 'Online preview', onlineDocument: 'Online document' },
   header: {
     // user dropdown
-    dropdownItemDoc: 'ドキュメント',
-    dropdownItemLoginOut: 'ログアウト',
+    dropdownItemDoc: 'Change password',
+    dropdownItemLoginOut: 'Exit system',
 
     // tooltip
-    tooltipErrorLog: 'エラーログ',
-    tooltipLock: 'ロック画面',
-    tooltipNotify: 'お知らせ',
-
-    tooltipEntryFull: '全画面表示',
-    tooltipExitFull: '全画面表示を終了',
+    tooltipErrorLog: 'Error log',
+    tooltipLock: 'Lock screen',
+    tooltipNotify: 'Message notification',
+    tooltipEntryFull: 'Full screen',
+    tooltipExitFull: 'Exit full screen',
 
     // lock
-    lockScreenPassword: 'ロック画面のパスワード',
-    lockScreen: 'ロック画面',
-    lockScreenBtn: 'ロック',
-
-    home: 'ホームページ',
-    personalSetting: 'アカウントの設定',
+    lockScreenPassword: 'Lock screen password',
+    lockScreen: 'Lock screen',
+    lockScreenBtn: 'Lock',
+    home: 'Home page',
   },
   multipleTab: {
-    reload: 'リロード',
-    close: 'タブを閉じる',
-    closeLeft: '左のタブを閉じる',
-    closeRight: '右タブを閉じる',
-    closeOther: '他のタブを閉じる',
-    closeAll: 'すべてのタブを閉じる',
+    reload: 'Reload',
+    close: 'Close tab',
+    closeLeft: 'Close left tab',
+    closeRight: 'Close the right tab',
+    closeOther: 'Close other tabs',
+    closeAll: 'Close all tabs',
   },
   setting: {
     // content mode
-    contentModeFull: 'ストリーミング',
-    contentModeFixed: '固定幅',
+    contentModeFull: 'Streaming',
+    contentModeFixed: 'Fixed width',
     // topMenu align
-    topMenuAlignLeft: '左揃え',
-    topMenuAlignRight: '右揃え',
-    topMenuAlignCenter: '中央揃え',
+    topMenuAlignLeft: 'Left',
+    topMenuAlignRight: 'Center',
+    topMenuAlignCenter: 'Right',
     // menu trigger
-    menuTriggerNone: '非表示',
-    menuTriggerBottom: '下部',
-    menuTriggerTop: '上部',
+    menuTriggerNone: 'Not displayed',
+    menuTriggerBottom: 'Bottom',
+    menuTriggerTop: 'Top',
     // menu type
-    menuTypeSidebar: '左メニューモード',
-    menuTypeMixSidebar: '左メニューブレンドモード',
-    menuTypeMix: 'トップメニューブレンドモード',
-    menuTypeTopMenu: 'トップメニューモード',
-
-    on: 'オン',
-    off: 'オフ',
-    minute: '分',
-
-    operatingTitle: '成功',
-    operatingContent: 'コピーが完了しました。src/settings/projectSetting.ts に設定が保存されます!',
-    resetSuccess: 'リセットが完了しました',
-
-    copyBtn: 'コピー',
-    clearBtn: 'キャッシュをクリアしてログインページに戻る',
-
-    drawerTitle: '設定',
-
-    darkMode: 'テーマ',
-    navMode: 'ナビゲーションバーモード',
-    interfaceFunction: '界面機能',
-    interfaceDisplay: '界面表示',
-    animation: 'アニメーション',
-    splitMenu: '分割メニュー',
-    closeMixSidebarOnChange: 'ページクローズメニューの切り替え',
-
-    sysTheme: 'システムテーマ',
-    headerTheme: 'トップバーのテーマ',
-    sidebarTheme: 'メニューテーマ',
-
-    menuDrag: 'サイドメニュードラッグ',
-    menuSearch: 'メニュー検索',
-    menuAccordion: 'サイドメニューアコーディオンモード',
-    menuCollapse: '折りたたみメニュー',
-    collapseMenuDisplayName: 'メニュー表示名を折りたたむ',
-    topMenuLayout: 'トップメニューのレイアウト',
-    menuCollapseButton: 'メニュー折りたたみボタン',
-    contentMode: 'コンテンツ領域の幅',
-    expandedMenuWidth: 'メニュー拡張幅',
-
-    breadcrumb: '参照パス',
-    breadcrumbIcon: '参照パスアイコン',
-    tabs: 'タブ',
-    tabDetail: 'タグの詳細ページ',
-    tabsQuickBtn: 'タブショートカットボタン',
-    tabsRedoBtn: 'タブ更新ボタン',
-    tabsFoldBtn: 'サイドメニュー折りたたみボタン',
-    sidebar: '左メニュー',
-    header: 'トップバー',
-    footer: 'フッター',
-    fullContent: 'フルスクリーンコンテンツ',
-    grayMode: 'グレーモード',
-    colorWeak: '色弱モード',
-
-    progress: 'トッププログレスバー',
-    switchLoading: 'トグルloading',
-    switchAnimation: 'アニメーションを切り替える',
-    animationType: 'アニメーションの種類',
-
-    autoScreenLock: '一定時間で画面ロック',
-    notAutoScreenLock: '一定時間で画面ロックしない',
-
-    fixedHeader: '固定header',
-    fixedSideBar: '固定Sidebar',
-
-    mixSidebarTrigger: 'ハイブリッドメニュートリガー方式',
-    triggerHover: 'ホバーをトリガー',
-    triggerClick: 'クリック',
-
-    mixSidebarFixed: '展開メニューを修正',
+    menuTypeSidebar: 'Left menu mode',
+    menuTypeMixSidebar: 'Left menu mixed mode',
+    menuTypeMix: 'Top menu mixed mode',
+    menuTypeTopMenu: 'Top menu mode',
+    menuDistribution: 'Menu distribution',
+    setRoles: 'Modify permissions',
+
+    on: 'On',
+    off: 'Off',
+    minute: 'Minutes',
+
+    operatingTitle: 'Operation successful',
+    operatingContent:
+      'Copy successfully, please modify the configuration in src/settings/projectSetting.ts! ',
+    resetSuccess: 'Reset successful! ',
+
+    copyBtn: 'Copy',
+    clearBtn: 'Clear cache and return to login page',
+
+    drawerTitle: 'Project configuration',
+
+    darkMode: 'Theme',
+    navMode: 'Navigation bar mode',
+    interfaceFunction: 'Interface function',
+    interfaceDisplay: 'Interface display',
+    animation: 'Animation',
+    splitMenu: 'Split menu',
+    closeMixSidebarOnChange: 'Switch page close menu',
+
+    sysTheme: 'System theme',
+    headerTheme: 'Top bar theme',
+    sidebarTheme: 'Menu theme',
+
+    menuDrag: 'Side menu drag',
+    menuSearch: 'Menu search',
+    menuAccordion: 'Side menu accordion mode',
+    menuCollapse: 'Collapse menu',
+    collapseMenuDisplayName: 'Collapse menu display name',
+    topMenuLayout: 'Top menu layout',
+    menuCollapseButton: 'Menu collapse button',
+    contentMode: 'Content area width',
+    expandedMenuWidth: 'Menu expansion width',
+    breadcrumb: 'Breadcrumbs',
+    breadcrumbIcon: 'Breadcrumb icon',
+    tabs: 'Tab page',
+    tabDetail: 'Tab details page',
+    tabsQuickBtn: 'Tab page quick button',
+    tabsRedoBtn: 'Tab page refresh button',
+    tabsFoldBtn: 'Tab page fold button',
+    sidebar: 'Left menu',
+    header: 'Top bar',
+    footer: 'Footer',
+    fullContent: 'Full screen content',
+    grayMode: 'Gray mode',
+    colorWeak: 'Color weak mode',
+    progress: 'Top progress bar',
+    switchLoading: 'Switch loading',
+    switchAnimation: 'Switch animation',
+    animationType: 'Animation type',
+    autoScreenLock: 'Automatic screen lock',
+    notAutoScreenLock: 'Not automatic screen lock',
+    fixedHeader: 'Fixed header',
+    fixedSideBar: 'Fixed Sidebar',
+    mixSidebarTrigger: 'Mixed menu trigger mode',
+    triggerHover: 'Hover',
+    triggerClick: 'Click',
+    mixSidebarFixed: 'Fixed expansion menu',
   },
 };

+ 7 - 0
src/locales/lang/en/routes/account.ts

@@ -0,0 +1,7 @@
+export default {
+  type: {
+    1: 'Equity order',
+    2: 'Download order',
+    3: 'Consumption order',
+  },
+};

+ 1 - 1
src/locales/lang/en/routes/basic.ts

@@ -1,4 +1,4 @@
 export default {
   login: 'Login',
-  errorLogList: 'Error Log',
+  errorLogList: 'Error log list',
 };

+ 7 - 7
src/locales/lang/en/routes/config.ts

@@ -1,9 +1,9 @@
 export default {
-  login: 'ログイン',
-  serial: 'シリアル番号',
-  file: 'Unity実行可能ファイル',
-  directory: 'Unityエンジニアリングカタログ',
-  setconfig: '構成情報を変更します',
-  account: 'Unity账户',
-  password: 'Unity密码',
+  login: 'Login',
+  serial: 'Serial number',
+  file: 'Unity executable file',
+  directory: 'Unity project directory',
+  setconfig: 'Modify configuration information',
+  account: 'Unity account',
+  password: 'Unity password',
 };

+ 67 - 8
src/locales/lang/en/routes/dashboard.ts

@@ -1,13 +1,72 @@
 export default {
-  dashboard: 'Dashboard',
+  dashboard: 'Homepage',
   about: 'About',
   workbench: 'Workbench',
-  analysis: 'Analysis',
-  devices: 'Equipment',
-  equity: 'Subscription',
-  scene: 'シーンリスト',
+  analysis: 'Analysis page',
+  corporation: 'Corporate management',
+  operate: 'Official website operation management',
+  system: 'System management',
+  systemUser: 'Account management',
+  operateNews: 'News management',
+  operateRecruit: 'Recruitment management',
+  operateMessage: 'Message management',
+  invoice: 'Invoice management',
+  orderCamera: 'Camera order',
+  orderList: 'Order management',
+  orderEquity: 'Equity order',
+  orderDownload: 'Download order',
+  corporationAccount: 'Corporate account',
+  corporationVerify: 'Corporate certification',
+  bulletin: 'Information release',
+  bulletinRentInfo: 'Rent information',
+  bulletinSellInfo: 'Sell information',
+  bulletinDecoration: 'Construction site decoration',
+  advertisement: 'Advertisement position',
+  advertisementList: 'Carousel',
+  advertisementPads: 'Recommendation position',
+  scenes: 'VR scene management',
+  scenesDownload: 'Scene download',
+  scenesList: 'Scene list',
+  scenesLive: 'Live broadcast',
+  scenesRoom: 'Room management',
+  product: 'Product management',
+  firmware: 'Firmware management',
+  account: 'User management',
+  overview: 'User overview',
+  details: 'Order details',
+  productData: 'Product data',
+  sdk: 'Space Target SDK',
+  app: 'App management',
+  productRef: 'Product attributes',
+  productList: 'Product list',
+  productCategory: 'Product category',
+  order: 'Order management',
+  cameraList: 'Camera order list',
+  downloadList: 'Download order list',
+  equityList: 'Equity order list',
+  orderDetail: 'Order details',
+  member: 'Member Management',
+  memberList: 'Member List',
+  staff: 'Staff Management',
+  staffList: 'Staff List',
+  staffClean: 'Clear Status',
+  feedback: 'Feedback Management',
+  feedbackList: 'Feedback List',
+  productOperation: 'Product Operation Management',
+  cameraScene: 'Scene Management',
+  kankanScene: '4D Look',
+  MinionScene: '4D See',
+  laserScene: '4D Deep Time',
+  liteScene: '4D Binocular Lite',
+  sxz: 'Supporting Solution Management',
+  viewKankan: 'Panoramic Work Management',
+  customer: 'Customer Management',
+  customerDevice: 'Customer Device',
+  customerScene: 'Customer Scene',
+  devices: 'Device Management',
+  equity: 'Equity Management',
+  scene: 'Scene Management',
   finance: 'Sales Statistics',
-  cameraScene: 'Scene',
-  loglist: 'Operation Log',
-  retailer: 'Reseller',
+  loglist: 'operation log',
+  retailer: 'distributor management',
 };

+ 100 - 116
src/locales/lang/en/routes/demo.ts

@@ -1,60 +1,56 @@
 export default {
   charts: {
-    baiduMap: 'Baidu map',
-    aMap: 'A map',
-    googleMap: 'Google map',
+    baiduMap: 'Baidu Map',
+    aMap: 'Amap',
+    googleMap: 'Google Map',
     charts: 'Chart',
     map: 'Map',
-    line: 'Line',
-    pie: 'Pie',
+    line: 'Line Chart',
+    pie: 'Pie Chart',
   },
   comp: {
     comp: 'Component',
-    basic: 'Basic',
-    transition: 'Animation',
-    countTo: 'Count To',
-
-    scroll: 'Scroll',
-    scrollBasic: 'Basic',
+    basic: 'Basic Component',
+    transition: 'Animation Component',
+    countTo: 'Digital Animation',
+    scroll: 'Scroll Component',
+    scrollBasic: 'Basic Scroll',
     scrollAction: 'Scroll Function',
     virtualScroll: 'Virtual Scroll',
-
     tree: 'Tree',
+    treeBasic: 'Basic Tree',
+    editTree: 'Searchable/Toolbar',
+    actionTree: 'Function Operation Example',
+    modal: 'Popup Extension',
+    drawer: 'Drawer Extension',
+    desc: 'Details component',
 
-    treeBasic: 'Basic',
-    editTree: 'Searchable/toolbar',
-    actionTree: 'Function operation',
-
-    modal: 'Modal',
-    drawer: 'Drawer',
-    desc: 'Desc',
-
-    lazy: 'Lazy',
-    lazyBasic: 'Basic',
-    lazyTransition: 'Animation',
+    lazy: 'Lazy loading component',
+    lazyBasic: 'Basic example',
+    lazyTransition: 'Animation effect',
 
-    verify: 'Verify',
-    verifyDrag: 'Drag ',
-    verifyRotate: 'Picture Restore',
+    verify: 'Verification component',
+    verifyDrag: 'Drag verification',
+    verifyRotate: 'Image restoration',
 
-    qrcode: 'QR code',
-    strength: 'Password strength',
-    upload: 'Upload',
+    qrcode: 'QR code component',
+    strength: 'Password strength component',
+    upload: 'Upload component',
 
     loading: 'Loading',
 
-    time: 'Relative Time',
-    cropperImage: 'Cropper Image',
-    cardList: 'Card List',
+    time: 'Relative time',
+    cropperImage: 'Image cropping',
+    cardList: 'Card list',
   },
   editor: {
     editor: 'Editor',
     jsonEditor: 'Json editor',
-    markdown: 'Markdown editor',
+    markdown: 'markdown editor',
 
     tinymce: 'Rich text',
-    tinymceBasic: 'Basic',
-    tinymceForm: 'embedded form',
+    tinymceBasic: 'Basic use',
+    tinymceForm: 'Embedded form',
   },
   excel: {
     excel: 'Excel',
@@ -64,136 +60,124 @@ export default {
     importExcel: 'Import',
   },
   feat: {
-    feat: 'Page Function',
+    feat: 'Function',
     icon: 'Icon',
-    tabs: 'Tabs',
-    tabDetail: 'Tab Detail',
-    sessionTimeout: 'Session Timeout',
+    sessionTimeout: 'Login expired',
+    tabs: 'Tab operation',
+    tabDetail: 'Tab details page',
     print: 'Print',
-    contextMenu: 'Context Menu',
-    download: 'Download',
-    clickOutSide: 'ClickOutSide',
-    imgPreview: 'Picture Preview',
+    contextMenu: 'Right-click menu',
+    download: 'File download',
+    clickOutSide: 'ClickOutSide component',
+    imgPreview: 'Image preview',
     copy: 'Clipboard',
     msg: 'Message prompt',
     watermark: 'Watermark',
-    ripple: 'Ripple',
-    fullScreen: 'Full Screen',
-    errorLog: 'Error Log',
+    ripple: 'Water ripple',
+    fullScreen: 'Full screen',
+    errorLog: 'Error log',
     tab: 'Tab with parameters',
     tab1: 'Tab with parameter 1',
     tab2: 'Tab with parameter 2',
-    menu: 'Menu with parameters',
-    menu1: 'Menu with parameters 1',
-    menu2: 'Menu with parameters 2',
-
-    ws: 'Websocket test',
-
-    breadcrumb: 'Breadcrumbs',
-    breadcrumbFlat: 'Flat Mode',
-    breadcrumbFlatDetail: 'Flat mode details',
-
-    breadcrumbChildren: 'Level mode',
-    breadcrumbChildrenDetail: 'Level mode detail',
+    menu: 'Menu with parameter',
+    menu1: 'Menu with parameter 1',
+    menu2: 'Menu with parameter 2',
+    ws: 'websocket test',
+    breadcrumb: 'Breadcrumb navigation',
+    breadcrumbFlat: 'Flat mode',
+    breadcrumbFlatDetail: 'Flat details',
+    breadcrumbChildren: 'Hierarchical mode',
+    breadcrumbChildrenDetail: 'Hierarchical details',
   },
   flow: {
-    name: 'Graphics editor',
-    flowChart: 'FlowChart',
+    name: 'Graphic editor',
+    flowChart: 'Flowchart',
   },
   form: {
     form: 'Form',
-    basic: 'Basic',
+    basic: 'Basic form',
     useForm: 'useForm',
     refForm: 'RefForm',
-    advancedForm: 'Shrinkable',
+    advancedForm: 'Shrinkable form',
     ruleForm: 'Form validation',
-    dynamicForm: 'Dynamic',
-    customerForm: 'Custom',
-    appendForm: 'Append',
+    dynamicForm: 'Dynamic form',
+    customerForm: 'Custom component',
+    appendForm: 'Form addition and deletion example',
   },
   iframe: {
-    frame: 'External',
-    antv: 'antVue doc (embedded)',
-    doc: 'Project doc (embedded)',
-    docExternal: 'Project doc (external)',
+    frame: 'External page',
+    antv: 'antVue document (embedded)',
+    doc: 'Project document (embedded)',
+    docExternal: 'Project document (external link)',
   },
-  level: { level: 'MultiMenu' },
+  level: { level: 'Multi-level menu' },
   page: {
     page: 'Page',
 
-    form: 'Form',
-    formBasic: 'Basic Form',
-    formStep: 'Step Form',
-    formHigh: 'Advanced Form',
-
-    desc: 'Details',
-    descBasic: 'Basic Details',
-    descHigh: 'Advanced Details',
+    form: 'Form page',
+    formBasic: 'Basic form',
+    formStep: 'Step-by-step form',
+    formHigh: 'Advanced form',
 
-    result: 'Result',
-    resultSuccess: 'Success',
-    resultFail: 'Failed',
+    desc: 'Details page',
+    descBasic: 'Basic details page',
+    descHigh: 'Advanced details page',
 
-    account: 'Personal',
-    accountCenter: 'Personal Center',
-    accountSetting: 'Personal Settings',
+    result: 'Result page',
+    resultSuccess: 'Success page',
+    resultFail: 'Failure page',
 
-    exception: 'Exception',
-    netWorkError: 'Network Error',
+    account: 'Personal page',
+    accountCenter: 'Personal center',
+    accountSetting: 'Personal settings',
+    exception: 'Exception page',
+    netWorkError: 'Network error',
     notData: 'No data',
-
     list: 'List page',
     listCard: 'Card list',
-    basic: 'Basic list',
-    listBasic: 'Basic list',
+    listBasic: 'Standard list',
     listSearch: 'Search list',
   },
   permission: {
-    permission: 'Permission',
-
-    front: 'front-end',
-    frontPage: 'Page',
-    frontBtn: 'Button',
-    frontTestA: 'Test page A',
-    frontTestB: 'Test page B',
-
-    back: 'background',
-    backPage: 'Page',
-    backBtn: 'Button',
+    permission: 'Permission management',
+    front: 'Based on front-end permissions',
+    frontPage: 'Page permissions',
+    frontBtn: 'Button permissions',
+    frontTestA: 'Permission test page A',
+    frontTestB: 'Permission test page B',
+    back: 'Based on background permissions',
+    backPage: 'Page permissions',
+    backBtn: 'Button permissions',
   },
   setup: {
-    page: 'Intro page',
+    page: 'Boot page',
   },
   system: {
     moduleName: 'System management',
-
     account: 'Account management',
-    account_detail: 'Account detail',
+    account_detail: 'Account details',
     password: 'Change password',
-
     dept: 'Department management',
-
     menu: 'Menu management',
     role: 'Role management',
   },
   table: {
     table: 'Table',
-
-    basic: 'Basic',
-    treeTable: 'Tree',
-    fetchTable: 'Remote loading',
+    basic: 'Basic table',
+    treeTable: 'Tree table',
+    fetchTable: 'Remote loading example',
     fixedColumn: 'Fixed column',
     customerCell: 'Custom column',
-    formTable: 'Open search',
+    formTable: 'Open search area',
     useTable: 'UseTable',
     refTable: 'RefTable',
-    multipleHeader: 'MultiLevel header',
+    multipleHeader: 'Multi-level header',
     mergeHeader: 'Merge cells',
     expandTable: 'Expandable table',
-    fixedHeight: 'Fixed height',
-    footerTable: 'Footer',
-    editCellTable: 'Editable cell',
-    editRowTable: 'Editable row',
-    authColumn: 'Auth column',
+    fixedHeight: 'Fixed height/header customization',
+    footerTable: 'Total of footer rows',
+    editCellTable: 'Editable cells',
+    editRowTable: 'Editable rows',
+    authColumn: 'Authorization column',
   },
 };

+ 20 - 20
src/locales/lang/en/routes/device.ts

@@ -1,26 +1,26 @@
 export default {
-  snCode: 'S/N',
-  wifiName: 'Wifi',
-  deviceType: 'Camera type',
-  activatedTime: 'Time',
-  userName: 'Bound account',
-  NoBind: 'Unbind',
+  snCode: 'SN code',
+  wifiName: 'wifi name',
+  deviceType: 'device type',
+  activatedTime: 'delivery time',
+  userName: 'bind account',
+  NoBind: 'unbound',
   type: {
-    0: '4DKanKan Lite',
-    1: '4DKanKan',
-    2: '4DMinion',
-    3: '4DMega',
-    9: '4DMinion',
-    10: '4DMega',
-    11: '4DMeta',
+    0: 'old binocular camera',
+    1: '4D look',
+    2: '4D see',
+    3: '4D deep time',
+    9: '4D see',
+    10: '4D deep time',
+    11: '4D deep light',
   },
   status: {
-    0: 'Active',
-    1: 'Expired',
-    2: 'Bind',
-    3: 'Unbind',
+    0: 'in effect',
+    1: 'expired',
+    2: 'bound',
+    3: 'unbound',
   },
-  bindStatus: 'Binding status',
-  statusName: 'Status',
-  subAgentName: 'Reseller',
+  bindStatus: 'binding status',
+  statusName: 'rights status',
+  subAgentName: 'distributor',
 };

+ 0 - 75
src/locales/lang/en/routes/equity.ts

@@ -1,75 +0,0 @@
-export default {
-  add: 'New Authorization',
-  addDowm: 'New Download',
-  renew: 'Renew',
-  userName: 'User Account',
-  count: 'User Account',
-  orderSn: 'Order Number',
-  payTime: 'Payment Time',
-  invoiceTime: 'Invoicing application time',
-  money: 'Invoiced Amount',
-  id: 'ID',
-  dowmCount: 'Download Time',
-  timeList: '認証時間',
-  expiryTime: 'Expiry Date',
-  newTime: '前回 認証時間',
-  time: 'Start Date',
-  countNumber: ' Quantity',
-  Type: ' Type',
-  giveType: 'Methods',
-  nickName: 'Nickname',
-  userName1: 'Account',
-  email: 'Email',
-  userCount: 'Authorized Quantity',
-  incrementType: {
-    0: 'Membership Subscription',
-    1: 'Scene Download',
-  },
-  equityType: {
-    0: 'Premium (Yearly)',
-    1: 'Premium (Yearly)',
-    2: 'Premium (Yearly)',
-    3: 'Senior (Monthly)',
-  },
-  zhTips: 'Chinese characters are not supported',
-  listTitle: 'Sales Statistics List',
-  exportExcel: 'Export to Excel',
-  excelTitle: 'Are you sure you want to export excel?',
-  CardMajorNum: "Last Month's Premium Membership Sales (Yearly)",
-  CardHighNum: "Last Month's Senior Membership Sales (Monthly)",
-  CardDownNum: "Last Month's Download Sales",
-  syks: 'surplus',
-  addcount: ' Quantity',
-  rules: {
-    userName: 'Please enter the user account',
-    userName1: 'Please enter the correct user account',
-    userName2: 'The account does not exist',
-    id: 'Please enter the correct benefit ID',
-  },
-  unit: {
-    1: '',
-    2: '/Number of times',
-    '-1': '-Year',
-    '-2': '-Month',
-    '-3': '-Month',
-  },
-  titleHelpMessage: {
-    1: 'Statistical Guidelines:',
-    2: 'Membership Subscription: current records of new authorizations by dealers and related ID renewal records, including dealer authorizations and renewals, platform authorizations (renewals), and official website purchases (renewals).',
-    3: 'Scene Download: statistical information on the number of downloads of current new authorizations by sales.',
-  },
-  totalTime: ' Duration',
-  totalMessge: 'Insufficient Remaining Saleable Membership Subscriptions',
-  operationType: 'Operation',
-  operationUserName: 'User',
-  operationTime: 'Operation Time',
-  incrementId: 'Membership Subscription ID',
-  platform: 'Platform',
-  operation: {
-    0: 'Authorize',
-    1: 'Deauthorize',
-    2: 'Bind',
-    3: 'Unbind',
-  },
-  jjxs: 'Upcoming sale',
-};

+ 17 - 17
src/locales/lang/en/routes/finance.ts

@@ -1,27 +1,27 @@
 export default {
-  deptName: 'Affiliated company',
-  userName: 'Full name',
+  deptName: 'Company',
+  userName: 'Name',
   nickName: 'Employee nickname',
-  setpaswd: 'Change Password',
+  setpaswd: 'Change password',
   mobile: 'Mobile phone',
   permList: 'Equity',
-  userId: 'Account number',
-  createTime: 'Authorization Time',
-  updateTime: 'Modification Time',
-  staffList: 'Account List',
-  updateBtn: 'Change Password',
-  password: 'Change Password',
+  userId: 'Account',
+  createTime: 'Authorization time',
+  updateTime: 'Modification time',
+  staffList: 'Account list',
+  updateBtn: 'Change password',
+  password: 'Change password',
   agentName: 'Authorizer',
   equityType: {
-    0: 'Premium (Yearly)',
-    1: 'Senior (Monthly)',
-    2: 'Scene Download',
+    0: 'Professional member (year)',
+    1: 'Senior member (month)',
+    2: 'Scene download (times)',
   },
   giveType: {
-    0: 'Dealer Authorization',
-    1: 'Dealer Renewals',
-    2: 'Official Website Purchase',
-    3: 'Platform Authorization',
+    0: 'Dealer authorization',
+    1: 'Dealer renewal',
+    2: 'Official website purchase',
+    3: 'Platform authorization',
   },
-  totalTime: 'Total duration of the authorization (year/month)',
+  totalTime: 'Total authorization period (year/month)',
 };

+ 9 - 0
src/locales/lang/en/routes/operate.ts

@@ -0,0 +1,9 @@
+export default {
+  releaseTime: 'Release time',
+  newsTitle: 'News title',
+  newsAdd: 'News added',
+  source: 'Source',
+  objTitle: 'Job title',
+  submitTitle: 'Submission time',
+  mesgContent: 'Message content',
+};

+ 40 - 0
src/locales/lang/en/routes/product.ts

@@ -0,0 +1,40 @@
+export default {
+  addVstive: 'New Version',
+  newsTitle: 'news headlines',
+  newsAdd: 'new news',
+  source: 'source',
+  objTitle: 'Job name',
+  submitTitle: 'Submit time',
+  mesgContent: 'Message content',
+  types: 'device type',
+  minVersion: 'Minimum version number',
+  version: 'version number',
+  versionPlaceholder: 'Latest version number',
+  versionTips: '(Forced update below this version number)',
+  description: 'version update description',
+  description_zh: 'Chinese update description',
+  description_en: 'English update description',
+  file: 'file',
+  type: {
+    '0': 'Old binocular camera',
+    '1': 'Four-dimensional look',
+    '2': 'Four dimensions to see',
+    '3': 'Four-dimensional depth',
+    '9': 'Four dimensions to see',
+    '10': 'Four-dimensional depth time',
+  },
+  outType: {
+    '0': 'normal sales',
+    '1': "Employee's own use",
+    '2': 'Gift gift',
+    '3': 'Other',
+  },
+  sdkType: {
+    '1': 'Unity',
+    '2': 'UE4',
+  },
+  statusType: {
+    '0': 'Not published',
+    '1': 'Published',
+  },
+};

+ 30 - 31
src/locales/lang/en/routes/retailer.ts

@@ -1,44 +1,43 @@
 export default {
-  name: 'Reseller',
-  add: 'Add New Reseller',
-  editfxs: 'Edit Reseller',
-  setName: 'Membership Settings',
+  name: 'distributor name',
+  add: 'New distributor',
+  editfxs: 'Editor Distributor',
+  setName: 'Equity settings',
   nickName: 'Contact',
-  userName: 'Please enter your 4DKanKan account',
+  userName: 'Please enter 4D to view the account',
   userId: 'Account',
-  tips: 'This account does not exist',
+  tips: 'The account does not exist',
   jxs: 'Distributor',
-  fxs: 'Reseller',
-  majorAddNum: 'Premium Membership (Annual):  {value} years available for sale, newly added:',
-  highAddNum: 'Senior Membership (Monthly):  {value} months available for sale,  newly added:',
-  downAddNum: 'Project Downloads (Times):  {value} times available for sale, newly added:',
-  ff: 'Distribute',
+  fxs: 'distributor',
+  majorAddNum: 'Professional member (years): {value} years remaining, added this time (years)',
+  highAddNum: 'Premium members (months): {value} months remaining, added this time (months)',
+  downAddNum: 'Scene download (times): {value} remaining, this time added (times)',
+  ff: 'Distribution',
   Unbind: 'Unbind',
-  UnbindTips: 'Are you sure you want to unbind it?',
-  allff: 'Device Bulk Distribution',
-  majorTotalNum: 'Remaining Years of Premium Membership',
-  highTotalNum: 'Remaining Months of Senior Membership',
-  downTotalNum: 'Remaining Project Downloads',
-  createName: 'Creator',
-  createTime: '作成時間',
-  addjxs: 'Add Dealer',
-  editjxs: 'Edit Dealer',
+  UnbindTips: 'Are you sure you want to unbind?',
+  allff: 'Device batch distribution',
+  majorTotalNum: 'Remaining Professional Membership Years',
+  highTotalNum: 'Number of months remaining for premium members',
+  downTotalNum: 'Number of remaining scene downloads',
+  createName: 'creator',
+  createTime: 'createTime',
+  addjxs: 'New Distributor',
+  editjxs: 'Edit Distributor',
   form: {
-    name: ' Reseller Name',
+    name: 'distributor name',
     nickName: 'Contact',
-    userName: 'Please enter your 4DKanKan account',
+    userName: 'Please enter 4D to view the account',
     userId: 'Account',
-    tips: 'This account does not exist',
+    tips: 'The account does not exist',
     enable: 'Enable',
-    stopUsing: 'Deactivate',
-    dqname: 'Reseller',
-    d1name: 'Distributor Name',
+    stopUsing: 'Discontinued',
+    dqname: 'current distributor',
   },
-  exportText: 'Successfully imported {value} pieces of data',
+  exportText: 'Succeeded in importing {value} data',
   device: {
-    title: 'Device Bulk Distribution',
-    list: 'Equipment List',
-    dowmTips: 'Download Distributor Device List Template',
-    filename: 'Reseller Device List Template',
+    title: 'Device distribution',
+    list: 'Device list',
+    downmTips: 'Download Distributor Device List Template',
+    filename: 'Distributor Device List Template',
   },
 };

+ 41 - 97
src/locales/lang/en/routes/scene.ts

@@ -1,106 +1,50 @@
 export default {
   tableType: {
-    0: '4DKanKan',
-    1: '4DMinion',
-    2: '4DMega Point Cloud',
-    3: '4DKanKan Lite',
-    5: '4DMega Mesh',
-    6: '4DMeta Point Cloud',
-    7: '4DMeta Mesh',
+    '0': '4DKanKan Pro',
+    '1': '4DKanKan Minion',
+    '2': '4DKanKan Mega cloud scene',
+    '3': '4DKanKan Pro',
+    '5': '4DKanKan Mega Mesh Scene',
+    '6': '4DKanKan Meta Point Cloud Scene',
+    '7': '4DKanKan Meta Mesh Scene',
   },
-  migrate: '移動',
-  sceneName: '物件名',
-  webSite: '物件リンク',
-  childName: 'カメラSN',
-  viewCount: 'アクセス数',
-  createTime: 'アップデート時間',
-  num: 'コード',
-  process: 'ダウンロード',
-  jointVisit: '開く',
-  creatobj: 'obj生成',
-  upgrade: 'アップグレード',
-  sceneList: 'シーンリスト',
-  bindAnchor: 'アンカーをバインドする',
-  anchorRoom: 'ライブルーム名',
-  appListPicUrl: 'サムネイル',
-  sortOrder: '順番',
-  bindShowerNameList: 'アンカーにバインドされました',
-  livestreamStatus: '放送を始めますか?',
-  liveBroadcast: 'ライブリスト',
-  downloadScene: 'ダウンロード',
-  downloadSceneConfirm: 'ダウンロードしますか?',
-  editor: '編集',
-  cancelDownload: 'ダウンロードをキャンセル',
-  own: 'アンカーの選択',
-  userName: '従業員名:',
-  canShow: '一緒に訪れるために同時に開くかどうか',
-  bindTime: 'バインディング時間',
-  anchorList: 'アンカーリスト',
-  addLive: 'シーンを追加',
-  liveType: 'ライブルームタイプ',
-  liveName: 'ライブルーム名',
-  makeLiveCover: 'ライブルームカバーを生成',
-  sceneUrl: 'シーンのリンク',
-  delete: '削除',
-  '4dkk': '4DKK_Pro',
-  '4dkj': '4DKK_Minion',
-  '4dssdy': '4DKK_Mega',
-  obj: '4DKK_Mega Obj',
-  'upgradeMessg.title': 'バージョン4.0にアップグレードしてよろしいですか?',
-  'upgradeMessg.text':
-    'シーンがアップグレードされると、一部のデータは保持できなくなります。ホットスポット、自動ナビゲーション、戸型図、広告ビデオ。新しいバージョンはしばらく帯域ビューをサポートしていません。*シーンのアップグレードに成功すると旧版に戻すことができないので、確認してから操作してください。',
-  copy: 'コピー',
-  'copyInfi.title': 'コピー',
-  'copyInfi.content': 'シーンをコピーしますか?\n※編集内容や設定は、そのままコピーされます。',
-  'copyInfi.ok': 'コピー成功',
-  'objTips.coverData':
-    'Meshのシーンを再生成することで、既存のMeshシーンが上書きされ、編集内容がリセットされます。計算処理中は、Meshのシーンを開くことができませんが、再生成しますか?',
-  'objTips.Modifying': 'Meshのシーンの計算中です、しばらくお待ちください。',
-  'objTips.updateSuccess': 'objの生成には時間かかりますので、しばらくお待ちください。',
-  assistant: 'インバイト',
-  unAssistant: 'インバイトを終了',
-  unAssistantConfirm: 'インバイトを終了しますか?',
-  addAssistant: 'インバイトを追加',
-  shootUserName: 'アカウント',
-  migrateAccount: 'アカウント',
-  migrateDevice: 'カメラ',
-  selectCameraMFirst: '企業アカウントを入力してください。',
-  rsMPlaceHolder: 'カメラSNを選択してください。',
-  '4dsgobj': '4DKK_Meta Obj',
-  '4dsg': '4DKK_Meta',
-  'migrateAccount.required': '企業アカウントを入力してください。',
-  'migrateDevice.required': 'カメラSNを選択してください。',
-
-  transfer: '移行',
-  down: 'ダウンロード',
-  canlenDown: 'ダウンロードをキャンセル',
-  amount: '計算完了時間',
-  snCode: 'SNコード',
-  sceneSize: 'シーン サイズ',
-  copyTime: 'コピー時間',
-  isCopy: 'コピーするかどうか',
-  status: 'ステータス',
+  transfer: 'Transfer',
+  copy: 'copy',
+  down: 'down',
+  canlenDown: 'Cancel the download',
+  sceneName: 'scene title',
+  num: 'scene code',
+  createTime: 'Shooting time',
+  amount: 'Completion time of calculation',
+  snCode: 'SN码',
+  sceneSize: 'scene size',
+  userName: 'Account',
+  title: 'title',
+  viewCount: 'views',
+  copyTime: 'copy time',
+  isCopy: 'Do you copy',
+  status: 'Status',
   statusType: {
-    '0': '同期中です',
-    '1': '同期に成功しました',
-    '-2': '計算が成功しました',
-    '-1': '失敗しました',
-    '-3': '封印です',
+    '0': 'Synchronizing',
+    '1': 'Synchronization successful',
+    '-2': 'Calculated successfully',
+    '-1': 'Failed',
+    '-3': 'Sealed',
   },
-  copyTipsTitle: 'シーンをコピー',
+  copyTipsTitle: 'Copy Scene',
   copyTipsText:
-    'シーンをコピーすると、シーンは元のカメラに属します。 <br/>シーンをコピーしてもよろしいですか? ',
-  copySccuse: 'コピー成功',
-  deleteSccuse: '正常に削除されました',
-  downErr: 'ダウンロードに失敗しました',
-  transferSccuse: 'シーンの移行が成功しました。 ',
-  syncSccuse: 'シーンの同期が成功しました。 ',
-  transferTitle: '移行シナリオ',
-  toSnCode: '移行先',
-  reset: '再計算',
-  resetTips: '再計算しますか? ',
+    'Copy the scene, the scene belongs to the original camera. <br/>Are you sure you want to copy the scene? ',
+  copyScuse: 'Copy successfully',
+  deleteScuse: 'Delete successfully',
+  downErr: 'Download failed',
+  transferScuse: 'The scene migration was successful. ',
+  syncScuse: 'The scene synchronization was successful. ',
+  transferTitle: 'Transfer Scene',
+  toSnCode: 'Migrate to',
+  Reset: 'Recalculate',
+  resetTips: 'Is it recalculated?',
   rules: {
-    snCode: 'カメラのSNコードを入力してください',
-    snCode1: '中国語の文字はサポートされていません',
+    snCode: 'Please enter the camera SN code',
+    snCode1: 'Chinese characters not supported',
   },
 };

+ 67 - 67
src/locales/lang/en/routes/system.ts

@@ -1,83 +1,83 @@
 const account = {
-  roleBut: '権限',
-  userName: 'ユーザー名',
-  config: 'Untiy構成',
-  accountList: 'アカウントリスト',
-  addHost: '新しいホストを追加します',
-  edit: 'ユーザープロファイルを編集します',
-  delText: 'このアカウントを削除します',
-  departmentList: '部門リスト',
-  departmentName: '部門名',
-  addDepartment: '新しい部署',
-  editDepartment: '部門の編集',
-  addUser: '新しいアカウントを追加します',
-  editUser: 'アカウントを編集します',
-  parentDept: '上級部署',
+  roleBut: 'Permissions',
+  userName: 'Username',
+  config: 'Untiy configuration',
+  accountList: 'Account list',
+  addHost: 'Add a host',
+  edit: 'Edit user information',
+  delText: 'Delete this account',
+  departmentList: 'Department list',
+  departmentName: 'Department name',
+  addDepartment: 'Add a department',
+  editDepartment: 'Edit department',
+  addUser: 'Add an account',
+  editUser: 'Edit an account',
+  parentDept: 'Parent department',
   infoData: {
-    title: 'ユーザー{userId}の資料',
+    title: "User {userId}'s information",
     content:
-      'これはユーザプロファイルの詳細ページです。このページは、タブ内の同じルートで複数のページを開き、異なるデータを表示する場合にのみ使用します。',
+      'This is the user information details page. This page is only used to demonstrate that the same route opens multiple pages in the tab and displays different data',
   },
-  disable: 'アカウントを無効にします',
-  set: 'パスワードを変更します',
-  userProfile: 'ユーザープロファイル',
-  log: 'アクションログ',
-  userinfo: 'これはユーザー{userId}の資料Tabです',
-  userlog: 'これはユーザ{userId}の操作ログTabです',
-  setTitle: '詳細: ユーザー',
-  enable: '有効にします',
-  stopUsing: '無効にします',
-  description: '役割の説明',
-  remarks: 'コメント',
-  newMenu: 'メニューを追加します',
-  editMenu: 'メニューを編集します',
-  menuList: 'メニューリスト',
-  menuType: 'メニューの種類',
-  menuName: 'メニュー名',
-  menuName1: 'メニュー名を入力してください',
-  menuName2: '正しいメニュー名を入力してください',
-  menuPath: 'メニューパス',
-  routerPath: 'メニューパス',
-  menuUrl: '外部リンクアドレス',
-  menuParentName: '親メニュー',
-  component: 'コンポーネントパス',
-  icon: 'アイコン',
-  perms: '権限ID',
-  passwordOld: '現在のパスワード',
-  passwordNew: '新しいパスワード',
-  passwordNew1: '新しいパスワードを入力してください',
-  setpassword: 'パスワードを設定します',
-  confirmPassword: 'パスワードを確認します',
-  confirmPassword1: '空にすることはできません',
-  confirmPassword2: '入力されたパスワードが一致しません。',
+  disable: 'Disable account',
+  set: 'Change password',
+  userProfile: 'User profile',
+  log: 'Operation log',
+  userinfo: 'This is the user {userId} profile tab',
+  userlog: 'This is the user {userId} operation log tab',
+  setTitle: 'Details: User',
+  enable: 'Enable',
+  stopUsing: 'Disable',
+  description: 'Role description',
+  remarks: 'Remarks',
+  newMenu: 'Add menu',
+  editMenu: 'Edit menu',
+  menuList: 'Menu list',
+  menuType: 'Menu type',
+  menuName: 'Menu name',
+  menuName1: 'Please enter the menu name',
+  menuName2: 'Please enter the correct menu name',
+  menuPath: 'Menu path',
+  routerPath: 'Menu path',
+  menuUrl: 'External link address',
+  menuParentName: 'Previous menu',
+  component: 'Component path',
+  icon: 'Icon',
+  perms: 'Permission identifier',
+  passwordOld: 'Current password',
+  passwordNew: 'New password',
+  passwordNew1: 'Please enter a new password',
+  setpassword: 'Set password',
+  confirmPassword: 'Confirm password',
+  confirmPassword1: 'Cannot be empty',
+  confirmPassword2: 'The two passwords entered are inconsistent!',
   userList: {
-    id: 'ユーザーIDです。',
-    companyName: '所属会社',
-    userName: 'ユーザー名',
-    nickName: 'アカウント',
-    createTime: '作成時間',
+    id: 'User ID',
+    companyName: 'Company',
+    userName: 'User name',
+    nickName: 'Account',
+    createTime: 'Creation time',
   },
   isExt: {
-    title: '外接リンクかどうか',
-    1: 'はい',
-    0: 'いいえ',
+    title: 'Is it an external link',
+    1: 'Yes',
+    0: 'No',
     url: '',
   },
   type: {
-    title: 'タイプ',
-    0: '目次',
-    1: 'メニュー',
-    2: 'ボタン',
-    3: 'ボタン',
+    title: 'Type',
+    0: 'Directory',
+    1: 'Menu',
+    2: 'Button',
+    3: 'Button',
   },
-  roleTitle: 'ロールリスト',
-  isPlatformRole: '有効にするかどうか',
-  sortOrder: 'ソート',
-  status: 'ステータス',
-  isShow: '表示するかどうか',
+  roleTitle: 'Role List',
+  isPlatformRole: 'Is it enabled',
+  sortOrder: 'Sorting',
+  status: 'Status',
+  isShow: 'Is it displayed',
 };
 
 export default {
   ...account,
-  buttonMenuWaring: '上级菜单只能为菜单类型',
+  buttonMenuWaring: 'The parent menu can only be of menu type',
 };

+ 77 - 97
src/locales/lang/en/sys.ts

@@ -1,118 +1,98 @@
 export default {
   api: {
-    operationFailed: '失敗',
-    errorTip: 'エラー',
-    errorMessage: '失敗しました、システム異常です!',
-    timeoutMessage: 'タイムアウトです、もう一度ログインしてください。',
-    apiTimeoutMessage:
-      'インターフェイスリクエストがタイムアウトしました。ページを更新して、もう一度お試しください。',
-    apiRequestFailed: 'エラーをリクエストして、もう一度お試しください。',
-    networkException: 'ネットワークの異常',
-    networkExceptionMsg: 'ネットワークが異常です。接続を確認してください。',
+    operationFailed: 'Operation failed',
+    errorTip: 'Error message',
+    errorMessage: 'Operation failed, system abnormality!',
+    timeoutMessage: 'Login timed out, please log in again!',
+    apiTimeoutMessage: 'Interface request timed out, please refresh the page and try again!',
+    apiRequestFailed: 'Request error, please try again later',
+    networkException: 'Network abnormality',
+    networkExceptionMsg:
+      'Network abnormality, please check whether your network connection is normal!',
 
-    errMsg401: 'ユーザーに権限がありません(トークン、ユーザー名、間違ったパスワード)!',
-    errMsg403: 'ユーザーは許可されていますが、アクセスは禁止されています。!',
-    errMsg404: 'ネットワークリクエストエラー、リソースが見つかりません!',
-    errMsg405: 'ネットワークリクエストエラー、リクエストメソッドは許可されていません!',
-    errMsg408: 'ネットワークリクエストがタイムアウトしました!',
-    errMsg500: 'サーバーエラー、管理者に連絡してください!',
-    errMsg501: 'ネットワークが実装されていません!',
-    errMsg502: 'ネットワークエラー!',
-    errMsg503: 'サービスが利用できません、サーバーが一時的に過負荷またはメンテナンス!',
-    errMsg504: 'ネットワークタイムアウト!',
-    errMsg505: 'httpバージョンはリクエストをサポートしていません!',
+    errMsg401: 'User has no permission (token, username, password error)!',
+    errMsg403: 'User is authorized, but access is prohibited. !',
+    errMsg404: 'Network request error, the resource was not found!',
+    errMsg405: 'Network request error, the request method is not allowed!',
+    errMsg408: 'Network request timed out!',
+    errMsg500: 'Server error, please contact the administrator!',
+    errMsg501: 'Network not implemented!',
+    errMsg502: 'Network error!',
+    errMsg503: 'Service unavailable, the server is temporarily overloaded or maintained!',
+    errMsg504: 'Network timed out!',
+    errMsg505: 'http version does not support the request!',
   },
   app: {
-    logoutTip: '確認',
-    logoutMessage: 'アカウントからログアウトします。よろしいでしょうか?',
-    menuLoading: 'ローディング',
+    logoutTip: 'Warm reminder',
+    logoutMessage: 'Are you sure you want to exit the system?',
+    menuLoading: 'Menu loading...',
   },
   errorLog: {
-    tableTitle: 'エラーログリスト',
-    tableColumnType: 'タイプ',
-    tableColumnDate: '時間',
-    tableColumnFile: '資料',
-    tableColumnMsg: 'エラーメッセージ',
-    tableColumnStackMsg: 'stack情報',
+    tableTitle: 'Log list',
+    tableColumnType: 'Type',
+    tableColumnDate: 'Time',
+    tableColumnFile: 'File',
+    tableColumnMsg: 'Error message',
+    tableColumnStackMsg: 'Stack message',
+    tableActionDesc: 'Details',
 
-    tableActionDesc: '詳細',
+    modalTitle: 'Error details',
 
-    modalTitle: 'エラー詳細',
+    fireVueError: 'Click to trigger vue error',
+    fireResourceError: 'Click to trigger resource loading error',
+    fireAjaxError: 'Click to trigger ajax error',
 
-    fireVueError: 'クリックしてvueエラーをトリガーします',
-    fireResourceError: 'クリックしてリソースロードエラーをトリガーします',
-    fireAjaxError: 'クリックしてajaxエラーをトリガーします',
-
-    enableMessage:
-      '`/ src / settings / projectSetting.ts`でuseErrorHandle = trueの場合にのみ有効になります。',
+    enableMessage: 'Only works when useErrorHandle=true in `/src/settings/projectSetting.ts`.',
   },
   exception: {
-    backLogin: 'ログイン画面に戻る',
-    backHome: 'ホームページに戻る',
-    subTitle403: '申し訳ありませんが、このページにアクセスする権限がありません。',
-    subTitle404: '申し訳ありませんが、アクセスしたページは存在しません。',
-    subTitle500: '申し訳ありませんが、サーバーからエラーが報告されました。',
-    noDataTitle: '現在のページにはデータがありません',
-    networkErrorTitle: 'ネットワークエラー',
+    backLogin: 'Back to login',
+    backHome: 'Back to homepage',
+    subTitle403: 'Sorry, you do not have permission to access this page. ',
+    subTitle404: 'Sorry, the page you visited does not exist. ',
+    subTitle500: 'Sorry, the server reported an error. ',
+    noDataTitle: 'There is no data on this page',
+    networkErrorTitle: 'Network error',
     networkErrorSubTitle:
-      '申し訳ありませんが、ネットワーク接続がダウンしています。ネットワークを確認してください。',
+      'Sorry, your network connection has been disconnected, please check your network! ',
   },
   lock: {
-    unlock: 'クリックしてロックを解除',
-    alert: 'ロック画面のパスワードが間違っています',
-    backToLogin: 'ログイン画面に戻る',
-    entry: 'システムに入る',
-    placeholder: 'ロック画面のパスワードまたはユーザーパスワードを入力してください',
+    unlock: 'Click to unlock',
+    alert: 'Wrong lock screen password',
+    backToLogin: 'Return to login',
+    entry: 'Enter the system',
+    placeholder: 'Please enter the lock screen password or user password',
   },
   login: {
-    backSignIn: '戻る',
-    signInFormTitle: 'ログイン',
-    mobileSignInFormTitle: '電話でログイン',
-    qrSignInFormTitle: 'コードをスキャンしてログインする',
-    signUpFormTitle: '登録',
-    forgetFormTitle: 'パスワードを再設定する',
-    checkMessge: 'ドラッグして検証',
-    checkSuccess: '検証に成功しました',
-
-    signInTitle: '10分で実際のVR空間を作成',
-    signInDesc: 'シンプル、安全、効率的でセルフサービス可能な720度のライブVRを提供',
-    policy: 'xxxプライバシーポリシーに同意します',
-    scanSign: `コードをスキャンした後、「確認」をクリックしてログインを完了します`,
-
-    loginButton: 'ログイン',
-    registerButton: '登録',
-    rememberMe: 'ログイン情報を保存する',
-    forgetPassword: 'パスワードを忘れる',
-    otherSignIn: 'その他のログイン方法',
-
+    backSignIn: 'Return',
+    signInFormTitle: 'Login',
+    mobileSignInFormTitle: 'Mobile login',
+    qrSignInFormTitle: 'QR code login',
+    signUpFormTitle: 'Register',
+    forgetFormTitle: 'Reset password',
+    signInTitle: 'Dealer management system',
+    signInDesc: '',
+    policy: 'I agree to xxx privacy policy',
+    scanSign: `Scan the code and click "Confirm" to complete the login`,
+    loginButton: 'Login',
+    registerButton: 'Register',
+    rememberMe: 'Remember me',
+    forgetPassword: 'Forgot your password?',
+    otherSignIn: 'Other login methods',
     // notify
-    loginSuccessTitle: 'ログイン成功',
-    loginSuccessDesc: 'お帰りなさい',
-
+    loginSuccessTitle: 'Login successful',
+    loginSuccessDesc: 'Welcome back',
     // placeholder
-    accountPlaceholder: '会社名を入力してください',
-    passwordPlaceholder: 'パスワードを入力して下さい',
-    smsPlaceholder: '確認コードを入力してください',
-    mobilePlaceholder: '電話番号を入力してください',
-    policyPlaceholder: '確認後、ご登録してください',
-    diffPwd: 'パスワードが一致しません',
-
-    userName: '企業アカウント',
-    password: 'パスワード',
-    confirmPassword: 'パスワードを再入力',
-    email: 'メールアドレス',
-    smsCode: 'SMS確認コード',
-    mobile: '携帯番号',
-
-    loginDragValidate: '右にスライドさせログイン認証',
-    loginDragSuccess: 'ログイン認証確認',
-    loginAgain: 'もう一度やり直してください',
-    captcha: '検証コード',
-    registrationLabel: '新規登録',
-    corporationName: '企業アカウント',
-    corporationMail: '企業アカウント',
-    fillMail: 'メールアドレスをご入力してください !',
-    fillMailCorrect: '正しいメールアドレスをご入力してください!',
-    emailSMS: '確認コードを入力',
+    accountPlaceholder: 'Please enter your account',
+    passwordPlaceholder: 'Please enter your password',
+    smsPlaceholder: 'Please enter your verification code',
+    mobilePlaceholder: 'Please enter your mobile number',
+    policyPlaceholder: 'Check this to register',
+    diffPwd: 'The two passwords you entered do not match',
+    userName: 'Account',
+    password: 'Password',
+    confirmPassword: 'Confirm password',
+    email: 'Email',
+    smsCode: 'SMS verification code',
+    mobile: 'Mobile number',
   },
 };

+ 8 - 5
src/locales/lang/ja.ts

@@ -1,13 +1,16 @@
 import { genMessage } from '../helper';
 import antdLocale from 'ant-design-vue/es/locale/ja_JP';
-// import momentLocale from 'moment/dist/locale/en-us';
+import momentLocale from 'moment/dist/locale/ja';
+import ja from './json/ja.json';
 
-const modules = import.meta.globEager('./en/**/*.ts');
+const modules = import.meta.globEager('./ja/**/*.ts');
+console.log('genMessageja_JP', genMessage(modules, 'ja'));
 export default {
   message: {
-    ...genMessage(modules, 'en'),
+    ...genMessage(modules, 'ja'),
+    // ...ja,
     antdLocale,
   },
-  momentLocale: null,
-  momentLocaleName: 'en',
+  momentLocale,
+  momentLocaleName: 'ja',
 };

+ 83 - 0
src/locales/lang/ja/code.ts

@@ -0,0 +1,83 @@
+export default {
+  500: 'システム例外',
+  3001: '必要なパラメータがありません',
+  3002: 'アクセス例外',
+  3003: '異常なアクセス',
+  3004: 'ユーザーがログインしていません',
+  3005: '確認コードの有効期限が切れています',
+  3006: '検証コードエラー',
+  3007: 'ニックネームは存在します',
+  3008: 'このメールアドレスは既に登録されています',
+  3009: '入力した2つのパスワードが一致しません',
+  3010: 'ニックネームの長さが間違いします',
+  3011: 'パスワードの長さは、英語の大文字と小文字、数字、および8~16文字です',
+  3012: '不適切な内容が含まれています。',
+  3013: '電話番号のフォーマットが間違います',
+  3014: 'アカウントまたはパスワードが誤っています。',
+  3015: 'ユーザーが存在しません',
+  3016: 'ログインに失敗しました。アカ​​ウントへのアクセスが許可されていません',
+  3017: '空のファイル',
+  3018: 'アップロードまたは使用できるファイルがありません。',
+  3019: 'メールの格式が合わないです。',
+  3020: 'メールアドレスが存在しています',
+  3021: 'アカウントが存在しません。確認して再入力してください。',
+  3022: 'このシーンにコラボレーターが追加されました。追加する前にコラボレーションをキャンセルしてください',
+  3023: '確認コードを取得する回数が多すぎます。明日もう一度お試しください',
+  3024: 'シーンを自分自身に割り当てることはできません',
+  3025: 'カメラを自分自身に割り当てることができません',
+  3026: '一部のシーンには共同編集者がいます。追加する前に共同作業をキャンセルしてください',
+  3027: '元のパスワードが間違います',
+  3028: '役割は存在します',
+  3029: '役割に関連付けられているユーザーがいます。ユーザーを削除、または属する役割を変更してください',
+  3030: '現在の会員特典はありません',
+  3031: 'カメラがバインドされています',
+  3032: '現在のカメラはバインドされています。別のカメラを選択してください',
+  3033: '確認コードを60秒以内に繰り返し取得することはできません',
+  3034: 'サーバーがビジーです。もう一度お試しください',
+  3035: 'ログインアカウントが承認されていません。もう一度お試しください',
+
+  4001: 'タイムアウトしました',
+  4002: 'ユーザーは既に存在します',
+  4003: '電話番号はすでに登録されています',
+  4004: '2回入力したパスワードが一致しません',
+  4005: '電話番号が確認コードと一致しません',
+  4006: '検証コードがエラー',
+  4007: 'ユーザー名は存在しません',
+  4008: 'ユーザーがログインしていません',
+  4009: 'エラー',
+  4010: 'バウンドカメラが存在しません',
+  4011: 'カメラはすでにバインドされています',
+  4012: 'ユーザーネームまたはパスワードが違います',
+  4013: 'ニックネームが重複しています',
+  4014: '残高が足りないので、モデルの生成ができません。ホームページからチャージまたは、アップロード時にモデル生成オプションを削除してください。',
+  4015: '不適切な内容が含まれています。',
+  4016: 'パラメータが空です',
+  4017: 'シーンは空です',
+  4018: 'シーンはこのカメラに属していません',
+  4019: 'シーン番号が空です',
+  4020: 'カメラはユーザーにバインドされていません',
+  4021: '注文はすでに請求されているので、失敗しました。',
+
+  5010: 'コピーに失敗しました。シーンのファイルが破損しています。',
+  5011: 'シーンは既にアーカイブされています。',
+  5013: 'シーンはアーカイブされてないため、復元できません。',
+  5014: 'シーンは既にインバイトされています。',
+  5015: 'この下請は存在しません。',
+  5016: '同じカメラが登録されていません。',
+  5017: 'レーザーエラー',
+  5018: '同じ企業アカウントはインバイトできません。',
+  5019: 'シーンを撮影した企業アカウントが存在しません。',
+  5020: '元請が存在しまん。',
+  5021: 'アーカイブに失敗しました。シーンが計算中です。',
+  5022: 'このシーンは点群モードのみ操作可能です。',
+  5023: 'このシーンはOBJの生成をサポートしません',
+  5024: '協同エディットに失敗、企業管理アカウントを入力してください。',
+
+  5025: '场景已生成obj',
+  5026: '场景已在改相机,无需迁移',
+  5027: '相机类型不同,不能迁移',
+
+  50006: 'メール送信テンプレートが存在しません',
+  50050: '長さが限界を超えています!',
+  50051: '記録が見当たりませんでした!',
+};

+ 43 - 0
src/locales/lang/ja/common.ts

@@ -0,0 +1,43 @@
+export default {
+  state: '調子',
+  type: 'の種類',
+  fullName: '名前',
+  print: 'プリント',
+  all: 'すべて',
+  optSuccess: '完了',
+  okText: '確認',
+  closeText: '閉じる',
+  cancelText: 'キャンセル',
+  searchText: '探す',
+  queryText: '検索実行',
+  inputText: '入力してください',
+  chooseText: '選択してください。',
+  edit: '編集',
+  redo: 'リフレッシュ',
+  light: '明るいテーマ',
+  optFail: '失敗しました!',
+  notConnect: 'まだ接続されていません',
+  delConfirm: '削除しますか?',
+  mobile: '携帯電話',
+  phone: '携帯電話番号を入力してください!',
+  phoneError: '携帯電話番号を正しく入力してください!',
+  isConfirm: 'よろしいですか?',
+  dark: 'ダークテーマ',
+  unbind: '解放',
+  details: '詳細',
+  bind: 'バインディング',
+  yes: 'はい',
+  no: 'いいえ',
+  roleName: '権限',
+  roleNameText: '役割名です',
+  unusual: '異常な',
+  operation: 'エディット',
+  delText: '削除',
+  operating: 'エディット',
+  resetText: 'リセット',
+  loadingText: '読み込み中...',
+  saveText: '保存',
+  back: '戻る',
+  checkTips: 'プロンプトを確認',
+  unNormal: '異常な',
+};

+ 123 - 0
src/locales/lang/ja/component.ts

@@ -0,0 +1,123 @@
+export default {
+  app: {
+    searchNotData: 'No search results yet',
+    toSearch: 'to search',
+    toNavigate: 'to navigate',
+  },
+  countdown: {
+    normalText: 'Get SMS code',
+    sendText: 'Reacquire in {0}s',
+  },
+  cropper: {
+    selectImage: 'Select Image',
+    uploadSuccess: 'Uploaded success!',
+    modalTitle: 'Avatar upload',
+    okText: 'Confirm and upload',
+    btn_reset: 'Reset',
+    btn_rotate_left: 'Counterclockwise rotation',
+    btn_rotate_right: 'Clockwise rotation',
+    btn_scale_x: 'Flip horizontal',
+    btn_scale_y: 'Flip vertical',
+    btn_zoom_in: 'Zoom in',
+    btn_zoom_out: 'Zoom out',
+    preview: 'Preivew',
+  },
+  drawer: {
+    loadingText: 'Loading...',
+    cancelText: 'Close',
+    okText: 'Confirm',
+  },
+  excel: {
+    exportModalTitle: 'Export data',
+    fileType: 'File type',
+    fileName: 'File name',
+  },
+  form: {
+    putAway: 'Put away',
+    unfold: 'Unfold',
+    maxTip: 'The number of characters should be less than {0}',
+    apiSelectNotFound: 'Wait for data loading to complete...',
+  },
+  icon: {
+    placeholder: 'Click the select icon',
+    search: 'Search icon',
+    copy: 'Copy icon successfully!',
+  },
+  menu: {
+    search: 'Menu search',
+  },
+  modal: {
+    cancelText: 'Close',
+    okText: 'Confirm',
+    close: 'Close',
+    maximize: 'Maximize',
+    restore: 'Restore',
+  },
+  table: {
+    settingDens: 'Density',
+    settingDensDefault: 'Default',
+    settingDensMiddle: 'Middle',
+    settingDensSmall: 'Compact',
+    settingColumn: 'Column settings',
+    settingColumnShow: 'Column display',
+    settingIndexColumnShow: 'Index Column',
+    settingSelectColumnShow: 'Selection Column',
+    settingFixedLeft: 'Fixed Left',
+    settingFixedRight: 'Fixed Right',
+    settingFullScreen: 'Full Screen',
+    index: 'Index',
+    total: 'total of {total}',
+  },
+  time: {
+    before: ' ago',
+    after: ' after',
+    just: 'just now',
+    seconds: ' seconds',
+    minutes: ' minutes',
+    hours: ' hours',
+    days: ' days',
+  },
+  tree: {
+    selectAll: 'Select All',
+    unSelectAll: 'Cancel Select',
+    expandAll: 'Expand All',
+    unExpandAll: 'Collapse all',
+    checkStrictly: 'Hierarchical association',
+    checkUnStrictly: 'Hierarchical independence',
+  },
+  upload: {
+    save: 'Save',
+    upload: 'Upload',
+    imgUpload: 'ImageUpload',
+    uploaded: 'Uploaded',
+    operating: 'Operating',
+    del: 'Delete',
+    download: 'download',
+    saveWarn: 'Please wait for the file to upload and save!',
+    saveError: 'There is no file successfully uploaded and cannot be saved!',
+    preview: 'Preview',
+    choose: 'Select the file',
+    accept: 'Support {0} format',
+    acceptUpload: 'Only upload files in {0} format',
+    maxSize: 'A single file does not exceed {0}MB ',
+    maxSizeMultiple: 'Only upload files up to {0}MB!',
+    maxNumber: 'Only upload up to {0} files',
+    legend: 'Legend',
+    fileName: 'File name',
+    fileSize: 'File size',
+    fileStatue: 'File status',
+    startUpload: 'Start upload',
+    uploadSuccess: 'Upload successfully',
+    uploadError: 'Upload failed',
+    uploading: 'Uploading',
+    uploadWait: 'Please wait for the file upload to finish',
+    reUploadFailed: 'Re-upload failed files',
+  },
+  verify: {
+    error: 'verification failed!',
+    time: 'The verification is successful and it takes {time} seconds!',
+    redoTip: 'Click the picture to refresh',
+    dragText: 'Hold down the slider and drag',
+    successText: 'Verified',
+  },
+};

+ 95 - 0
src/locales/lang/ja/layout.ts

@@ -0,0 +1,95 @@
+export default {
+  footer: {
+    onlinePreview: 'オンラインプレビュー',
+    onlineDocument: 'オンラインドキュメント',
+  },
+  header: {
+    dropdownItemDoc: 'ドキュメント',
+    dropdownItemLoginOut: 'ログアウト',
+    tooltipErrorLog: 'エラーログ',
+    tooltipLock: 'ロック画面',
+    tooltipNotify: 'お知らせ',
+    tooltipEntryFull: '全画面表示',
+    tooltipExitFull: '全画面表示を終了',
+    lockScreenPassword: 'ロック画面のパスワード',
+    lockScreen: 'ロック画面',
+    lockScreenBtn: 'ロック',
+    home: 'ホームページ',
+    personalSetting: 'アカウントの設定',
+  },
+  multipleTab: {
+    reload: 'リロード',
+    close: 'タブを閉じる',
+    closeLeft: '左のタブを閉じる',
+    closeRight: '右タブを閉じる',
+    closeOther: '他のタブを閉じる',
+    closeAll: 'すべてのタブを閉じる',
+  },
+  setting: {
+    contentModeFull: 'ストリーミング',
+    contentModeFixed: '固定幅',
+    topMenuAlignLeft: '左揃え',
+    topMenuAlignRight: '右揃え',
+    topMenuAlignCenter: '中央揃え',
+    menuTriggerNone: '非表示',
+    menuTriggerBottom: '下部',
+    menuTriggerTop: '上部',
+    menuTypeSidebar: '左メニューモード',
+    menuTypeMixSidebar: '左メニューブレンドモード',
+    menuTypeMix: 'トップメニューブレンドモード',
+    menuTypeTopMenu: 'トップメニューモード',
+    on: 'オン',
+    off: 'オフ',
+    minute: '分',
+    operatingTitle: '成功',
+    operatingContent: 'コピーが完了しました。src/settings/projectSetting.ts に設定が保存されます!',
+    resetSuccess: 'リセットが完了しました',
+    copyBtn: 'コピー',
+    clearBtn: 'キャッシュをクリアしてログインページに戻る',
+    drawerTitle: '設定',
+    darkMode: 'テーマ',
+    navMode: 'ナビゲーションバーモード',
+    interfaceFunction: '界面機能',
+    interfaceDisplay: '界面表示',
+    animation: 'アニメーション',
+    splitMenu: '分割メニュー',
+    closeMixSidebarOnChange: 'ページクローズメニューの切り替え',
+    sysTheme: 'システムテーマ',
+    headerTheme: 'トップバーのテーマ',
+    sidebarTheme: 'メニューテーマ',
+    menuDrag: 'サイドメニュードラッグ',
+    menuSearch: 'メニュー検索',
+    menuAccordion: 'サイドメニューアコーディオンモード',
+    menuCollapse: '折りたたみメニュー',
+    collapseMenuDisplayName: 'メニュー表示名を折りたたむ',
+    topMenuLayout: 'トップメニューのレイアウト',
+    menuCollapseButton: 'メニュー折りたたみボタン',
+    contentMode: 'コンテンツ領域の幅',
+    expandedMenuWidth: 'メニュー拡張幅',
+    breadcrumb: '参照パス',
+    breadcrumbIcon: '参照パスアイコン',
+    tabs: 'タブ',
+    tabDetail: 'タグの詳細ページ',
+    tabsQuickBtn: 'タブショートカットボタン',
+    tabsRedoBtn: 'タブ更新ボタン',
+    tabsFoldBtn: 'サイドメニュー折りたたみボタン',
+    sidebar: '左メニュー',
+    header: 'トップバー',
+    footer: 'フッター',
+    fullContent: 'フルスクリーンコンテンツ',
+    grayMode: 'グレーモード',
+    colorWeak: '色弱モード',
+    progress: 'トッププログレスバー',
+    switchLoading: 'トグルloading',
+    switchAnimation: 'アニメーションを切り替える',
+    animationType: 'アニメーションの種類',
+    autoScreenLock: '一定時間で画面ロック',
+    notAutoScreenLock: '一定時間で画面ロックしない',
+    fixedHeader: '固定header',
+    fixedSideBar: '固定Sidebar',
+    mixSidebarTrigger: 'ハイブリッドメニュートリガー方式',
+    triggerHover: 'ホバーをトリガー',
+    triggerClick: 'クリック',
+    mixSidebarFixed: '展開メニューを修正',
+  },
+};

+ 4 - 0
src/locales/lang/ja/routes/basic.ts

@@ -0,0 +1,4 @@
+export default {
+  login: 'ログイン',
+  errorLogList: 'エラーログリスト',
+};

+ 9 - 0
src/locales/lang/ja/routes/config.ts

@@ -0,0 +1,9 @@
+export default {
+  login: 'ログイン',
+  serial: 'シリアル番号',
+  file: 'Unity実行可能ファイル',
+  directory: 'Unityエンジニアリングカタログ',
+  setconfig: '構成情報を変更します',
+  account: 'Unity账户',
+  password: 'Unity密码',
+};

+ 13 - 0
src/locales/lang/ja/routes/dashboard.ts

@@ -0,0 +1,13 @@
+export default {
+  dashboard: 'Dashboard',
+  about: 'About',
+  workbench: 'Workbench',
+  analysis: 'Analysis',
+  devices: 'Equipment',
+  equity: 'Subscription',
+  scene: 'シーンリスト',
+  finance: 'Sales Statistics',
+  cameraScene: 'Scene',
+  loglist: 'Operation Log',
+  retailer: 'Reseller',
+};

+ 199 - 0
src/locales/lang/ja/routes/demo.ts

@@ -0,0 +1,199 @@
+export default {
+  charts: {
+    baiduMap: 'Baidu map',
+    aMap: 'A map',
+    googleMap: 'Google map',
+    charts: 'Chart',
+    map: 'Map',
+    line: 'Line',
+    pie: 'Pie',
+  },
+  comp: {
+    comp: 'Component',
+    basic: 'Basic',
+    transition: 'Animation',
+    countTo: 'Count To',
+
+    scroll: 'Scroll',
+    scrollBasic: 'Basic',
+    scrollAction: 'Scroll Function',
+    virtualScroll: 'Virtual Scroll',
+
+    tree: 'Tree',
+
+    treeBasic: 'Basic',
+    editTree: 'Searchable/toolbar',
+    actionTree: 'Function operation',
+
+    modal: 'Modal',
+    drawer: 'Drawer',
+    desc: 'Desc',
+
+    lazy: 'Lazy',
+    lazyBasic: 'Basic',
+    lazyTransition: 'Animation',
+
+    verify: 'Verify',
+    verifyDrag: 'Drag ',
+    verifyRotate: 'Picture Restore',
+
+    qrcode: 'QR code',
+    strength: 'Password strength',
+    upload: 'Upload',
+
+    loading: 'Loading',
+
+    time: 'Relative Time',
+    cropperImage: 'Cropper Image',
+    cardList: 'Card List',
+  },
+  editor: {
+    editor: 'Editor',
+    jsonEditor: 'Json editor',
+    markdown: 'Markdown editor',
+
+    tinymce: 'Rich text',
+    tinymceBasic: 'Basic',
+    tinymceForm: 'embedded form',
+  },
+  excel: {
+    excel: 'Excel',
+    customExport: 'Select export format',
+    jsonExport: 'JSON data export',
+    arrayExport: 'Array data export',
+    importExcel: 'Import',
+  },
+  feat: {
+    feat: 'Page Function',
+    icon: 'Icon',
+    tabs: 'Tabs',
+    tabDetail: 'Tab Detail',
+    sessionTimeout: 'Session Timeout',
+    print: 'Print',
+    contextMenu: 'Context Menu',
+    download: 'Download',
+    clickOutSide: 'ClickOutSide',
+    imgPreview: 'Picture Preview',
+    copy: 'Clipboard',
+    msg: 'Message prompt',
+    watermark: 'Watermark',
+    ripple: 'Ripple',
+    fullScreen: 'Full Screen',
+    errorLog: 'Error Log',
+    tab: 'Tab with parameters',
+    tab1: 'Tab with parameter 1',
+    tab2: 'Tab with parameter 2',
+    menu: 'Menu with parameters',
+    menu1: 'Menu with parameters 1',
+    menu2: 'Menu with parameters 2',
+
+    ws: 'Websocket test',
+
+    breadcrumb: 'Breadcrumbs',
+    breadcrumbFlat: 'Flat Mode',
+    breadcrumbFlatDetail: 'Flat mode details',
+
+    breadcrumbChildren: 'Level mode',
+    breadcrumbChildrenDetail: 'Level mode detail',
+  },
+  flow: {
+    name: 'Graphics editor',
+    flowChart: 'FlowChart',
+  },
+  form: {
+    form: 'Form',
+    basic: 'Basic',
+    useForm: 'useForm',
+    refForm: 'RefForm',
+    advancedForm: 'Shrinkable',
+    ruleForm: 'Form validation',
+    dynamicForm: 'Dynamic',
+    customerForm: 'Custom',
+    appendForm: 'Append',
+  },
+  iframe: {
+    frame: 'External',
+    antv: 'antVue doc (embedded)',
+    doc: 'Project doc (embedded)',
+    docExternal: 'Project doc (external)',
+  },
+  level: { level: 'MultiMenu' },
+  page: {
+    page: 'Page',
+
+    form: 'Form',
+    formBasic: 'Basic Form',
+    formStep: 'Step Form',
+    formHigh: 'Advanced Form',
+
+    desc: 'Details',
+    descBasic: 'Basic Details',
+    descHigh: 'Advanced Details',
+
+    result: 'Result',
+    resultSuccess: 'Success',
+    resultFail: 'Failed',
+
+    account: 'Personal',
+    accountCenter: 'Personal Center',
+    accountSetting: 'Personal Settings',
+
+    exception: 'Exception',
+    netWorkError: 'Network Error',
+    notData: 'No data',
+
+    list: 'List page',
+    listCard: 'Card list',
+    basic: 'Basic list',
+    listBasic: 'Basic list',
+    listSearch: 'Search list',
+  },
+  permission: {
+    permission: 'Permission',
+
+    front: 'front-end',
+    frontPage: 'Page',
+    frontBtn: 'Button',
+    frontTestA: 'Test page A',
+    frontTestB: 'Test page B',
+
+    back: 'background',
+    backPage: 'Page',
+    backBtn: 'Button',
+  },
+  setup: {
+    page: 'Intro page',
+  },
+  system: {
+    moduleName: 'System management',
+
+    account: 'Account management',
+    account_detail: 'Account detail',
+    password: 'Change password',
+
+    dept: 'Department management',
+
+    menu: 'Menu management',
+    role: 'Role management',
+  },
+  table: {
+    table: 'Table',
+
+    basic: 'Basic',
+    treeTable: 'Tree',
+    fetchTable: 'Remote loading',
+    fixedColumn: 'Fixed column',
+    customerCell: 'Custom column',
+    formTable: 'Open search',
+    useTable: 'UseTable',
+    refTable: 'RefTable',
+    multipleHeader: 'MultiLevel header',
+    mergeHeader: 'Merge cells',
+    expandTable: 'Expandable table',
+    fixedHeight: 'Fixed height',
+    footerTable: 'Footer',
+    editCellTable: 'Editable cell',
+    editRowTable: 'Editable row',
+    authColumn: 'Auth column',
+  },
+};

+ 26 - 0
src/locales/lang/ja/routes/device.ts

@@ -0,0 +1,26 @@
+export default {
+  snCode: 'S/N',
+  wifiName: 'Wifi',
+  deviceType: 'Camera type',
+  activatedTime: 'Time',
+  userName: 'Bound account',
+  NoBind: 'Unbind',
+  type: {
+    0: '4DKanKan Lite',
+    1: '4DKanKan',
+    2: '4DMinion',
+    3: '4DMega',
+    9: '4DMinion',
+    10: '4DMega',
+    11: '4DMeta',
+  },
+  status: {
+    0: 'Active',
+    1: 'Expired',
+    2: 'Bind',
+    3: 'Unbind',
+  },
+  bindStatus: 'Binding status',
+  statusName: 'Status',
+  subAgentName: 'Reseller',
+};

+ 27 - 0
src/locales/lang/ja/routes/finance.ts

@@ -0,0 +1,27 @@
+export default {
+  deptName: 'Affiliated company',
+  userName: 'Full name',
+  nickName: 'Employee nickname',
+  setpaswd: 'Change Password',
+  mobile: 'Mobile phone',
+  permList: 'Equity',
+  userId: 'Account number',
+  createTime: 'Authorization Time',
+  updateTime: 'Modification Time',
+  staffList: 'Account List',
+  updateBtn: 'Change Password',
+  password: 'Change Password',
+  agentName: 'Authorizer',
+  equityType: {
+    0: 'Premium (Yearly)',
+    1: 'Senior (Monthly)',
+    2: 'Scene Download',
+  },
+  giveType: {
+    0: 'Dealer Authorization',
+    1: 'Dealer Renewals',
+    2: 'Official Website Purchase',
+    3: 'Platform Authorization',
+  },
+  totalTime: 'Total duration of the authorization (year/month)',
+};

+ 44 - 0
src/locales/lang/ja/routes/retailer.ts

@@ -0,0 +1,44 @@
+export default {
+  name: 'Reseller',
+  add: 'Add New Reseller',
+  editfxs: 'Edit Reseller',
+  setName: 'Membership Settings',
+  nickName: 'Contact',
+  userName: 'Please enter your 4DKanKan account',
+  userId: 'Account',
+  tips: 'This account does not exist',
+  jxs: 'Distributor',
+  fxs: 'Reseller',
+  majorAddNum: 'Premium Membership (Annual):  {value} years available for sale, newly added:',
+  highAddNum: 'Senior Membership (Monthly):  {value} months available for sale,  newly added:',
+  downAddNum: 'Project Downloads (Times):  {value} times available for sale, newly added:',
+  ff: 'Distribute',
+  Unbind: 'Unbind',
+  UnbindTips: 'Are you sure you want to unbind it?',
+  allff: 'Device Bulk Distribution',
+  majorTotalNum: 'Remaining Years of Premium Membership',
+  highTotalNum: 'Remaining Months of Senior Membership',
+  downTotalNum: 'Remaining Project Downloads',
+  createName: 'Creator',
+  createTime: '作成時間',
+  addjxs: 'Add Dealer',
+  editjxs: 'Edit Dealer',
+  form: {
+    name: ' Reseller Name',
+    nickName: 'Contact',
+    userName: 'Please enter your 4DKanKan account',
+    userId: 'Account',
+    tips: 'This account does not exist',
+    enable: 'Enable',
+    stopUsing: 'Deactivate',
+    dqname: 'Reseller',
+    d1name: 'Distributor Name',
+  },
+  exportText: 'Successfully imported {value} pieces of data',
+  device: {
+    title: 'Device Bulk Distribution',
+    list: 'Equipment List',
+    dowmTips: 'Download Distributor Device List Template',
+    filename: 'Reseller Device List Template',
+  },
+};

+ 107 - 0
src/locales/lang/ja/routes/scene.ts

@@ -0,0 +1,107 @@
+export default {
+  tableType: {
+    0: '4DKanKan',
+    1: '4DMinion',
+    2: '4DMega Point Cloud',
+    3: '4DKanKan Lite',
+    5: '4DMega Mesh',
+    6: '4DMeta Point Cloud',
+    7: '4DMeta Mesh',
+  },
+  migrate: '移動',
+  sceneName: '物件名',
+  webSite: '物件リンク',
+  childName: 'カメラSN',
+  viewCount: 'アクセス数',
+  createTime: 'アップデート時間',
+  num: 'コード',
+  process: 'ダウンロード',
+  jointVisit: '開く',
+  creatobj: 'obj生成',
+  upgrade: 'アップグレード',
+  sceneList: 'シーンリスト',
+  bindAnchor: 'アンカーをバインドする',
+  anchorRoom: 'ライブルーム名',
+  appListPicUrl: 'サムネイル',
+  sortOrder: '順番',
+  bindShowerNameList: 'アンカーにバインドされました',
+  livestreamStatus: '放送を始めますか?',
+  liveBroadcast: 'ライブリスト',
+  downloadScene: 'ダウンロード',
+  downloadSceneConfirm: 'ダウンロードしますか?',
+  editor: '編集',
+  cancelDownload: 'ダウンロードをキャンセル',
+  own: 'アンカーの選択',
+  userName: '従業員名:',
+  title: '名前です',
+  canShow: '一緒に訪れるために同時に開くかどうか',
+  bindTime: 'バインディング時間',
+  anchorList: 'アンカーリスト',
+  addLive: 'シーンを追加',
+  liveType: 'ライブルームタイプ',
+  liveName: 'ライブルーム名',
+  makeLiveCover: 'ライブルームカバーを生成',
+  sceneUrl: 'シーンのリンク',
+  delete: '削除',
+  '4dkk': '4DKK_Pro',
+  '4dkj': '4DKK_Minion',
+  '4dssdy': '4DKK_Mega',
+  obj: '4DKK_Mega Obj',
+  'upgradeMessg.title': 'バージョン4.0にアップグレードしてよろしいですか?',
+  'upgradeMessg.text':
+    'シーンがアップグレードされると、一部のデータは保持できなくなります。ホットスポット、自動ナビゲーション、戸型図、広告ビデオ。新しいバージョンはしばらく帯域ビューをサポートしていません。*シーンのアップグレードに成功すると旧版に戻すことができないので、確認してから操作してください。',
+  copy: 'コピー',
+  'copyInfi.title': 'コピー',
+  'copyInfi.content': 'シーンをコピーしますか?\n※編集内容や設定は、そのままコピーされます。',
+  'copyInfi.ok': 'コピー成功',
+  'objTips.coverData':
+    'Meshのシーンを再生成することで、既存のMeshシーンが上書きされ、編集内容がリセットされます。計算処理中は、Meshのシーンを開くことができませんが、再生成しますか?',
+  'objTips.Modifying': 'Meshのシーンの計算中です、しばらくお待ちください。',
+  'objTips.updateSuccess': 'objの生成には時間かかりますので、しばらくお待ちください。',
+  assistant: 'インバイト',
+  unAssistant: 'インバイトを終了',
+  unAssistantConfirm: 'インバイトを終了しますか?',
+  addAssistant: 'インバイトを追加',
+  shootUserName: 'アカウント',
+  migrateAccount: 'アカウント',
+  migrateDevice: 'カメラ',
+  selectCameraMFirst: '企業アカウントを入力してください。',
+  rsMPlaceHolder: 'カメラSNを選択してください。',
+  '4dsgobj': '4DKK_Meta Obj',
+  '4dsg': '4DKK_Meta',
+  'migrateAccount.required': '企業アカウントを入力してください。',
+  'migrateDevice.required': 'カメラSNを選択してください。',
+
+  transfer: '移行',
+  down: 'ダウンロード',
+  canlenDown: 'ダウンロードをキャンセル',
+  amount: '計算完了時間',
+  snCode: 'SNコード',
+  sceneSize: 'シーン サイズ',
+  copyTime: 'コピー時間',
+  isCopy: 'コピーするかどうか',
+  status: 'ステータス',
+  statusType: {
+    '0': '同期中です',
+    '1': '同期に成功しました',
+    '-2': '計算が成功しました',
+    '-1': '失敗しました',
+    '-3': '封印です',
+  },
+  copyTipsTitle: 'シーンをコピー',
+  copyTipsText:
+    'シーンをコピーすると、シーンは元のカメラに属します。 <br/>シーンをコピーしてもよろしいですか? ',
+  copySccuse: 'コピー成功',
+  deleteSccuse: '正常に削除されました',
+  downErr: 'ダウンロードに失敗しました',
+  transferSccuse: 'シーンの移行が成功しました。 ',
+  syncSccuse: 'シーンの同期が成功しました。 ',
+  transferTitle: '移行シナリオ',
+  toSnCode: '移行先',
+  reset: '再計算',
+  resetTips: '再計算しますか? ',
+  rules: {
+    snCode: 'カメラのSNコードを入力してください',
+    snCode1: '中国語の文字はサポートされていません',
+  },
+};

+ 83 - 0
src/locales/lang/ja/routes/system.ts

@@ -0,0 +1,83 @@
+const account = {
+  roleBut: '権限',
+  userName: 'ユーザー名',
+  config: 'Untiy構成',
+  accountList: 'アカウントリスト',
+  addHost: '新しいホストを追加します',
+  edit: 'ユーザープロファイルを編集します',
+  delText: 'このアカウントを削除します',
+  departmentList: '部門リスト',
+  departmentName: '部門名',
+  addDepartment: '新しい部署',
+  editDepartment: '部門の編集',
+  addUser: '新しいアカウントを追加します',
+  editUser: 'アカウントを編集します',
+  parentDept: '上級部署',
+  infoData: {
+    title: 'ユーザー{userId}の資料',
+    content:
+      'これはユーザプロファイルの詳細ページです。このページは、タブ内の同じルートで複数のページを開き、異なるデータを表示する場合にのみ使用します。',
+  },
+  disable: 'アカウントを無効にします',
+  set: 'パスワードを変更します',
+  userProfile: 'ユーザープロファイル',
+  log: 'アクションログ',
+  userinfo: 'これはユーザー{userId}の資料Tabです',
+  userlog: 'これはユーザ{userId}の操作ログTabです',
+  setTitle: '詳細: ユーザー',
+  enable: '有効にします',
+  stopUsing: '無効にします',
+  description: '役割の説明',
+  remarks: 'コメント',
+  newMenu: 'メニューを追加します',
+  editMenu: 'メニューを編集します',
+  menuList: 'メニューリスト',
+  menuType: 'メニューの種類',
+  menuName: 'メニュー名',
+  menuName1: 'メニュー名を入力してください',
+  menuName2: '正しいメニュー名を入力してください',
+  menuPath: 'メニューパス',
+  routerPath: 'メニューパス',
+  menuUrl: '外部リンクアドレス',
+  menuParentName: '親メニュー',
+  component: 'コンポーネントパス',
+  icon: 'アイコン',
+  perms: '権限ID',
+  passwordOld: '現在のパスワード',
+  passwordNew: '新しいパスワード',
+  passwordNew1: '新しいパスワードを入力してください',
+  setpassword: 'パスワードを設定します',
+  confirmPassword: 'パスワードを確認します',
+  confirmPassword1: '空にすることはできません',
+  confirmPassword2: '入力されたパスワードが一致しません。',
+  userList: {
+    id: 'ユーザーIDです。',
+    companyName: '所属会社',
+    userName: 'ユーザー名',
+    nickName: 'アカウント',
+    createTime: '作成時間',
+  },
+  isExt: {
+    title: '外接リンクかどうか',
+    1: 'はい',
+    0: 'いいえ',
+    url: '',
+  },
+  type: {
+    title: 'タイプ',
+    0: '目次',
+    1: 'メニュー',
+    2: 'ボタン',
+    3: 'ボタン',
+  },
+  roleTitle: 'ロールリスト',
+  isPlatformRole: '有効にするかどうか',
+  sortOrder: 'ソート',
+  status: 'ステータス',
+  isShow: '表示するかどうか',
+};
+
+export default {
+  ...account,
+  buttonMenuWaring: '上级菜单只能为菜单类型',
+};

+ 118 - 0
src/locales/lang/ja/sys.ts

@@ -0,0 +1,118 @@
+export default {
+  api: {
+    operationFailed: '失敗',
+    errorTip: 'エラー',
+    errorMessage: '失敗しました、システム異常です!',
+    timeoutMessage: 'タイムアウトです、もう一度ログインしてください。',
+    apiTimeoutMessage:
+      'インターフェイスリクエストがタイムアウトしました。ページを更新して、もう一度お試しください。',
+    apiRequestFailed: 'エラーをリクエストして、もう一度お試しください。',
+    networkException: 'ネットワークの異常',
+    networkExceptionMsg: 'ネットワークが異常です。接続を確認してください。',
+
+    errMsg401: 'ユーザーに権限がありません(トークン、ユーザー名、間違ったパスワード)!',
+    errMsg403: 'ユーザーは許可されていますが、アクセスは禁止されています。!',
+    errMsg404: 'ネットワークリクエストエラー、リソースが見つかりません!',
+    errMsg405: 'ネットワークリクエストエラー、リクエストメソッドは許可されていません!',
+    errMsg408: 'ネットワークリクエストがタイムアウトしました!',
+    errMsg500: 'サーバーエラー、管理者に連絡してください!',
+    errMsg501: 'ネットワークが実装されていません!',
+    errMsg502: 'ネットワークエラー!',
+    errMsg503: 'サービスが利用できません、サーバーが一時的に過負荷またはメンテナンス!',
+    errMsg504: 'ネットワークタイムアウト!',
+    errMsg505: 'httpバージョンはリクエストをサポートしていません!',
+  },
+  app: {
+    logoutTip: '確認',
+    logoutMessage: 'アカウントからログアウトします。よろしいでしょうか?',
+    menuLoading: 'ローディング',
+  },
+  errorLog: {
+    tableTitle: 'エラーログリスト',
+    tableColumnType: 'タイプ',
+    tableColumnDate: '時間',
+    tableColumnFile: '資料',
+    tableColumnMsg: 'エラーメッセージ',
+    tableColumnStackMsg: 'stack情報',
+
+    tableActionDesc: '詳細',
+
+    modalTitle: 'エラー詳細',
+
+    fireVueError: 'クリックしてvueエラーをトリガーします',
+    fireResourceError: 'クリックしてリソースロードエラーをトリガーします',
+    fireAjaxError: 'クリックしてajaxエラーをトリガーします',
+
+    enableMessage:
+      '`/ src / settings / projectSetting.ts`でuseErrorHandle = trueの場合にのみ有効になります。',
+  },
+  exception: {
+    backLogin: 'ログイン画面に戻る',
+    backHome: 'ホームページに戻る',
+    subTitle403: '申し訳ありませんが、このページにアクセスする権限がありません。',
+    subTitle404: '申し訳ありませんが、アクセスしたページは存在しません。',
+    subTitle500: '申し訳ありませんが、サーバーからエラーが報告されました。',
+    noDataTitle: '現在のページにはデータがありません',
+    networkErrorTitle: 'ネットワークエラー',
+    networkErrorSubTitle:
+      '申し訳ありませんが、ネットワーク接続がダウンしています。ネットワークを確認してください。',
+  },
+  lock: {
+    unlock: 'クリックしてロックを解除',
+    alert: 'ロック画面のパスワードが間違っています',
+    backToLogin: 'ログイン画面に戻る',
+    entry: 'システムに入る',
+    placeholder: 'ロック画面のパスワードまたはユーザーパスワードを入力してください',
+  },
+  login: {
+    backSignIn: '戻る',
+    signInFormTitle: 'ログイン',
+    mobileSignInFormTitle: '電話でログイン',
+    qrSignInFormTitle: 'コードをスキャンしてログインする',
+    signUpFormTitle: '登録',
+    forgetFormTitle: 'パスワードを再設定する',
+    checkMessge: 'ドラッグして検証',
+    checkSuccess: '検証に成功しました',
+
+    signInTitle: '10分で実際のVR空間を作成',
+    signInDesc: 'シンプル、安全、効率的でセルフサービス可能な720度のライブVRを提供',
+    policy: 'xxxプライバシーポリシーに同意します',
+    scanSign: `コードをスキャンした後、「確認」をクリックしてログインを完了します`,
+
+    loginButton: 'ログイン',
+    registerButton: '登録',
+    rememberMe: 'ログイン情報を保存する',
+    forgetPassword: 'パスワードを忘れる',
+    otherSignIn: 'その他のログイン方法',
+
+    // notify
+    loginSuccessTitle: 'ログイン成功',
+    loginSuccessDesc: 'お帰りなさい',
+
+    // placeholder
+    accountPlaceholder: '会社名を入力してください',
+    passwordPlaceholder: 'パスワードを入力して下さい',
+    smsPlaceholder: '確認コードを入力してください',
+    mobilePlaceholder: '電話番号を入力してください',
+    policyPlaceholder: '確認後、ご登録してください',
+    diffPwd: 'パスワードが一致しません',
+
+    userName: '企業アカウント',
+    password: 'パスワード',
+    confirmPassword: 'パスワードを再入力',
+    email: 'メールアドレス',
+    smsCode: 'SMS確認コード',
+    mobile: '携帯番号',
+
+    loginDragValidate: '右にスライドさせログイン認証',
+    loginDragSuccess: 'ログイン認証確認',
+    loginAgain: 'もう一度やり直してください',
+    captcha: '検証コード',
+    registrationLabel: '新規登録',
+    corporationName: '企業アカウント',
+    corporationMail: '企業アカウント',
+    fillMail: 'メールアドレスをご入力してください !',
+    fillMailCorrect: '正しいメールアドレスをご入力してください!',
+    emailSMS: '確認コードを入力',
+  },
+};

+ 939 - 0
src/locales/lang/json/en.json

@@ -0,0 +1,939 @@
+{
+    "code": {
+        "500": "System abnormality",
+        "3004": "User not logged in",
+        "3011": "Password must contain uppercase and lowercase English letters, numbers, and be 8-16 characters long",
+        "3014": "Account or password is incorrect",
+        "3027": "Original password is incorrect",
+        "4001": "No such role",
+        "4002": "No such permission",
+        "4003": "Mobile phone number has been registered",
+        "4004": "Parameter missing",
+        "4007": "User name does not exist",
+        "5010": "Copy failed, scene resource file is incorrect",
+        "5011": "Scene has been archived, no need to archive again",
+        "5013": "Scene has not been archived, no need to restore",
+        "5014": "The scene has been collaborated and cannot be collaborated again",
+        "5015": "The contractor does not exist",
+        "5016": "The restored camera type is different",
+        "5017": "Laser system error",
+        "5018": "Scene collaboration failed, please do not collaborate within the same company",
+        "5019": "The company to which the scene belongs does not exist, or the company administrator does not exist",
+        "5020": "General contractor does not exist",
+        "5021": "Archive failed, the scene is not calculated",
+        "5022": "Only laser scenes can be operated",
+        "5023": "The current scene does not support the generation of obj",
+        "5024": "Scene collaboration failed, please fill in the company administrator account",
+        "5025": "Scene has generated obj",
+        "5026": "The scene is already changing the camera, no migration is required",
+        "5027": "The camera type is different and cannot be migrated",
+        "50006": "The email sending template does not exist",
+        "50050": "The length exceeds the limit! ",
+        "50051": "The record cannot be found! "
+    },
+    "common": {
+        "okText": "Confirm",
+        "closeText": "Close",
+        "cancelText": "Cancel",
+        "EditorNot": "Cancel editing",
+        "loadingText": "Loading...",
+        "saveText": "Save",
+        "delText": "Delete",
+        "operating": "Operation",
+        "resetText": "Reset",
+        "searchText": "Search",
+        "queryText": "Query",
+        "inputText": "Please enter",
+        "chooseText": "Please choose",
+        "edit": "Edit",
+        "redo": "Refresh",
+        "see": "View",
+        "back": "Back",
+        "checkTips": "Verification Tips",
+        "light": "Light theme",
+        "dark": "Dark theme",
+        "unbind": "Unbind",
+        "details": "Details",
+        "bind": "Bind",
+        "yes": "Yes",
+        "no": "No",
+        "roleName": "Role",
+        "roleNameText": "Role Name",
+        "addRoleName": "Add a new role",
+        "editRoleName": "Edit a role",
+        "submitState": "Submitted successfully! ",
+        "unusual": "Abnormal",
+        "operation": "Operation",
+        "normal": "Normal",
+        "unNormal": "Unnormal",
+        "state": "State",
+        "type": "Type",
+        "fullName": "Staff Name",
+        "print": "Print",
+        "all": "All",
+        "tips": "Tips",
+        "optSuccess": "Operation successful!",
+        "optFail": "Operation failed!",
+        "notConnect": "Not connected yet",
+        "delConfirm": "Confirm to delete",
+        "mobile": "Mobile phone",
+        "phone": "Please fill in your mobile phone number! ",
+        "phoneError": "Please fill in your mobile phone number correctly! ",
+        "staffPhoneError": "Please fill in your corporate account correctly! ",
+        "uploadMessge": "Please select the file to upload",
+        "userNick": "Please enter the employee name",
+        "userCorrectNameNick": "Please enter the correct employee name",
+        "warning": "Warning",
+        "reminder": "Warm reminder"
+    },
+    "component": {
+        "app": {
+            "searchNotData": "No search results yet",
+            "toSearch": "Confirm",
+            "toNavigate": "Switch"
+        },
+        "countdown": {
+            "normalText": "Get verification code",
+            "sendText": "Get again after {0} seconds"
+        },
+        "cropper": {
+            "selectImage": "Select image",
+            "uploadSuccess": "Upload successful",
+            "modalTitle": "Upload avatar",
+            "okText": "Confirm and upload",
+            "btn_reset": "Reset",
+            "btn_rotate_left": "Counterclockwise rotation",
+            "btn_rotate_right": "Clockwise rotation",
+            "btn_scale_x": "Horizontal flip",
+            "btn_scale_y": "Vertical flip",
+            "btn_zoom_in": "Zoom in",
+            "btn_zoom_out": "Zoom out",
+            "preview": "Preview"
+        },
+        "drawer": {
+            "loadingText": "Loading...",
+            "cancelText": "Close",
+            "okText": "Confirm"
+        },
+        "excel": {
+            "exportModalTitle": "Export data",
+            "fileType": "File type",
+            "fileName": "File name"
+        },
+        "form": {
+            "putAway": "Collapse",
+            "unfold": "Expand",
+            "maxTip": "The number of characters should be less than {0}",
+            "apiSelectNotFound": "Please wait for data to load..."
+        },
+        "icon": {
+            "placeholder": "Click to select icon",
+            "search": "Search icon",
+            "copy": "Copy icon successfully!"
+        },
+        "menu": {
+            "search": "Menu search"
+        },
+        "modal": {
+            "cancelText": "Close",
+            "okText": "Confirm",
+            "close": "Close",
+            "maximize": "Maximize",
+            "restore": "Restore"
+        },
+        "table": {
+            "settingDens": "Density",
+            "settingDensDefault": "Default",
+            "settingDensMiddle": "Medium",
+            "settingDensSmall": "Compact",
+            "settingColumn": "Column settings",
+            "settingColumnShow": "Column display",
+            "settingIndexColumnShow": "Order column",
+            "settingSelectColumnShow": "Check column",
+            "settingFixedLeft": "Fixed to the left",
+            "settingFixedRight": "Fixed to the right",
+            "settingFullScreen": "Full screen",
+            "index": "Order number",
+            "total": "Total {total} data"
+        },
+        "time": {
+            "before": "Before",
+            "after": "After",
+            "just": "Just now",
+            "seconds": "Seconds",
+            "minutes": "Minutes",
+            "hours": "Hours",
+            "days": "days"
+        },
+        "tree": {
+            "selectAll": "Select all",
+            "unSelectAll": "Unselect",
+            "expandAll": "Expand all",
+            "unExpandAll": "Collapse all",
+            "checkStrictly": "Hierarchical association",
+            "checkUnStrictly": "Hierarchical independence"
+        },
+        "upload": {
+            "save": "Save",
+            "upload": "Upload",
+            "imgUpload": "Image upload",
+            "uploaded": "Uploaded",
+            "operating": "Operation",
+            "del": "Delete",
+            "download": "Download",
+            "saveWarn": "Please wait for the file to be uploaded before saving!",
+            "saveError": "No files were uploaded successfully, cannot be saved!",
+            "preview": "Preview",
+            "choose": "Choose a file",
+            "accept": "Support {0} format",
+            "acceptUpload": "Only {0} format files can be uploaded",
+            "maxSize": "Single file does not exceed {0}MB",
+            "maxSizeMultiple": "Only upload files not exceeding {0}MB!",
+            "maxNumber": "Only upload {0} files at most",
+            "legend": "Thumbnail",
+            "fileName": "File name",
+            "fileSize": "File size",
+            "fileStatue": "Status",
+            "startUpload": "Start uploading",
+            "uploadSuccess": "Upload successful",
+            "uploadError": "Upload failed",
+            "uploading": "Uploading",
+            "uploadWait": "Please wait for the file to upload before operating",
+            "reUploadFailed": "Re-upload the failed file"
+        },
+        "verify": {
+            "error": "Verification failed! ",
+            "time": "Verification successful, took {time} seconds! ",
+            "redoTip": "Click the image to refresh",
+            "dragText": "Please hold down the slider and drag",
+            "successText": "Verification passed"
+        }
+    },
+    "layout": {
+        "footer": {
+            "onlinePreview": "Online preview",
+            "onlineDocument": "Online document"
+        },
+        "header": {
+            "dropdownItemDoc": "Change password",
+            "dropdownItemLoginOut": "Exit system",
+            "tooltipErrorLog": "Error log",
+            "tooltipLock": "Lock screen",
+            "tooltipNotify": "Message notification",
+            "tooltipEntryFull": "Full screen",
+            "tooltipExitFull": "Exit full screen",
+            "lockScreenPassword": "Lock screen password",
+            "lockScreen": "Lock screen",
+            "lockScreenBtn": "Lock",
+            "home": "Home page"
+        },
+        "multipleTab": {
+            "reload": "Reload",
+            "close": "Close tab",
+            "closeLeft": "Close left tab",
+            "closeRight": "Close the right tab",
+            "closeOther": "Close other tabs",
+            "closeAll": "Close all tabs"
+        },
+        "setting": {
+            "contentModeFull": "Streaming",
+            "contentModeFixed": "Fixed width",
+            "topMenuAlignLeft": "Left",
+            "topMenuAlignRight": "Center",
+            "topMenuAlignCenter": "Right",
+            "menuTriggerNone": "Not displayed",
+            "menuTriggerBottom": "Bottom",
+            "menuTriggerTop": "Top",
+            "menuTypeSidebar": "Left menu mode",
+            "menuTypeMixSidebar": "Left menu mixed mode",
+            "menuTypeMix": "Top menu mixed mode",
+            "menuTypeTopMenu": "Top menu mode",
+            "menuDistribution": "Menu distribution",
+            "setRoles": "Modify permissions",
+            "on": "On",
+            "off": "Off",
+            "minute": "Minutes",
+            "operatingTitle": "Operation successful",
+            "operatingContent": "Copy successfully, please modify the configuration in src/settings/projectSetting.ts! ",
+            "resetSuccess": "Reset successful! ",
+            "copyBtn": "Copy",
+            "clearBtn": "Clear cache and return to login page",
+            "drawerTitle": "Project configuration",
+            "darkMode": "Theme",
+            "navMode": "Navigation bar mode",
+            "interfaceFunction": "Interface function",
+            "interfaceDisplay": "Interface display",
+            "animation": "Animation",
+            "splitMenu": "Split menu",
+            "closeMixSidebarOnChange": "Switch page close menu",
+            "sysTheme": "System theme",
+            "headerTheme": "Top bar theme",
+            "sidebarTheme": "Menu theme",
+            "menuDrag": "Side menu drag",
+            "menuSearch": "Menu search",
+            "menuAccordion": "Side menu accordion mode",
+            "menuCollapse": "Collapse menu",
+            "collapseMenuDisplayName": "Collapse menu display name",
+            "topMenuLayout": "Top menu layout",
+            "menuCollapseButton": "Menu collapse button",
+            "contentMode": "Content area width",
+            "expandedMenuWidth": "Menu expansion width",
+            "breadcrumb": "Breadcrumbs",
+            "breadcrumbIcon": "Breadcrumb icon",
+            "tabs": "Tab page",
+            "tabDetail": "Tab details page",
+            "tabsQuickBtn": "Tab page quick button",
+            "tabsRedoBtn": "Tab page refresh button",
+            "tabsFoldBtn": "Tab page fold button",
+            "sidebar": "Left menu",
+            "header": "Top bar",
+            "footer": "Footer",
+            "fullContent": "Full screen content",
+            "grayMode": "Gray mode",
+            "colorWeak": "Color weak mode",
+            "progress": "Top progress bar",
+            "switchLoading": "Switch loading",
+            "switchAnimation": "Switch animation",
+            "animationType": "Animation type",
+            "autoScreenLock": "Automatic screen lock",
+            "notAutoScreenLock": "Not automatic screen lock",
+            "fixedHeader": "Fixed header",
+            "fixedSideBar": "Fixed Sidebar",
+            "mixSidebarTrigger": "Mixed menu trigger mode",
+            "triggerHover": "Hover",
+            "triggerClick": "Click",
+            "mixSidebarFixed": "Fixed expansion menu"
+        }
+    },
+    "sys": {
+        "api": {
+            "operationFailed": "Operation failed",
+            "errorTip": "Error message",
+            "errorMessage": "Operation failed, system abnormality!",
+            "timeoutMessage": "Login timed out, please log in again!",
+            "apiTimeoutMessage": "Interface request timed out, please refresh the page and try again!",
+            "apiRequestFailed": "Request error, please try again later",
+            "networkException": "Network abnormality",
+            "networkExceptionMsg": "Network abnormality, please check whether your network connection is normal!",
+            "errMsg401": "User has no permission (token, username, password error)!",
+            "errMsg403": "User is authorized, but access is prohibited. !",
+            "errMsg404": "Network request error, the resource was not found!",
+            "errMsg405": "Network request error, the request method is not allowed!",
+            "errMsg408": "Network request timed out!",
+            "errMsg500": "Server error, please contact the administrator!",
+            "errMsg501": "Network not implemented!",
+            "errMsg502": "Network error!",
+            "errMsg503": "Service unavailable, the server is temporarily overloaded or maintained!",
+            "errMsg504": "Network timed out!",
+            "errMsg505": "http version does not support the request!"
+        },
+        "app": {
+            "logoutTip": "Warm reminder",
+            "logoutMessage": "Are you sure you want to exit the system?",
+            "menuLoading": "Menu loading..."
+        },
+        "errorLog": {
+            "tableTitle": "Log list",
+            "tableColumnType": "Type",
+            "tableColumnDate": "Time",
+            "tableColumnFile": "File",
+            "tableColumnMsg": "Error message",
+            "tableColumnStackMsg": "Stack message",
+            "tableActionDesc": "Details",
+            "modalTitle": "Error details",
+            "fireVueError": "Click to trigger vue error",
+            "fireResourceError": "Click to trigger resource loading error",
+            "fireAjaxError": "Click to trigger ajax error",
+            "enableMessage": "Only works when useErrorHandle=true in `/src/settings/projectSetting.ts`."
+        },
+        "exception": {
+            "backLogin": "Back to login",
+            "backHome": "Back to homepage",
+            "subTitle403": "Sorry, you do not have permission to access this page. ",
+            "subTitle404": "Sorry, the page you visited does not exist. ",
+            "subTitle500": "Sorry, the server reported an error. ",
+            "noDataTitle": "There is no data on this page",
+            "networkErrorTitle": "Network error",
+            "networkErrorSubTitle": "Sorry, your network connection has been disconnected, please check your network! "
+        },
+        "lock": {
+            "unlock": "Click to unlock",
+            "alert": "Wrong lock screen password",
+            "backToLogin": "Return to login",
+            "entry": "Enter the system",
+            "placeholder": "Please enter the lock screen password or user password"
+        },
+        "login": {
+            "backSignIn": "Return",
+            "signInFormTitle": "Login",
+            "mobileSignInFormTitle": "Mobile login",
+            "qrSignInFormTitle": "QR code login",
+            "signUpFormTitle": "Register",
+            "forgetFormTitle": "Reset password",
+            "signInTitle": "Dealer management system",
+            "signInDesc": "",
+            "policy": "I agree to xxx privacy policy",
+            "scanSign": "Scan the code and click \"Confirm\" to complete the login",
+            "loginButton": "Login",
+            "registerButton": "Register",
+            "rememberMe": "Remember me",
+            "forgetPassword": "Forgot your password?",
+            "otherSignIn": "Other login methods",
+            "loginSuccessTitle": "Login successful",
+            "loginSuccessDesc": "Welcome back",
+            "accountPlaceholder": "Please enter your account",
+            "passwordPlaceholder": "Please enter your password",
+            "smsPlaceholder": "Please enter your verification code",
+            "mobilePlaceholder": "Please enter your mobile number",
+            "policyPlaceholder": "Check this to register",
+            "diffPwd": "The two passwords you entered do not match",
+            "userName": "Account",
+            "password": "Password",
+            "confirmPassword": "Confirm password",
+            "email": "Email",
+            "smsCode": "SMS verification code",
+            "mobile": "Mobile number"
+        }
+    },
+    "routes": {
+        "account": {
+            "type": {
+                "1": "Equity order",
+                "2": "Download order",
+                "3": "Consumption order"
+            }
+        },
+        "basic": {
+            "login": "Login",
+            "errorLogList": "Error log list"
+        },
+        "config": {
+            "login": "Login",
+            "serial": "Serial number",
+            "file": "Unity executable file",
+            "directory": "Unity project directory",
+            "setconfig": "Modify configuration information",
+            "account": "Unity account",
+            "password": "Unity password"
+        },
+        "dashboard": {
+            "dashboard": "Homepage",
+            "about": "About",
+            "workbench": "Workbench",
+            "analysis": "Analysis page",
+            "corporation": "Corporate management",
+            "operate": "Official website operation management",
+            "system": "System management",
+            "systemUser": "Account management",
+            "operateNews": "News management",
+            "operateRecruit": "Recruitment management",
+            "operateMessage": "Message management",
+            "invoice": "Invoice management",
+            "orderCamera": "Camera order",
+            "orderList": "Order management",
+            "orderEquity": "Equity order",
+            "orderDownload": "Download order",
+            "corporationAccount": "Corporate account",
+            "corporationVerify": "Corporate certification",
+            "bulletin": "Information release",
+            "bulletinRentInfo": "Rent information",
+            "bulletinSellInfo": "Sell information",
+            "bulletinDecoration": "Construction site decoration",
+            "advertisement": "Advertisement position",
+            "advertisementList": "Carousel",
+            "advertisementPads": "Recommendation position",
+            "scenes": "VR scene management",
+            "scenesDownload": "Scene download",
+            "scenesList": "Scene list",
+            "scenesLive": "Live broadcast",
+            "scenesRoom": "Room management",
+            "product": "Product management",
+            "firmware": "Firmware management",
+            "account": "User management",
+            "overview": "User overview",
+            "details": "Order details",
+            "productData": "Product data",
+            "sdk": "Space Target SDK",
+            "app": "App management",
+            "productRef": "Product attributes",
+            "productList": "Product list",
+            "productCategory": "Product category",
+            "order": "Order management",
+            "cameraList": "Camera order list",
+            "downloadList": "Download order list",
+            "equityList": "Equity order list",
+            "orderDetail": "Order details",
+            "member": "Member Management",
+            "memberList": "Member List",
+            "staff": "Staff Management",
+            "staffList": "Staff List",
+            "staffClean": "Clear Status",
+            "feedback": "Feedback Management",
+            "feedbackList": "Feedback List",
+            "productOperation": "Product Operation Management",
+            "cameraScene": "Scene Management",
+            "kankanScene": "4D Look",
+            "MinionScene": "4D See",
+            "laserScene": "4D Deep Time",
+            "liteScene": "4D Binocular Lite",
+            "sxz": "Supporting Solution Management",
+            "viewKankan": "Panoramic Work Management",
+            "customer": "Customer Management",
+            "customerDevice": "Customer Device",
+            "customerScene": "Customer Scene",
+            "devices": "Device Management",
+            "equity": "Equity Management",
+            "scene": "Scene Management",
+            "finance": "Sales Statistics",
+            "loglist": "operation log",
+            "retailer": "distributor management"
+        },
+        "demo": {
+            "charts": {
+                "baiduMap": "Baidu Map",
+                "aMap": "Amap",
+                "googleMap": "Google Map",
+                "charts": "Chart",
+                "map": "Map",
+                "line": "Line Chart",
+                "pie": "Pie Chart"
+            },
+            "comp": {
+                "comp": "Component",
+                "basic": "Basic Component",
+                "transition": "Animation Component",
+                "countTo": "Digital Animation",
+                "scroll": "Scroll Component",
+                "scrollBasic": "Basic Scroll",
+                "scrollAction": "Scroll Function",
+                "virtualScroll": "Virtual Scroll",
+                "tree": "Tree",
+                "treeBasic": "Basic Tree",
+                "editTree": "Searchable/Toolbar",
+                "actionTree": "Function Operation Example",
+                "modal": "Popup Extension",
+                "drawer": "Drawer Extension",
+                "desc": "Details component",
+                "lazy": "Lazy loading component",
+                "lazyBasic": "Basic example",
+                "lazyTransition": "Animation effect",
+                "verify": "Verification component",
+                "verifyDrag": "Drag verification",
+                "verifyRotate": "Image restoration",
+                "qrcode": "QR code component",
+                "strength": "Password strength component",
+                "upload": "Upload component",
+                "loading": "Loading",
+                "time": "Relative time",
+                "cropperImage": "Image cropping",
+                "cardList": "Card list"
+            },
+            "editor": {
+                "editor": "Editor",
+                "jsonEditor": "Json editor",
+                "markdown": "markdown editor",
+                "tinymce": "Rich text",
+                "tinymceBasic": "Basic use",
+                "tinymceForm": "Embedded form"
+            },
+            "excel": {
+                "excel": "Excel",
+                "customExport": "Select export format",
+                "jsonExport": "JSON data export",
+                "arrayExport": "Array data export",
+                "importExcel": "Import"
+            },
+            "feat": {
+                "feat": "Function",
+                "icon": "Icon",
+                "sessionTimeout": "Login expired",
+                "tabs": "Tab operation",
+                "tabDetail": "Tab details page",
+                "print": "Print",
+                "contextMenu": "Right-click menu",
+                "download": "File download",
+                "clickOutSide": "ClickOutSide component",
+                "imgPreview": "Image preview",
+                "copy": "Clipboard",
+                "msg": "Message prompt",
+                "watermark": "Watermark",
+                "ripple": "Water ripple",
+                "fullScreen": "Full screen",
+                "errorLog": "Error log",
+                "tab": "Tab with parameters",
+                "tab1": "Tab with parameter 1",
+                "tab2": "Tab with parameter 2",
+                "menu": "Menu with parameter",
+                "menu1": "Menu with parameter 1",
+                "menu2": "Menu with parameter 2",
+                "ws": "websocket test",
+                "breadcrumb": "Breadcrumb navigation",
+                "breadcrumbFlat": "Flat mode",
+                "breadcrumbFlatDetail": "Flat details",
+                "breadcrumbChildren": "Hierarchical mode",
+                "breadcrumbChildrenDetail": "Hierarchical details"
+            },
+            "flow": {
+                "name": "Graphic editor",
+                "flowChart": "Flowchart"
+            },
+            "form": {
+                "form": "Form",
+                "basic": "Basic form",
+                "useForm": "useForm",
+                "refForm": "RefForm",
+                "advancedForm": "Shrinkable form",
+                "ruleForm": "Form validation",
+                "dynamicForm": "Dynamic form",
+                "customerForm": "Custom component",
+                "appendForm": "Form addition and deletion example"
+            },
+            "iframe": {
+                "frame": "External page",
+                "antv": "antVue document (embedded)",
+                "doc": "Project document (embedded)",
+                "docExternal": "Project document (external link)"
+            },
+            "level": {
+                "level": "Multi-level menu"
+            },
+            "page": {
+                "page": "Page",
+                "form": "Form page",
+                "formBasic": "Basic form",
+                "formStep": "Step-by-step form",
+                "formHigh": "Advanced form",
+                "desc": "Details page",
+                "descBasic": "Basic details page",
+                "descHigh": "Advanced details page",
+                "result": "Result page",
+                "resultSuccess": "Success page",
+                "resultFail": "Failure page",
+                "account": "Personal page",
+                "accountCenter": "Personal center",
+                "accountSetting": "Personal settings",
+                "exception": "Exception page",
+                "netWorkError": "Network error",
+                "notData": "No data",
+                "list": "List page",
+                "listCard": "Card list",
+                "listBasic": "Standard list",
+                "listSearch": "Search list"
+            },
+            "permission": {
+                "permission": "Permission management",
+                "front": "Based on front-end permissions",
+                "frontPage": "Page permissions",
+                "frontBtn": "Button permissions",
+                "frontTestA": "Permission test page A",
+                "frontTestB": "Permission test page B",
+                "back": "Based on background permissions",
+                "backPage": "Page permissions",
+                "backBtn": "Button permissions"
+            },
+            "setup": {
+                "page": "Boot page"
+            },
+            "system": {
+                "moduleName": "System management",
+                "account": "Account management",
+                "account_detail": "Account details",
+                "password": "Change password",
+                "dept": "Department management",
+                "menu": "Menu management",
+                "role": "Role management"
+            },
+            "table": {
+                "table": "Table",
+                "basic": "Basic table",
+                "treeTable": "Tree table",
+                "fetchTable": "Remote loading example",
+                "fixedColumn": "Fixed column",
+                "customerCell": "Custom column",
+                "formTable": "Open search area",
+                "useTable": "UseTable",
+                "refTable": "RefTable",
+                "multipleHeader": "Multi-level header",
+                "mergeHeader": "Merge cells",
+                "expandTable": "Expandable table",
+                "fixedHeight": "Fixed height/header customization",
+                "footerTable": "Total of footer rows",
+                "editCellTable": "Editable cells",
+                "editRowTable": "Editable rows",
+                "authColumn": "Authorization column"
+            }
+        },
+        "device": {
+            "snCode": "SN code",
+            "wifiName": "wifi name",
+            "deviceType": "device type",
+            "activatedTime": "delivery time",
+            "userName": "bind account",
+            "NoBind": "unbound",
+            "type": {
+                "0": "old binocular camera",
+                "1": "4D look",
+                "2": "4D see",
+                "3": "4D deep time",
+                "9": "4D see",
+                "10": "4D deep time",
+                "11": "4D deep light"
+            },
+            "status": {
+                "0": "in effect",
+                "1": "expired",
+                "2": "bound",
+                "3": "unbound"
+            },
+            "bindStatus": "binding status",
+            "statusName": "rights status",
+            "subAgentName": "distributor"
+        },
+        "finance": {
+            "deptName": "Company",
+            "userName": "Name",
+            "nickName": "Employee nickname",
+            "setpaswd": "Change password",
+            "mobile": "Mobile phone",
+            "permList": "Equity",
+            "userId": "Account",
+            "createTime": "Authorization time",
+            "updateTime": "Modification time",
+            "staffList": "Account list",
+            "updateBtn": "Change password",
+            "password": "Change password",
+            "agentName": "Authorizer",
+            "equityType": {
+                "0": "Professional member (year)",
+                "1": "Senior member (month)",
+                "2": "Scene download (times)"
+            },
+            "giveType": {
+                "0": "Dealer authorization",
+                "1": "Dealer renewal",
+                "2": "Official website purchase",
+                "3": "Platform authorization"
+            },
+            "totalTime": "Total authorization period (year/month)"
+        },
+        "operate": {
+            "releaseTime": "Release time",
+            "newsTitle": "News title",
+            "newsAdd": "News added",
+            "source": "Source",
+            "objTitle": "Job title",
+            "submitTitle": "Submission time",
+            "mesgContent": "Message content"
+        },
+        "product": {
+            "addVstive": "New Version",
+            "newsTitle": "news headlines",
+            "newsAdd": "new news",
+            "source": "source",
+            "objTitle": "Job name",
+            "submitTitle": "Submit time",
+            "mesgContent": "Message content",
+            "types": "device type",
+            "minVersion": "Minimum version number",
+            "version": "version number",
+            "versionPlaceholder": "Latest version number",
+            "versionTips": "(Forced update below this version number)",
+            "description": "version update description",
+            "description_zh": "Chinese update description",
+            "description_en": "English update description",
+            "file": "file",
+            "type": {
+                "0": "Old binocular camera",
+                "1": "Four-dimensional look",
+                "2": "Four dimensions to see",
+                "3": "Four-dimensional depth",
+                "9": "Four dimensions to see",
+                "10": "Four-dimensional depth time"
+            },
+            "outType": {
+                "0": "normal sales",
+                "1": "Employee's own use",
+                "2": "Gift gift",
+                "3": "Other"
+            },
+            "sdkType": {
+                "1": "Unity",
+                "2": "UE4"
+            },
+            "statusType": {
+                "0": "Not published",
+                "1": "Published"
+            }
+        },
+        "retailer": {
+            "name": "distributor name",
+            "add": "New distributor",
+            "editfxs": "Editor Distributor",
+            "setName": "Equity settings",
+            "nickName": "Contact",
+            "userName": "Please enter 4D to view the account",
+            "userId": "Account",
+            "tips": "The account does not exist",
+            "jxs": "Distributor",
+            "fxs": "distributor",
+            "majorAddNum": "Professional member (years): {value} years remaining, added this time (years)",
+            "highAddNum": "Premium members (months): {value} months remaining, added this time (months)",
+            "downAddNum": "Scene download (times): {value} remaining, this time added (times)",
+            "ff": "Distribution",
+            "Unbind": "Unbind",
+            "UnbindTips": "Are you sure you want to unbind?",
+            "allff": "Device batch distribution",
+            "majorTotalNum": "Remaining Professional Membership Years",
+            "highTotalNum": "Number of months remaining for premium members",
+            "downTotalNum": "Number of remaining scene downloads",
+            "createName": "creator",
+            "createTime": "createTime",
+            "addjxs": "New Distributor",
+            "editjxs": "Edit Distributor",
+            "form": {
+                "name": "distributor name",
+                "nickName": "Contact",
+                "userName": "Please enter 4D to view the account",
+                "userId": "Account",
+                "tips": "The account does not exist",
+                "enable": "Enable",
+                "stopUsing": "Discontinued",
+                "dqname": "current distributor"
+            },
+            "exportText": "Succeeded in importing {value} data",
+            "device": {
+                "title": "Device distribution",
+                "list": "Device list",
+                "downmTips": "Download Distributor Device List Template",
+                "filename": "Distributor Device List Template"
+            }
+        },
+        "scene": {
+            "tableType": {
+                "0": "4DKanKan Pro",
+                "1": "4DKanKan Minion",
+                "2": "4DKanKan Mega cloud scene",
+                "3": "4DKanKan Pro",
+                "5": "4DKanKan Mega Mesh Scene",
+                "6": "4DKanKan Meta Point Cloud Scene",
+                "7": "4DKanKan Meta Mesh Scene"
+            },
+            "transfer": "Transfer",
+            "copy": "copy",
+            "down": "down",
+            "canlenDown": "Cancel the download",
+            "sceneName": "scene title",
+            "num": "scene code",
+            "createTime": "Shooting time",
+            "amount": "Completion time of calculation",
+            "snCode": "SN码",
+            "sceneSize": "scene size",
+            "userName": "Account",
+            "title": "title",
+            "viewCount": "views",
+            "copyTime": "copy time",
+            "isCopy": "Do you copy",
+            "status": "Status",
+            "statusType": {
+                "0": "Synchronizing",
+                "1": "Synchronization successful",
+                "-2": "Calculated successfully",
+                "-1": "Failed",
+                "-3": "Sealed"
+            },
+            "copyTipsTitle": "Copy Scene",
+            "copyTipsText": "Copy the scene, the scene belongs to the original camera. <br/>Are you sure you want to copy the scene? ",
+            "copyScuse": "Copy successfully",
+            "deleteScuse": "Delete successfully",
+            "downErr": "Download failed",
+            "transferScuse": "The scene migration was successful. ",
+            "syncScuse": "The scene synchronization was successful. ",
+            "transferTitle": "Transfer Scene",
+            "toSnCode": "Migrate to",
+            "Reset": "Recalculate",
+            "resetTips": "Is it recalculated?",
+            "rules": {
+                "snCode": "Please enter the camera SN code",
+                "snCode1": "Chinese characters not supported"
+            }
+        },
+        "system": {
+            "roleBut": "Permissions",
+            "userName": "Username",
+            "config": "Untiy configuration",
+            "accountList": "Account list",
+            "addHost": "Add a host",
+            "edit": "Edit user information",
+            "delText": "Delete this account",
+            "departmentList": "Department list",
+            "departmentName": "Department name",
+            "addDepartment": "Add a department",
+            "editDepartment": "Edit department",
+            "addUser": "Add an account",
+            "editUser": "Edit an account",
+            "parentDept": "Parent department",
+            "infoData": {
+                "title": "User {userId}'s information",
+                "content": "This is the user information details page. This page is only used to demonstrate that the same route opens multiple pages in the tab and displays different data"
+            },
+            "disable": "Disable account",
+            "set": "Change password",
+            "userProfile": "User profile",
+            "log": "Operation log",
+            "userinfo": "This is the user {userId} profile tab",
+            "userlog": "This is the user {userId} operation log tab",
+            "setTitle": "Details: User",
+            "enable": "Enable",
+            "stopUsing": "Disable",
+            "description": "Role description",
+            "remarks": "Remarks",
+            "newMenu": "Add menu",
+            "editMenu": "Edit menu",
+            "menuList": "Menu list",
+            "menuType": "Menu type",
+            "menuName": "Menu name",
+            "menuName1": "Please enter the menu name",
+            "menuName2": "Please enter the correct menu name",
+            "menuPath": "Menu path",
+            "routerPath": "Menu path",
+            "menuUrl": "External link address",
+            "menuParentName": "Previous menu",
+            "component": "Component path",
+            "icon": "Icon",
+            "perms": "Permission identifier",
+            "passwordOld": "Current password",
+            "passwordNew": "New password",
+            "passwordNew1": "Please enter a new password",
+            "setpassword": "Set password",
+            "confirmPassword": "Confirm password",
+            "confirmPassword1": "Cannot be empty",
+            "confirmPassword2": "The two passwords entered are inconsistent!",
+            "userList": {
+                "id": "User ID",
+                "companyName": "Company",
+                "userName": "User name",
+                "nickName": "Account",
+                "createTime": "Creation time"
+            },
+            "isExt": {
+                "0": "No",
+                "1": "Yes",
+                "title": "Is it an external link",
+                "url": ""
+            },
+            "type": {
+                "0": "Directory",
+                "1": "Menu",
+                "2": "Button",
+                "3": "Button",
+                "title": "Type"
+            },
+            "roleTitle": "Role List",
+            "isPlatformRole": "Is it enabled",
+            "sortOrder": "Sorting",
+            "status": "Status",
+            "isShow": "Is it displayed",
+            "buttonMenuWaring": "The parent menu can only be of menu type"
+        }
+    }
+}

+ 926 - 0
src/locales/lang/json/ja.json

@@ -0,0 +1,926 @@
+{
+    "code": {
+        "500": "システム例外",
+        "3001": "必要なパラメータがありません",
+        "3002": "アクセス例外",
+        "3003": "異常なアクセス",
+        "3004": "ユーザーがログインしていません",
+        "3005": "確認コードの有効期限が切れています",
+        "3006": "検証コードエラー",
+        "3007": "ニックネームは存在します",
+        "3008": "このメールアドレスは既に登録されています",
+        "3009": "入力した2つのパスワードが一致しません",
+        "3010": "ニックネームの長さが間違いします",
+        "3011": "パスワードの長さは、英語の大文字と小文字、数字、および8~16文字です",
+        "3012": "不適切な内容が含まれています。",
+        "3013": "電話番号のフォーマットが間違います",
+        "3014": "アカウントまたはパスワードが誤っています。",
+        "3015": "ユーザーが存在しません",
+        "3016": "ログインに失敗しました。アカ​​ウントへのアクセスが許可されていません",
+        "3017": "空のファイル",
+        "3018": "アップロードまたは使用できるファイルがありません。",
+        "3019": "メールの格式が合わないです。",
+        "3020": "メールアドレスが存在しています",
+        "3021": "アカウントが存在しません。確認して再入力してください。",
+        "3022": "このシーンにコラボレーターが追加されました。追加する前にコラボレーションをキャンセルしてください",
+        "3023": "確認コードを取得する回数が多すぎます。明日もう一度お試しください",
+        "3024": "シーンを自分自身に割り当てることはできません",
+        "3025": "カメラを自分自身に割り当てることができません",
+        "3026": "一部のシーンには共同編集者がいます。追加する前に共同作業をキャンセルしてください",
+        "3027": "元のパスワードが間違います",
+        "3028": "役割は存在します",
+        "3029": "役割に関連付けられているユーザーがいます。ユーザーを削除、または属する役割を変更してください",
+        "3030": "現在の会員特典はありません",
+        "3031": "カメラがバインドされています",
+        "3032": "現在のカメラはバインドされています。別のカメラを選択してください",
+        "3033": "確認コードを60秒以内に繰り返し取得することはできません",
+        "3034": "サーバーがビジーです。もう一度お試しください",
+        "3035": "ログインアカウントが承認されていません。もう一度お試しください",
+        "4001": "タイムアウトしました",
+        "4002": "ユーザーは既に存在します",
+        "4003": "電話番号はすでに登録されています",
+        "4004": "2回入力したパスワードが一致しません",
+        "4005": "電話番号が確認コードと一致しません",
+        "4006": "検証コードがエラー",
+        "4007": "ユーザー名は存在しません",
+        "4008": "ユーザーがログインしていません",
+        "4009": "エラー",
+        "4010": "バウンドカメラが存在しません",
+        "4011": "カメラはすでにバインドされています",
+        "4012": "ユーザーネームまたはパスワードが違います",
+        "4013": "ニックネームが重複しています",
+        "4014": "残高が足りないので、モデルの生成ができません。ホームページからチャージまたは、アップロード時にモデル生成オプションを削除してください。",
+        "4015": "不適切な内容が含まれています。",
+        "4016": "パラメータが空です",
+        "4017": "シーンは空です",
+        "4018": "シーンはこのカメラに属していません",
+        "4019": "シーン番号が空です",
+        "4020": "カメラはユーザーにバインドされていません",
+        "4021": "注文はすでに請求されているので、失敗しました。",
+        "5010": "コピーに失敗しました。シーンのファイルが破損しています。",
+        "5011": "シーンは既にアーカイブされています。",
+        "5013": "シーンはアーカイブされてないため、復元できません。",
+        "5014": "シーンは既にインバイトされています。",
+        "5015": "この下請は存在しません。",
+        "5016": "同じカメラが登録されていません。",
+        "5017": "レーザーエラー",
+        "5018": "同じ企業アカウントはインバイトできません。",
+        "5019": "シーンを撮影した企業アカウントが存在しません。",
+        "5020": "元請が存在しまん。",
+        "5021": "アーカイブに失敗しました。シーンが計算中です。",
+        "5022": "このシーンは点群モードのみ操作可能です。",
+        "5023": "このシーンはOBJの生成をサポートしません",
+        "5024": "協同エディットに失敗、企業管理アカウントを入力してください。",
+        "5025": "场景已生成obj",
+        "5026": "场景已在改相机,无需迁移",
+        "5027": "相机类型不同,不能迁移",
+        "50006": "メール送信テンプレートが存在しません",
+        "50050": "長さが限界を超えています!",
+        "50051": "記録が見当たりませんでした!"
+    },
+    "common": {
+        "state": "調子",
+        "type": "の種類",
+        "fullName": "名前",
+        "print": "プリント",
+        "all": "すべて",
+        "optSuccess": "完了",
+        "okText": "確認",
+        "closeText": "閉じる",
+        "cancelText": "キャンセル",
+        "searchText": "探す",
+        "queryText": "検索実行",
+        "inputText": "入力してください",
+        "chooseText": "選択してください。",
+        "edit": "編集",
+        "redo": "リフレッシュ",
+        "light": "明るいテーマ",
+        "optFail": "失敗しました!",
+        "notConnect": "まだ接続されていません",
+        "delConfirm": "削除しますか?",
+        "mobile": "携帯電話",
+        "phone": "携帯電話番号を入力してください!",
+        "phoneError": "携帯電話番号を正しく入力してください!",
+        "isConfirm": "よろしいですか?",
+        "dark": "ダークテーマ",
+        "unbind": "解放",
+        "details": "詳細",
+        "bind": "バインディング",
+        "yes": "はい",
+        "no": "いいえ",
+        "roleName": "権限",
+        "roleNameText": "役割名です",
+        "unusual": "異常な",
+        "operation": "エディット",
+        "delText": "削除",
+        "operating": "エディット",
+        "resetText": "リセット",
+        "loadingText": "読み込み中...",
+        "saveText": "保存",
+        "back": "戻る",
+        "checkTips": "プロンプトを確認",
+        "unNormal": "異常な"
+    },
+    "component": {
+        "app": {
+            "searchNotData": "No search results yet",
+            "toSearch": "to search",
+            "toNavigate": "to navigate"
+        },
+        "countdown": {
+            "normalText": "Get SMS code",
+            "sendText": "Reacquire in {0}s"
+        },
+        "cropper": {
+            "selectImage": "Select Image",
+            "uploadSuccess": "Uploaded success!",
+            "modalTitle": "Avatar upload",
+            "okText": "Confirm and upload",
+            "btn_reset": "Reset",
+            "btn_rotate_left": "Counterclockwise rotation",
+            "btn_rotate_right": "Clockwise rotation",
+            "btn_scale_x": "Flip horizontal",
+            "btn_scale_y": "Flip vertical",
+            "btn_zoom_in": "Zoom in",
+            "btn_zoom_out": "Zoom out",
+            "preview": "Preivew"
+        },
+        "drawer": {
+            "loadingText": "Loading...",
+            "cancelText": "Close",
+            "okText": "Confirm"
+        },
+        "excel": {
+            "exportModalTitle": "Export data",
+            "fileType": "File type",
+            "fileName": "File name"
+        },
+        "form": {
+            "putAway": "Put away",
+            "unfold": "Unfold",
+            "maxTip": "The number of characters should be less than {0}",
+            "apiSelectNotFound": "Wait for data loading to complete..."
+        },
+        "icon": {
+            "placeholder": "Click the select icon",
+            "search": "Search icon",
+            "copy": "Copy icon successfully!"
+        },
+        "menu": {
+            "search": "Menu search"
+        },
+        "modal": {
+            "cancelText": "Close",
+            "okText": "Confirm",
+            "close": "Close",
+            "maximize": "Maximize",
+            "restore": "Restore"
+        },
+        "table": {
+            "settingDens": "Density",
+            "settingDensDefault": "Default",
+            "settingDensMiddle": "Middle",
+            "settingDensSmall": "Compact",
+            "settingColumn": "Column settings",
+            "settingColumnShow": "Column display",
+            "settingIndexColumnShow": "Index Column",
+            "settingSelectColumnShow": "Selection Column",
+            "settingFixedLeft": "Fixed Left",
+            "settingFixedRight": "Fixed Right",
+            "settingFullScreen": "Full Screen",
+            "index": "Index",
+            "total": "total of {total}"
+        },
+        "time": {
+            "before": " ago",
+            "after": " after",
+            "just": "just now",
+            "seconds": " seconds",
+            "minutes": " minutes",
+            "hours": " hours",
+            "days": " days"
+        },
+        "tree": {
+            "selectAll": "Select All",
+            "unSelectAll": "Cancel Select",
+            "expandAll": "Expand All",
+            "unExpandAll": "Collapse all",
+            "checkStrictly": "Hierarchical association",
+            "checkUnStrictly": "Hierarchical independence"
+        },
+        "upload": {
+            "save": "Save",
+            "upload": "Upload",
+            "imgUpload": "ImageUpload",
+            "uploaded": "Uploaded",
+            "operating": "Operating",
+            "del": "Delete",
+            "download": "download",
+            "saveWarn": "Please wait for the file to upload and save!",
+            "saveError": "There is no file successfully uploaded and cannot be saved!",
+            "preview": "Preview",
+            "choose": "Select the file",
+            "accept": "Support {0} format",
+            "acceptUpload": "Only upload files in {0} format",
+            "maxSize": "A single file does not exceed {0}MB ",
+            "maxSizeMultiple": "Only upload files up to {0}MB!",
+            "maxNumber": "Only upload up to {0} files",
+            "legend": "Legend",
+            "fileName": "File name",
+            "fileSize": "File size",
+            "fileStatue": "File status",
+            "startUpload": "Start upload",
+            "uploadSuccess": "Upload successfully",
+            "uploadError": "Upload failed",
+            "uploading": "Uploading",
+            "uploadWait": "Please wait for the file upload to finish",
+            "reUploadFailed": "Re-upload failed files"
+        },
+        "verify": {
+            "error": "verification failed!",
+            "time": "The verification is successful and it takes {time} seconds!",
+            "redoTip": "Click the picture to refresh",
+            "dragText": "Hold down the slider and drag",
+            "successText": "Verified"
+        }
+    },
+    "layout": {
+        "footer": {
+            "onlinePreview": "オンラインプレビュー",
+            "onlineDocument": "オンラインドキュメント"
+        },
+        "header": {
+            "dropdownItemDoc": "ドキュメント",
+            "dropdownItemLoginOut": "ログアウト",
+            "tooltipErrorLog": "エラーログ",
+            "tooltipLock": "ロック画面",
+            "tooltipNotify": "お知らせ",
+            "tooltipEntryFull": "全画面表示",
+            "tooltipExitFull": "全画面表示を終了",
+            "lockScreenPassword": "ロック画面のパスワード",
+            "lockScreen": "ロック画面",
+            "lockScreenBtn": "ロック",
+            "home": "ホームページ",
+            "personalSetting": "アカウントの設定"
+        },
+        "multipleTab": {
+            "reload": "リロード",
+            "close": "タブを閉じる",
+            "closeLeft": "左のタブを閉じる",
+            "closeRight": "右タブを閉じる",
+            "closeOther": "他のタブを閉じる",
+            "closeAll": "すべてのタブを閉じる"
+        },
+        "setting": {
+            "contentModeFull": "ストリーミング",
+            "contentModeFixed": "固定幅",
+            "topMenuAlignLeft": "左揃え",
+            "topMenuAlignRight": "右揃え",
+            "topMenuAlignCenter": "中央揃え",
+            "menuTriggerNone": "非表示",
+            "menuTriggerBottom": "下部",
+            "menuTriggerTop": "上部",
+            "menuTypeSidebar": "左メニューモード",
+            "menuTypeMixSidebar": "左メニューブレンドモード",
+            "menuTypeMix": "トップメニューブレンドモード",
+            "menuTypeTopMenu": "トップメニューモード",
+            "on": "オン",
+            "off": "オフ",
+            "minute": "分",
+            "operatingTitle": "成功",
+            "operatingContent": "コピーが完了しました。src/settings/projectSetting.ts に設定が保存されます!",
+            "resetSuccess": "リセットが完了しました",
+            "copyBtn": "コピー",
+            "clearBtn": "キャッシュをクリアしてログインページに戻る",
+            "drawerTitle": "設定",
+            "darkMode": "テーマ",
+            "navMode": "ナビゲーションバーモード",
+            "interfaceFunction": "界面機能",
+            "interfaceDisplay": "界面表示",
+            "animation": "アニメーション",
+            "splitMenu": "分割メニュー",
+            "closeMixSidebarOnChange": "ページクローズメニューの切り替え",
+            "sysTheme": "システムテーマ",
+            "headerTheme": "トップバーのテーマ",
+            "sidebarTheme": "メニューテーマ",
+            "menuDrag": "サイドメニュードラッグ",
+            "menuSearch": "メニュー検索",
+            "menuAccordion": "サイドメニューアコーディオンモード",
+            "menuCollapse": "折りたたみメニュー",
+            "collapseMenuDisplayName": "メニュー表示名を折りたたむ",
+            "topMenuLayout": "トップメニューのレイアウト",
+            "menuCollapseButton": "メニュー折りたたみボタン",
+            "contentMode": "コンテンツ領域の幅",
+            "expandedMenuWidth": "メニュー拡張幅",
+            "breadcrumb": "参照パス",
+            "breadcrumbIcon": "参照パスアイコン",
+            "tabs": "タブ",
+            "tabDetail": "タグの詳細ページ",
+            "tabsQuickBtn": "タブショートカットボタン",
+            "tabsRedoBtn": "タブ更新ボタン",
+            "tabsFoldBtn": "サイドメニュー折りたたみボタン",
+            "sidebar": "左メニュー",
+            "header": "トップバー",
+            "footer": "フッター",
+            "fullContent": "フルスクリーンコンテンツ",
+            "grayMode": "グレーモード",
+            "colorWeak": "色弱モード",
+            "progress": "トッププログレスバー",
+            "switchLoading": "トグルloading",
+            "switchAnimation": "アニメーションを切り替える",
+            "animationType": "アニメーションの種類",
+            "autoScreenLock": "一定時間で画面ロック",
+            "notAutoScreenLock": "一定時間で画面ロックしない",
+            "fixedHeader": "固定header",
+            "fixedSideBar": "固定Sidebar",
+            "mixSidebarTrigger": "ハイブリッドメニュートリガー方式",
+            "triggerHover": "ホバーをトリガー",
+            "triggerClick": "クリック",
+            "mixSidebarFixed": "展開メニューを修正"
+        }
+    },
+    "sys": {
+        "api": {
+            "operationFailed": "失敗",
+            "errorTip": "エラー",
+            "errorMessage": "失敗しました、システム異常です!",
+            "timeoutMessage": "タイムアウトです、もう一度ログインしてください。",
+            "apiTimeoutMessage": "インターフェイスリクエストがタイムアウトしました。ページを更新して、もう一度お試しください。",
+            "apiRequestFailed": "エラーをリクエストして、もう一度お試しください。",
+            "networkException": "ネットワークの異常",
+            "networkExceptionMsg": "ネットワークが異常です。接続を確認してください。",
+            "errMsg401": "ユーザーに権限がありません(トークン、ユーザー名、間違ったパスワード)!",
+            "errMsg403": "ユーザーは許可されていますが、アクセスは禁止されています。!",
+            "errMsg404": "ネットワークリクエストエラー、リソースが見つかりません!",
+            "errMsg405": "ネットワークリクエストエラー、リクエストメソッドは許可されていません!",
+            "errMsg408": "ネットワークリクエストがタイムアウトしました!",
+            "errMsg500": "サーバーエラー、管理者に連絡してください!",
+            "errMsg501": "ネットワークが実装されていません!",
+            "errMsg502": "ネットワークエラー!",
+            "errMsg503": "サービスが利用できません、サーバーが一時的に過負荷またはメンテナンス!",
+            "errMsg504": "ネットワークタイムアウト!",
+            "errMsg505": "httpバージョンはリクエストをサポートしていません!"
+        },
+        "app": {
+            "logoutTip": "確認",
+            "logoutMessage": "アカウントからログアウトします。よろしいでしょうか?",
+            "menuLoading": "ローディング"
+        },
+        "errorLog": {
+            "tableTitle": "エラーログリスト",
+            "tableColumnType": "タイプ",
+            "tableColumnDate": "時間",
+            "tableColumnFile": "資料",
+            "tableColumnMsg": "エラーメッセージ",
+            "tableColumnStackMsg": "stack情報",
+            "tableActionDesc": "詳細",
+            "modalTitle": "エラー詳細",
+            "fireVueError": "クリックしてvueエラーをトリガーします",
+            "fireResourceError": "クリックしてリソースロードエラーをトリガーします",
+            "fireAjaxError": "クリックしてajaxエラーをトリガーします",
+            "enableMessage": "`/ src / settings / projectSetting.ts`でuseErrorHandle = trueの場合にのみ有効になります。"
+        },
+        "exception": {
+            "backLogin": "ログイン画面に戻る",
+            "backHome": "ホームページに戻る",
+            "subTitle403": "申し訳ありませんが、このページにアクセスする権限がありません。",
+            "subTitle404": "申し訳ありませんが、アクセスしたページは存在しません。",
+            "subTitle500": "申し訳ありませんが、サーバーからエラーが報告されました。",
+            "noDataTitle": "現在のページにはデータがありません",
+            "networkErrorTitle": "ネットワークエラー",
+            "networkErrorSubTitle": "申し訳ありませんが、ネットワーク接続がダウンしています。ネットワークを確認してください。"
+        },
+        "lock": {
+            "unlock": "クリックしてロックを解除",
+            "alert": "ロック画面のパスワードが間違っています",
+            "backToLogin": "ログイン画面に戻る",
+            "entry": "システムに入る",
+            "placeholder": "ロック画面のパスワードまたはユーザーパスワードを入力してください"
+        },
+        "login": {
+            "backSignIn": "戻る",
+            "signInFormTitle": "ログイン",
+            "mobileSignInFormTitle": "電話でログイン",
+            "qrSignInFormTitle": "コードをスキャンしてログインする",
+            "signUpFormTitle": "登録",
+            "forgetFormTitle": "パスワードを再設定する",
+            "checkMessge": "ドラッグして検証",
+            "checkSuccess": "検証に成功しました",
+            "signInTitle": "10分で実際のVR空間を作成",
+            "signInDesc": "シンプル、安全、効率的でセルフサービス可能な720度のライブVRを提供",
+            "policy": "xxxプライバシーポリシーに同意します",
+            "scanSign": "コードをスキャンした後、「確認」をクリックしてログインを完了します",
+            "loginButton": "ログイン",
+            "registerButton": "登録",
+            "rememberMe": "ログイン情報を保存する",
+            "forgetPassword": "パスワードを忘れる",
+            "otherSignIn": "その他のログイン方法",
+            "loginSuccessTitle": "ログイン成功",
+            "loginSuccessDesc": "お帰りなさい",
+            "accountPlaceholder": "会社名を入力してください",
+            "passwordPlaceholder": "パスワードを入力して下さい",
+            "smsPlaceholder": "確認コードを入力してください",
+            "mobilePlaceholder": "電話番号を入力してください",
+            "policyPlaceholder": "確認後、ご登録してください",
+            "diffPwd": "パスワードが一致しません",
+            "userName": "企業アカウント",
+            "password": "パスワード",
+            "confirmPassword": "パスワードを再入力",
+            "email": "メールアドレス",
+            "smsCode": "SMS確認コード",
+            "mobile": "携帯番号",
+            "loginDragValidate": "右にスライドさせログイン認証",
+            "loginDragSuccess": "ログイン認証確認",
+            "loginAgain": "もう一度やり直してください",
+            "captcha": "検証コード",
+            "registrationLabel": "新規登録",
+            "corporationName": "企業アカウント",
+            "corporationMail": "企業アカウント",
+            "fillMail": "メールアドレスをご入力してください !",
+            "fillMailCorrect": "正しいメールアドレスをご入力してください!",
+            "emailSMS": "確認コードを入力"
+        }
+    },
+    "routes": {
+        "basic": {
+            "login": "ログイン",
+            "errorLogList": "エラーログリスト"
+        },
+        "config": {
+            "login": "ログイン",
+            "serial": "シリアル番号",
+            "file": "Unity実行可能ファイル",
+            "directory": "Unityエンジニアリングカタログ",
+            "setconfig": "構成情報を変更します",
+            "account": "Unity账户",
+            "password": "Unity密码"
+        },
+        "dashboard": {
+            "dashboard": "Dashboard",
+            "about": "About",
+            "workbench": "Workbench",
+            "analysis": "Analysis",
+            "devices": "Equipment",
+            "equity": "Subscription",
+            "scene": "シーンリスト",
+            "finance": "Sales Statistics",
+            "cameraScene": "Scene",
+            "loglist": "Operation Log",
+            "retailer": "Reseller"
+        },
+        "demo": {
+            "charts": {
+                "baiduMap": "Baidu map",
+                "aMap": "A map",
+                "googleMap": "Google map",
+                "charts": "Chart",
+                "map": "Map",
+                "line": "Line",
+                "pie": "Pie"
+            },
+            "comp": {
+                "comp": "Component",
+                "basic": "Basic",
+                "transition": "Animation",
+                "countTo": "Count To",
+                "scroll": "Scroll",
+                "scrollBasic": "Basic",
+                "scrollAction": "Scroll Function",
+                "virtualScroll": "Virtual Scroll",
+                "tree": "Tree",
+                "treeBasic": "Basic",
+                "editTree": "Searchable/toolbar",
+                "actionTree": "Function operation",
+                "modal": "Modal",
+                "drawer": "Drawer",
+                "desc": "Desc",
+                "lazy": "Lazy",
+                "lazyBasic": "Basic",
+                "lazyTransition": "Animation",
+                "verify": "Verify",
+                "verifyDrag": "Drag ",
+                "verifyRotate": "Picture Restore",
+                "qrcode": "QR code",
+                "strength": "Password strength",
+                "upload": "Upload",
+                "loading": "Loading",
+                "time": "Relative Time",
+                "cropperImage": "Cropper Image",
+                "cardList": "Card List"
+            },
+            "editor": {
+                "editor": "Editor",
+                "jsonEditor": "Json editor",
+                "markdown": "Markdown editor",
+                "tinymce": "Rich text",
+                "tinymceBasic": "Basic",
+                "tinymceForm": "embedded form"
+            },
+            "excel": {
+                "excel": "Excel",
+                "customExport": "Select export format",
+                "jsonExport": "JSON data export",
+                "arrayExport": "Array data export",
+                "importExcel": "Import"
+            },
+            "feat": {
+                "feat": "Page Function",
+                "icon": "Icon",
+                "tabs": "Tabs",
+                "tabDetail": "Tab Detail",
+                "sessionTimeout": "Session Timeout",
+                "print": "Print",
+                "contextMenu": "Context Menu",
+                "download": "Download",
+                "clickOutSide": "ClickOutSide",
+                "imgPreview": "Picture Preview",
+                "copy": "Clipboard",
+                "msg": "Message prompt",
+                "watermark": "Watermark",
+                "ripple": "Ripple",
+                "fullScreen": "Full Screen",
+                "errorLog": "Error Log",
+                "tab": "Tab with parameters",
+                "tab1": "Tab with parameter 1",
+                "tab2": "Tab with parameter 2",
+                "menu": "Menu with parameters",
+                "menu1": "Menu with parameters 1",
+                "menu2": "Menu with parameters 2",
+                "ws": "Websocket test",
+                "breadcrumb": "Breadcrumbs",
+                "breadcrumbFlat": "Flat Mode",
+                "breadcrumbFlatDetail": "Flat mode details",
+                "breadcrumbChildren": "Level mode",
+                "breadcrumbChildrenDetail": "Level mode detail"
+            },
+            "flow": {
+                "name": "Graphics editor",
+                "flowChart": "FlowChart"
+            },
+            "form": {
+                "form": "Form",
+                "basic": "Basic",
+                "useForm": "useForm",
+                "refForm": "RefForm",
+                "advancedForm": "Shrinkable",
+                "ruleForm": "Form validation",
+                "dynamicForm": "Dynamic",
+                "customerForm": "Custom",
+                "appendForm": "Append"
+            },
+            "iframe": {
+                "frame": "External",
+                "antv": "antVue doc (embedded)",
+                "doc": "Project doc (embedded)",
+                "docExternal": "Project doc (external)"
+            },
+            "level": {
+                "level": "MultiMenu"
+            },
+            "page": {
+                "page": "Page",
+                "form": "Form",
+                "formBasic": "Basic Form",
+                "formStep": "Step Form",
+                "formHigh": "Advanced Form",
+                "desc": "Details",
+                "descBasic": "Basic Details",
+                "descHigh": "Advanced Details",
+                "result": "Result",
+                "resultSuccess": "Success",
+                "resultFail": "Failed",
+                "account": "Personal",
+                "accountCenter": "Personal Center",
+                "accountSetting": "Personal Settings",
+                "exception": "Exception",
+                "netWorkError": "Network Error",
+                "notData": "No data",
+                "list": "List page",
+                "listCard": "Card list",
+                "basic": "Basic list",
+                "listBasic": "Basic list",
+                "listSearch": "Search list"
+            },
+            "permission": {
+                "permission": "Permission",
+                "front": "front-end",
+                "frontPage": "Page",
+                "frontBtn": "Button",
+                "frontTestA": "Test page A",
+                "frontTestB": "Test page B",
+                "back": "background",
+                "backPage": "Page",
+                "backBtn": "Button"
+            },
+            "setup": {
+                "page": "Intro page"
+            },
+            "system": {
+                "moduleName": "System management",
+                "account": "Account management",
+                "account_detail": "Account detail",
+                "password": "Change password",
+                "dept": "Department management",
+                "menu": "Menu management",
+                "role": "Role management"
+            },
+            "table": {
+                "table": "Table",
+                "basic": "Basic",
+                "treeTable": "Tree",
+                "fetchTable": "Remote loading",
+                "fixedColumn": "Fixed column",
+                "customerCell": "Custom column",
+                "formTable": "Open search",
+                "useTable": "UseTable",
+                "refTable": "RefTable",
+                "multipleHeader": "MultiLevel header",
+                "mergeHeader": "Merge cells",
+                "expandTable": "Expandable table",
+                "fixedHeight": "Fixed height",
+                "footerTable": "Footer",
+                "editCellTable": "Editable cell",
+                "editRowTable": "Editable row",
+                "authColumn": "Auth column"
+            }
+        },
+        "device": {
+            "snCode": "S/N",
+            "wifiName": "Wifi",
+            "deviceType": "Camera type",
+            "activatedTime": "Time",
+            "userName": "Bound account",
+            "NoBind": "Unbind",
+            "type": {
+                "0": "4DKanKan Lite",
+                "1": "4DKanKan",
+                "2": "4DMinion",
+                "3": "4DMega",
+                "9": "4DMinion",
+                "10": "4DMega",
+                "11": "4DMeta"
+            },
+            "status": {
+                "0": "Active",
+                "1": "Expired",
+                "2": "Bind",
+                "3": "Unbind"
+            },
+            "bindStatus": "Binding status",
+            "statusName": "Status",
+            "subAgentName": "Reseller"
+        },
+        "finance": {
+            "deptName": "Affiliated company",
+            "userName": "Full name",
+            "nickName": "Employee nickname",
+            "setpaswd": "Change Password",
+            "mobile": "Mobile phone",
+            "permList": "Equity",
+            "userId": "Account number",
+            "createTime": "Authorization Time",
+            "updateTime": "Modification Time",
+            "staffList": "Account List",
+            "updateBtn": "Change Password",
+            "password": "Change Password",
+            "agentName": "Authorizer",
+            "equityType": {
+                "0": "Premium (Yearly)",
+                "1": "Senior (Monthly)",
+                "2": "Scene Download"
+            },
+            "giveType": {
+                "0": "Dealer Authorization",
+                "1": "Dealer Renewals",
+                "2": "Official Website Purchase",
+                "3": "Platform Authorization"
+            },
+            "totalTime": "Total duration of the authorization (year/month)"
+        },
+        "retailer": {
+            "name": "Reseller",
+            "add": "Add New Reseller",
+            "editfxs": "Edit Reseller",
+            "setName": "Membership Settings",
+            "nickName": "Contact",
+            "userName": "Please enter your 4DKanKan account",
+            "userId": "Account",
+            "tips": "This account does not exist",
+            "jxs": "Distributor",
+            "fxs": "Reseller",
+            "majorAddNum": "Premium Membership (Annual):  {value} years available for sale, newly added:",
+            "highAddNum": "Senior Membership (Monthly):  {value} months available for sale,  newly added:",
+            "downAddNum": "Project Downloads (Times):  {value} times available for sale, newly added:",
+            "ff": "Distribute",
+            "Unbind": "Unbind",
+            "UnbindTips": "Are you sure you want to unbind it?",
+            "allff": "Device Bulk Distribution",
+            "majorTotalNum": "Remaining Years of Premium Membership",
+            "highTotalNum": "Remaining Months of Senior Membership",
+            "downTotalNum": "Remaining Project Downloads",
+            "createName": "Creator",
+            "createTime": "作成時間",
+            "addjxs": "Add Dealer",
+            "editjxs": "Edit Dealer",
+            "form": {
+                "name": " Reseller Name",
+                "nickName": "Contact",
+                "userName": "Please enter your 4DKanKan account",
+                "userId": "Account",
+                "tips": "This account does not exist",
+                "enable": "Enable",
+                "stopUsing": "Deactivate",
+                "dqname": "Reseller",
+                "d1name": "Distributor Name"
+            },
+            "exportText": "Successfully imported {value} pieces of data",
+            "device": {
+                "title": "Device Bulk Distribution",
+                "list": "Equipment List",
+                "dowmTips": "Download Distributor Device List Template",
+                "filename": "Reseller Device List Template"
+            }
+        },
+        "scene": {
+            "tableType": {
+                "0": "4DKanKan",
+                "1": "4DMinion",
+                "2": "4DMega Point Cloud",
+                "3": "4DKanKan Lite",
+                "5": "4DMega Mesh",
+                "6": "4DMeta Point Cloud",
+                "7": "4DMeta Mesh"
+            },
+            "migrate": "移動",
+            "sceneName": "物件名",
+            "webSite": "物件リンク",
+            "childName": "カメラSN",
+            "viewCount": "アクセス数",
+            "createTime": "アップデート時間",
+            "num": "コード",
+            "process": "ダウンロード",
+            "jointVisit": "開く",
+            "creatobj": "obj生成",
+            "upgrade": "アップグレード",
+            "sceneList": "シーンリスト",
+            "bindAnchor": "アンカーをバインドする",
+            "anchorRoom": "ライブルーム名",
+            "appListPicUrl": "サムネイル",
+            "sortOrder": "順番",
+            "bindShowerNameList": "アンカーにバインドされました",
+            "livestreamStatus": "放送を始めますか?",
+            "liveBroadcast": "ライブリスト",
+            "downloadScene": "ダウンロード",
+            "downloadSceneConfirm": "ダウンロードしますか?",
+            "editor": "編集",
+            "cancelDownload": "ダウンロードをキャンセル",
+            "own": "アンカーの選択",
+            "userName": "従業員名:",
+            "title": "名前です",
+            "canShow": "一緒に訪れるために同時に開くかどうか",
+            "bindTime": "バインディング時間",
+            "anchorList": "アンカーリスト",
+            "addLive": "シーンを追加",
+            "liveType": "ライブルームタイプ",
+            "liveName": "ライブルーム名",
+            "makeLiveCover": "ライブルームカバーを生成",
+            "sceneUrl": "シーンのリンク",
+            "delete": "削除",
+            "4dkk": "4DKK_Pro",
+            "4dkj": "4DKK_Minion",
+            "4dssdy": "4DKK_Mega",
+            "obj": "4DKK_Mega Obj",
+            "upgradeMessg.title": "バージョン4.0にアップグレードしてよろしいですか?",
+            "upgradeMessg.text": "シーンがアップグレードされると、一部のデータは保持できなくなります。ホットスポット、自動ナビゲーション、戸型図、広告ビデオ。新しいバージョンはしばらく帯域ビューをサポートしていません。*シーンのアップグレードに成功すると旧版に戻すことができないので、確認してから操作してください。",
+            "copy": "コピー",
+            "copyInfi.title": "コピー",
+            "copyInfi.content": "シーンをコピーしますか?\n※編集内容や設定は、そのままコピーされます。",
+            "copyInfi.ok": "コピー成功",
+            "objTips.coverData": "Meshのシーンを再生成することで、既存のMeshシーンが上書きされ、編集内容がリセットされます。計算処理中は、Meshのシーンを開くことができませんが、再生成しますか?",
+            "objTips.Modifying": "Meshのシーンの計算中です、しばらくお待ちください。",
+            "objTips.updateSuccess": "objの生成には時間かかりますので、しばらくお待ちください。",
+            "assistant": "インバイト",
+            "unAssistant": "インバイトを終了",
+            "unAssistantConfirm": "インバイトを終了しますか?",
+            "addAssistant": "インバイトを追加",
+            "shootUserName": "アカウント",
+            "migrateAccount": "アカウント",
+            "migrateDevice": "カメラ",
+            "selectCameraMFirst": "企業アカウントを入力してください。",
+            "rsMPlaceHolder": "カメラSNを選択してください。",
+            "4dsgobj": "4DKK_Meta Obj",
+            "4dsg": "4DKK_Meta",
+            "migrateAccount.required": "企業アカウントを入力してください。",
+            "migrateDevice.required": "カメラSNを選択してください。",
+            "transfer": "移行",
+            "down": "ダウンロード",
+            "canlenDown": "ダウンロードをキャンセル",
+            "amount": "計算完了時間",
+            "snCode": "SNコード",
+            "sceneSize": "シーン サイズ",
+            "copyTime": "コピー時間",
+            "isCopy": "コピーするかどうか",
+            "status": "ステータス",
+            "statusType": {
+                "0": "同期中です",
+                "1": "同期に成功しました",
+                "-2": "計算が成功しました",
+                "-1": "失敗しました",
+                "-3": "封印です"
+            },
+            "copyTipsTitle": "シーンをコピー",
+            "copyTipsText": "シーンをコピーすると、シーンは元のカメラに属します。 <br/>シーンをコピーしてもよろしいですか? ",
+            "copySccuse": "コピー成功",
+            "deleteSccuse": "正常に削除されました",
+            "downErr": "ダウンロードに失敗しました",
+            "transferSccuse": "シーンの移行が成功しました。 ",
+            "syncSccuse": "シーンの同期が成功しました。 ",
+            "transferTitle": "移行シナリオ",
+            "toSnCode": "移行先",
+            "reset": "再計算",
+            "resetTips": "再計算しますか? ",
+            "rules": {
+                "snCode": "カメラのSNコードを入力してください",
+                "snCode1": "中国語の文字はサポートされていません"
+            }
+        },
+        "system": {
+            "roleBut": "権限",
+            "userName": "ユーザー名",
+            "config": "Untiy構成",
+            "accountList": "アカウントリスト",
+            "addHost": "新しいホストを追加します",
+            "edit": "ユーザープロファイルを編集します",
+            "delText": "このアカウントを削除します",
+            "departmentList": "部門リスト",
+            "departmentName": "部門名",
+            "addDepartment": "新しい部署",
+            "editDepartment": "部門の編集",
+            "addUser": "新しいアカウントを追加します",
+            "editUser": "アカウントを編集します",
+            "parentDept": "上級部署",
+            "infoData": {
+                "title": "ユーザー{userId}の資料",
+                "content": "これはユーザプロファイルの詳細ページです。このページは、タブ内の同じルートで複数のページを開き、異なるデータを表示する場合にのみ使用します。"
+            },
+            "disable": "アカウントを無効にします",
+            "set": "パスワードを変更します",
+            "userProfile": "ユーザープロファイル",
+            "log": "アクションログ",
+            "userinfo": "これはユーザー{userId}の資料Tabです",
+            "userlog": "これはユーザ{userId}の操作ログTabです",
+            "setTitle": "詳細: ユーザー",
+            "enable": "有効にします",
+            "stopUsing": "無効にします",
+            "description": "役割の説明",
+            "remarks": "コメント",
+            "newMenu": "メニューを追加します",
+            "editMenu": "メニューを編集します",
+            "menuList": "メニューリスト",
+            "menuType": "メニューの種類",
+            "menuName": "メニュー名",
+            "menuName1": "メニュー名を入力してください",
+            "menuName2": "正しいメニュー名を入力してください",
+            "menuPath": "メニューパス",
+            "routerPath": "メニューパス",
+            "menuUrl": "外部リンクアドレス",
+            "menuParentName": "親メニュー",
+            "component": "コンポーネントパス",
+            "icon": "アイコン",
+            "perms": "権限ID",
+            "passwordOld": "現在のパスワード",
+            "passwordNew": "新しいパスワード",
+            "passwordNew1": "新しいパスワードを入力してください",
+            "setpassword": "パスワードを設定します",
+            "confirmPassword": "パスワードを確認します",
+            "confirmPassword1": "空にすることはできません",
+            "confirmPassword2": "入力されたパスワードが一致しません。",
+            "userList": {
+                "id": "ユーザーIDです。",
+                "companyName": "所属会社",
+                "userName": "ユーザー名",
+                "nickName": "アカウント",
+                "createTime": "作成時間"
+            },
+            "isExt": {
+                "0": "いいえ",
+                "1": "はい",
+                "title": "外接リンクかどうか",
+                "url": ""
+            },
+            "type": {
+                "0": "目次",
+                "1": "メニュー",
+                "2": "ボタン",
+                "3": "ボタン",
+                "title": "タイプ"
+            },
+            "roleTitle": "ロールリスト",
+            "isPlatformRole": "有効にするかどうか",
+            "sortOrder": "ソート",
+            "status": "ステータス",
+            "isShow": "表示するかどうか",
+            "buttonMenuWaring": "上级菜单只能为菜单类型"
+        }
+    }
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1013 - 0
src/locales/lang/json/zh.json


+ 1 - 0
src/locales/lang/zh-CN/common.ts

@@ -15,6 +15,7 @@ export default {
   chooseText: '请选择',
   edit: '编辑',
   redo: '刷新',
+  see: '查看',
   back: '返回',
   checkTips: '验证提示',
   light: '亮色主题',

+ 0 - 50
src/locales/lang/zh-CN/routes/dashboard.ts

@@ -3,56 +3,6 @@ export default {
   about: '关于',
   workbench: '工作台',
   analysis: '分析页',
-  corporation: '企业管理',
-  operate: '官网运营管理',
-  system: '系统管理',
-  systemUser: '账号管理',
-  operateNews: '新闻管理',
-  operateRecruit: '招聘管理',
-  operateMessage: '留言管理',
-  invoice: '发票管理',
-  orderCamera: '相机订单',
-  orderList: '订单管理',
-  orderEquity: '权益订单',
-  orderDownload: '下载订单',
-  corporationAccount: '企业账号',
-  corporationVerify: '企业认证',
-  bulletin: '信息发布',
-  bulletinRentInfo: '出租信息',
-  bulletinSellInfo: '出售信息',
-  bulletinDecoration: '工地装修',
-  advertisement: '广告位',
-  advertisementList: '轮播图',
-  advertisementPads: '推荐位',
-  scenes: 'VR场景管理',
-  scenesDownload: '场景下载',
-  scenesList: '场景列表',
-  scenesLive: '直播',
-  scenesRoom: '房间管理',
-  product: '产品管理',
-  firmware: '固件管理',
-  account: '用户管理',
-  overview: '用户概览',
-  details: '订单详情',
-  productData: '产品数据',
-  sdk: 'Space Target SDK',
-  app: 'App管理',
-  productRef: '商品属性',
-  productList: '商品列表',
-  productCategory: '商品分类',
-  order: '订单管理',
-  cameraList: '相机订单列表',
-  downloadList: '下载订单列表',
-  equityList: '权益订单列表',
-  orderDetail: '订单详情',
-  member: '会员管理',
-  memberList: '会员列表',
-  staff: '员工管理',
-  staffList: '员工列表',
-  staffClean: '清除状态',
-  feedback: '反馈管理',
-  feedbackList: '反馈列表',
-  productOperation: '产品运营管理',
   cameraScene: '场景管理',
   kankanScene: '四维看看',
   MinionScene: '四维看见',

+ 140 - 147
src/locales/lang/zh-CN/routes/demo.ts

@@ -1,190 +1,183 @@
 export default {
   charts: {
-    baiduMap: '百度地图',
-    aMap: '高德地图',
-    googleMap: '谷歌地图',
-    charts: '图表',
-    map: '地图',
-    line: '折线图',
-    pie: '饼图',
+    baiduMap: 'Baidu Map',
+    aMap: 'Amap',
+    googleMap: 'Google Map',
+    charts: 'Chart',
+    map: 'Map',
+    line: 'Line Chart',
+    pie: 'Pie Chart',
   },
   comp: {
-    comp: '组件',
-    basic: '基础组件',
-    transition: '动画组件',
-    countTo: '数字动画',
-
-    scroll: '滚动组件',
-    scrollBasic: '基础滚动',
-    scrollAction: '滚动函数',
-    virtualScroll: '虚拟滚动',
-
+    comp: 'Component',
+    basic: 'Basic Component',
+    transition: 'Animation Component',
+    countTo: 'Digital Animation',
+    scroll: 'Scroll Component',
+    scrollBasic: 'Basic Scroll',
+    scrollAction: 'Scroll Function',
+    virtualScroll: 'Virtual Scroll',
     tree: 'Tree',
-    treeBasic: '基础树',
-    editTree: '可搜索/工具栏',
-    actionTree: '函数操作示例',
-
-    modal: '弹窗扩展',
-    drawer: '抽屉扩展',
-    desc: '详情组件',
+    treeBasic: 'Basic Tree',
+    editTree: 'Searchable/Toolbar',
+    actionTree: 'Function Operation Example',
+    modal: 'Popup Extension',
+    drawer: 'Drawer Extension',
+    desc: 'Details component',
 
-    lazy: '懒加载组件',
-    lazyBasic: '基础示例',
-    lazyTransition: '动画效果',
+    lazy: 'Lazy loading component',
+    lazyBasic: 'Basic example',
+    lazyTransition: 'Animation effect',
 
-    verify: '验证组件',
-    verifyDrag: '拖拽校验',
-    verifyRotate: '图片还原',
+    verify: 'Verification component',
+    verifyDrag: 'Drag verification',
+    verifyRotate: 'Image restoration',
 
-    qrcode: '二维码组件',
-    strength: '密码强度组件',
-    upload: '上传组件',
+    qrcode: 'QR code component',
+    strength: 'Password strength component',
+    upload: 'Upload component',
 
     loading: 'Loading',
 
-    time: '相对时间',
-    cropperImage: '图片裁剪',
-    cardList: '卡片列表',
+    time: 'Relative time',
+    cropperImage: 'Image cropping',
+    cardList: 'Card list',
   },
   editor: {
-    editor: '编辑器',
-    jsonEditor: 'Json编辑器',
-    markdown: 'markdown编辑器',
+    editor: 'Editor',
+    jsonEditor: 'Json editor',
+    markdown: 'markdown editor',
 
-    tinymce: '富文本',
-    tinymceBasic: '基础使用',
-    tinymceForm: '嵌入form',
+    tinymce: 'Rich text',
+    tinymceBasic: 'Basic use',
+    tinymceForm: 'Embedded form',
   },
   excel: {
     excel: 'Excel',
-    customExport: '选择导出格式',
-    jsonExport: 'JSON数据导出',
-    arrayExport: 'Array数据导出',
-    importExcel: '导入',
+    customExport: 'Select export format',
+    jsonExport: 'JSON data export',
+    arrayExport: 'Array data export',
+    importExcel: 'Import',
   },
   feat: {
-    feat: '功能',
-    icon: '图标',
-    sessionTimeout: '登录过期',
-    tabs: '标签页操作',
-    tabDetail: '标签详情页',
-    print: '打印',
-    contextMenu: '右键菜单',
-    download: '文件下载',
-    clickOutSide: 'ClickOutSide组件',
-    imgPreview: '图片预览',
-    copy: '剪切板',
-    msg: '消息提示',
-    watermark: '水印',
-    ripple: '水波纹',
-    fullScreen: '全屏',
-    errorLog: '错误日志',
-    tab: 'Tab带参',
-    tab1: 'Tab带参1',
-    tab2: 'Tab带参2',
-    menu: 'Menu带参',
-    menu1: 'Menu带参1',
-    menu2: 'Menu带参2',
-    ws: 'websocket测试',
-    breadcrumb: '面包屑导航',
-    breadcrumbFlat: '平级模式',
-    breadcrumbFlatDetail: '平级详情',
-    breadcrumbChildren: '层级模式',
-    breadcrumbChildrenDetail: '层级详情',
+    feat: 'Function',
+    icon: 'Icon',
+    sessionTimeout: 'Login expired',
+    tabs: 'Tab operation',
+    tabDetail: 'Tab details page',
+    print: 'Print',
+    contextMenu: 'Right-click menu',
+    download: 'File download',
+    clickOutSide: 'ClickOutSide component',
+    imgPreview: 'Image preview',
+    copy: 'Clipboard',
+    msg: 'Message prompt',
+    watermark: 'Watermark',
+    ripple: 'Water ripple',
+    fullScreen: 'Full screen',
+    errorLog: 'Error log',
+    tab: 'Tab with parameters',
+    tab1: 'Tab with parameter 1',
+    tab2: 'Tab with parameter 2',
+    menu: 'Menu with parameter',
+    menu1: 'Menu with parameter 1',
+    menu2: 'Menu with parameter 2',
+    ws: 'websocket test',
+    breadcrumb: 'Breadcrumb navigation',
+    breadcrumbFlat: 'Flat mode',
+    breadcrumbFlatDetail: 'Flat details',
+    breadcrumbChildren: 'Hierarchical mode',
+    breadcrumbChildrenDetail: 'Hierarchical details',
   },
   flow: {
-    name: '图形编辑器',
-    flowChart: '流程图',
+    name: 'Graphic editor',
+    flowChart: 'Flowchart',
   },
   form: {
     form: 'Form',
-    basic: '基础表单',
+    basic: 'Basic form',
     useForm: 'useForm',
     refForm: 'RefForm',
-    advancedForm: '可收缩表单',
-    ruleForm: '表单验证',
-    dynamicForm: '动态表单',
-    customerForm: '自定义组件',
-    appendForm: '表单增删示例',
+    advancedForm: 'Shrinkable form',
+    ruleForm: 'Form validation',
+    dynamicForm: 'Dynamic form',
+    customerForm: 'Custom component',
+    appendForm: 'Form addition and deletion example',
   },
   iframe: {
-    frame: '外部页面',
-    antv: 'antVue文档(内嵌)',
-    doc: '项目文档(内嵌)',
-    docExternal: '项目文档(外链)',
+    frame: 'External page',
+    antv: 'antVue document (embedded)',
+    doc: 'Project document (embedded)',
+    docExternal: 'Project document (external link)',
   },
-  level: { level: '多级菜单' },
+  level: { level: 'Multi-level menu' },
   page: {
-    page: '页面',
-
-    form: '表单页',
-    formBasic: '基础表单',
-    formStep: '分步表单',
-    formHigh: '高级表单',
-
-    desc: '详情页',
-    descBasic: '基础详情页',
-    descHigh: '高级详情页',
-
-    result: '结果页',
-    resultSuccess: '成功页',
-    resultFail: '失败页',
-
-    account: '个人页',
-    accountCenter: '个人中心',
-    accountSetting: '个人设置',
-
-    exception: '异常页',
-    netWorkError: '网络错误',
-    notData: '无数据',
-
-    list: '列表页',
-    listCard: '卡片列表',
-    listBasic: '标准列表',
-    listSearch: '搜索列表',
+    page: 'Page',
+
+    form: 'Form page',
+    formBasic: 'Basic form',
+    formStep: 'Step-by-step form',
+    formHigh: 'Advanced form',
+
+    desc: 'Details page',
+    descBasic: 'Basic details page',
+    descHigh: 'Advanced details page',
+
+    result: 'Result page',
+    resultSuccess: 'Success page',
+    resultFail: 'Failure page',
+
+    account: 'Personal page',
+    accountCenter: 'Personal center',
+    accountSetting: 'Personal settings',
+    exception: 'Exception page',
+    netWorkError: 'Network error',
+    notData: 'No data',
+    list: 'List page',
+    listCard: 'Card list',
+    listBasic: 'Standard list',
+    listSearch: 'Search list',
   },
   permission: {
-    permission: '权限管理',
-
-    front: '基于前端权限',
-    frontPage: '页面权限',
-    frontBtn: '按钮权限',
-    frontTestA: '权限测试页A',
-    frontTestB: '权限测试页B',
-
-    back: '基于后台权限',
-    backPage: '页面权限',
-    backBtn: '按钮权限',
+    permission: 'Permission management',
+    front: 'Based on front-end permissions',
+    frontPage: 'Page permissions',
+    frontBtn: 'Button permissions',
+    frontTestA: 'Permission test page A',
+    frontTestB: 'Permission test page B',
+    back: 'Based on background permissions',
+    backPage: 'Page permissions',
+    backBtn: 'Button permissions',
   },
   setup: {
-    page: '引导页',
+    page: 'Boot page',
   },
   system: {
-    moduleName: '系统管理',
-    account: '账号管理',
-    account_detail: '账号详情',
-    password: '修改密码',
-    dept: '部门管理',
-    menu: '菜单管理',
-    role: '角色管理',
+    moduleName: 'System management',
+    account: 'Account management',
+    account_detail: 'Account details',
+    password: 'Change password',
+    dept: 'Department management',
+    menu: 'Menu management',
+    role: 'Role management',
   },
   table: {
     table: 'Table',
-    basic: '基础表格',
-    treeTable: '树形表格',
-    fetchTable: '远程加载示例',
-    fixedColumn: '固定列',
-    customerCell: '自定义列',
-    formTable: '开启搜索区域',
+    basic: 'Basic table',
+    treeTable: 'Tree table',
+    fetchTable: 'Remote loading example',
+    fixedColumn: 'Fixed column',
+    customerCell: 'Custom column',
+    formTable: 'Open search area',
     useTable: 'UseTable',
     refTable: 'RefTable',
-    multipleHeader: '多级表头',
-    mergeHeader: '合并单元格',
-    expandTable: '可展开表格',
-    fixedHeight: '定高/头部自定义',
-    footerTable: '表尾行合计',
-    editCellTable: '可编辑单元格',
-    editRowTable: '可编辑行',
-    authColumn: '权限列',
+    multipleHeader: 'Multi-level header',
+    mergeHeader: 'Merge cells',
+    expandTable: 'Expandable table',
+    fixedHeight: 'Fixed height/header customization',
+    footerTable: 'Total of footer rows',
+    editCellTable: 'Editable cells',
+    editRowTable: 'Editable rows',
+    authColumn: 'Authorization column',
   },
 };

+ 20 - 20
src/locales/lang/zh-CN/routes/device.ts

@@ -1,26 +1,26 @@
 export default {
-  snCode: 'SN',
-  wifiName: 'wifi名称',
-  deviceType: '设备类型',
-  activatedTime: '出库时间',
-  userName: '绑定账号',
-  NoBind: '未绑定',
+  snCode: 'SN code',
+  wifiName: 'wifi name',
+  deviceType: 'device type',
+  activatedTime: 'delivery time',
+  userName: 'bind account',
+  NoBind: 'unbound',
   type: {
-    0: '旧双目相机',
-    1: '四维看看',
-    2: '四维看见',
-    3: '四维深时',
-    9: '四维看见',
-    10: '四维深时',
-    11: '四维深光',
+    0: 'old binocular camera',
+    1: '4D look',
+    2: '4D see',
+    3: '4D deep time',
+    9: '4D see',
+    10: '4D deep time',
+    11: '4D deep light',
   },
   status: {
-    0: '生效中',
-    1: '已过期',
-    2: '已绑定',
-    3: '未绑定',
+    0: 'in effect',
+    1: 'expired',
+    2: 'bound',
+    3: 'unbound',
   },
-  bindStatus: '绑定状态',
-  statusName: '权益状态',
-  subAgentName: '分销商',
+  bindStatus: 'binding status',
+  statusName: 'rights status',
+  subAgentName: 'distributor',
 };

+ 0 - 76
src/locales/lang/zh-CN/routes/equity.ts

@@ -1,76 +0,0 @@
-export default {
-  add:'新增授权',
-  addDowm:'新增下载',
-  renew:'续费',
-  userName:'用户账号',
-  count:'用户账号',
-  orderSn:'订单号',
-  payTime:'支付时间',
-  invoiceTime:'开票申请时间',
-  money:'开票金额',
-  id:'权益ID',
-  dowmCount:'下载次数',
-  timeList:'授权时间',
-  expiryTime: '到期日期', 
-  newTime:'最新授权时间',
-  time:'开始日期',
-  countNumber:'数量',
-  Type:'权益类型',
-  giveType:'授权方式',
-  nickName:'昵称',
-  userName1:'账号',
-  email:'邮箱',
-  userCount:'授权数量',
-  incrementType:{
-    0:'会员权益',
-    1:'场景下载',
-  },
-  equityType:{
-    0:'专业会员(年)',
-    1:'专业会员(年)',
-    2:'专业会员(年)',
-    3:'高级会员(月)',
-  },
-  zhTips:'不支持中文字符',
-  listTitle:'销售统计列表',
-  exportExcel:'导出excel',
-  excelTitle:'确定导出excel?',
-  CardMajorNum: '上月销售专业会员(年)',
-  CardHighNum: '上月销售高级会员(月)',
-  CardDownNum: '上月销售场景下载',
-  syks:'剩余可售',
-  addcount:'新增次数',
-  rules:{
-    userName:'请输入用户账号',
-    userName1:'请输入正确的用户账号',
-    userName2:'该账号不存在',
-    id: '请输入正确的权益ID',
-},
-  unit:{
-    1:'个',
-    2:'次',
-    '-1':'年',
-    '-2':'月',
-    '-3':'个月',
-  },
-  titleHelpMessage:{
-    1:'统计规则:',
-    2:'1、会员权益:统计当前经销商新授权的记录、以及相关权益ID续费记录,包括经销商授权和续费、平台授权(续费)、官网自购(续费);',
-    3:'2、场景下载:统计当前经销售新授权(除相关用户)的下载次数;',
-  },
-  totalTime:'期限',
-  totalMessge:'剩余可售权益不足',
-  operationType:'操作类型',
-  operationUserName:'操作用户',
-  operationTime:'操作时间',
-  incrementId:'权益ID',
-  platform: '平台',
-  operation:{
-    0:'授权权益',
-    1:'解除权益',
-    2:'绑定相机',
-    3:'解绑相机',
-  },
-  jjxs:'即将销售',
-}
-

+ 2 - 0
src/locales/lang/zh-CN/routes/scene.ts

@@ -45,4 +45,6 @@ export default {
     snCode: '请输入相机SN码',
     snCode1: '不支持中文字符',
   },
+  title: '标题',
+  sceneAsync: '同步场景',
 };

+ 3 - 1
src/locales/lang/zh_CN.ts

@@ -1,12 +1,14 @@
 import { genMessage } from '../helper';
 import antdLocale from 'ant-design-vue/es/locale/zh_CN';
 import momentLocale from 'moment/dist/locale/zh-cn';
+import zh from './json/zh.json';
 
 const modules = import.meta.globEager('./zh-CN/**/*.ts');
-console.log('modules',modules)
+console.log('moduleszh-CN', genMessage(modules, 'zh-CN'));
 export default {
   message: {
     ...genMessage(modules, 'zh-CN'),
+    // ...zh,
     antdLocale,
   },
   momentLocale,

+ 4 - 0
src/settings/localeSetting.ts

@@ -24,6 +24,10 @@ export const localeList: DropMenu[] = [
     event: LOCALE.ZH_CN,
   },
   {
+    text: 'English',
+    event: LOCALE.EN_US,
+  },
+  {
     text: '日本語',
     event: LOCALE.JA,
   },

+ 3 - 3
src/views/config/index.vue

@@ -8,7 +8,7 @@
         <TableAction
           :actions="[
             {
-              label: '修改',
+              label: t('common.edit'),
               onClick: handleOpenModal.bind(null, record),
             },
           ]"
@@ -70,12 +70,12 @@
           width: 150,
         },
         {
-          title: '操作',
+          title: t('common.operation'),
           dataIndex: '',
           // ifShow: !getCheckRole('tourist'),
           slots: { customRender: 'action' },
           align: 'center',
-          width: 30,
+          width: 40,
         },
       ];
 

+ 0 - 44
src/views/dashboard/analysis/components/GrowCard.vue

@@ -1,44 +0,0 @@
-<template>
-  <div class="md:flex">
-    <template v-for="(item, index) in list" :key="item.title">
-      <Card
-        size="small"
-        :loading="loading"
-        :title="item.title"
-        class="md:w-1/4 w-full !md:mt-0 !mt-4"
-        :class="[index + 1 < 6 && '!md:mr-4']"
-        :canExpan="false"
-      >
-        <template #extra>
-          <Tag :color="item.color">{{ item.action }}</Tag>
-        </template>
-
-        <div class="py-4 px-4 flex justify-between">
-          <CountTo :prefix="item.unit" :startVal="1" :endVal="item.value" class="text-2xl" />
-          <!-- <Icon :icon="item.icon" :size="40" /> -->
-        </div>
-
-        <!-- <div class="p-2 px-4 flex justify-between">
-          <span>总{{ item.title }}</span>
-          <CountTo prefix="$" :startVal="1" :endVal="item.total" />
-        </div> -->
-      </Card>
-    </template>
-  </div>
-</template>
-<script lang="ts" setup>
-  import { CountTo } from '/@/components/CountTo/index';
-  import { Icon } from '/@/components/Icon';
-  import { Tag, Card } from 'ant-design-vue';
-  import { growCardList, GrowCardItem } from '../data';
-
-  defineProps({
-    loading: {
-      type: Boolean,
-    },
-    list: {
-      type: Array as PropType<Array<GrowCardItem>>,
-      default: [],
-    },
-  });
-</script>

+ 0 - 63
src/views/dashboard/analysis/components/SalesProductPie.vue

@@ -1,63 +0,0 @@
-<template>
-  <Card title="成交占比" :loading="loading">
-    <div ref="chartRef" :style="{ width, height }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-
-  const props = defineProps({
-    loading: Boolean,
-    width: {
-      type: String as PropType<string>,
-      default: '100%',
-    },
-    height: {
-      type: String as PropType<string>,
-      default: '300px',
-    },
-  });
-
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  watch(
-    () => props.loading,
-    () => {
-      if (props.loading) {
-        return;
-      }
-      setOptions({
-        tooltip: {
-          trigger: 'item',
-        },
-
-        series: [
-          {
-            name: '访问来源',
-            type: 'pie',
-            radius: '80%',
-            center: ['50%', '50%'],
-            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],
-            data: [
-              { value: 500, name: '电子产品' },
-              { value: 310, name: '服装' },
-              { value: 274, name: '化妆品' },
-              { value: 400, name: '家居' },
-            ].sort(function (a, b) {
-              return a.value - b.value;
-            }),
-            roseType: 'radius',
-            animationType: 'scale',
-            animationEasing: 'exponentialInOut',
-            animationDelay: function () {
-              return Math.random() * 400;
-            },
-          },
-        ],
-      });
-    },
-    { immediate: true },
-  );
-</script>

+ 0 - 38
src/views/dashboard/analysis/components/SiteAnalysis.vue

@@ -1,38 +0,0 @@
-<template>
-  <Card
-    :tab-list="tabListTitle"
-    v-bind="$attrs"
-    :active-tab-key="activeKey"
-    @tabChange="onTabChange"
-  >
-    <p v-if="activeKey === 'tab1'">
-      <VisitAnalysis />
-    </p>
-    <p v-if="activeKey === 'tab2'">
-      <VisitAnalysisBar />
-    </p>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { ref } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import VisitAnalysis from './VisitAnalysis.vue';
-  import VisitAnalysisBar from './VisitAnalysisBar.vue';
-
-  const activeKey = ref('tab1');
-
-  const tabListTitle = [
-    {
-      key: 'tab1',
-      tab: '流量趋势',
-    },
-    {
-      key: 'tab2',
-      tab: '访问量',
-    },
-  ];
-
-  function onTabChange(key) {
-    activeKey.value = key;
-  }
-</script>

+ 0 - 106
src/views/dashboard/analysis/components/VisitAnalysis.vue

@@ -1,106 +0,0 @@
-<template>
-  <div ref="chartRef" :style="{ height, width }"></div>
-</template>
-<script lang="ts" setup>
-  import { onMounted, ref, Ref } from 'vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  import { basicProps } from './props';
-
-  defineProps({
-    ...basicProps,
-  });
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-
-  onMounted(() => {
-    setOptions({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          lineStyle: {
-            width: 1,
-            color: '#019680',
-          },
-        },
-      },
-      xAxis: {
-        type: 'category',
-        boundaryGap: false,
-        data: [
-          '6:00',
-          '7:00',
-          '8:00',
-          '9:00',
-          '10:00',
-          '11:00',
-          '12:00',
-          '13:00',
-          '14:00',
-          '15:00',
-          '16:00',
-          '17:00',
-          '18:00',
-          '19:00',
-          '20:00',
-          '21:00',
-          '22:00',
-          '23:00',
-        ],
-        splitLine: {
-          show: true,
-          lineStyle: {
-            width: 1,
-            type: 'solid',
-            color: 'rgba(226,226,226,0.5)',
-          },
-        },
-        axisTick: {
-          show: false,
-        },
-      },
-      yAxis: [
-        {
-          type: 'value',
-          max: 80000,
-          splitNumber: 4,
-          axisTick: {
-            show: false,
-          },
-          splitArea: {
-            show: true,
-            areaStyle: {
-              color: ['rgba(255,255,255,0.2)', 'rgba(226,226,226,0.2)'],
-            },
-          },
-        },
-      ],
-      grid: { left: '1%', right: '1%', top: '2  %', bottom: 0, containLabel: true },
-      series: [
-        {
-          smooth: true,
-          data: [
-            111, 222, 4000, 18000, 33333, 55555, 66666, 33333, 14000, 36000, 66666, 44444, 22222,
-            11111, 4000, 2000, 500, 333, 222, 111,
-          ],
-          type: 'line',
-          areaStyle: {},
-          itemStyle: {
-            color: '#5ab1ef',
-          },
-        },
-        {
-          smooth: true,
-          data: [
-            33, 66, 88, 333, 3333, 5000, 18000, 3000, 1200, 13000, 22000, 11000, 2221, 1201, 390,
-            198, 60, 30, 22, 11,
-          ],
-          type: 'line',
-          areaStyle: {},
-          itemStyle: {
-            color: '#019680',
-          },
-        },
-      ],
-    });
-  });
-</script>

+ 0 - 58
src/views/dashboard/analysis/components/VisitAnalysisBar.vue

@@ -1,58 +0,0 @@
-<template>
-  <div ref="chartRef" :style="{ height, width }"></div>
-</template>
-<script lang="ts" setup>
-  import { onMounted, ref, Ref } from 'vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  import { basicProps } from './props';
-
-  defineProps({
-    ...basicProps,
-  });
-
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  onMounted(() => {
-    setOptions({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          lineStyle: {
-            width: 1,
-            color: '#019680',
-          },
-        },
-      },
-      grid: { left: '1%', right: '1%', top: '2  %', bottom: 0, containLabel: true },
-      xAxis: {
-        type: 'category',
-        data: [
-          '1月',
-          '2月',
-          '3月',
-          '4月',
-          '5月',
-          '6月',
-          '7月',
-          '8月',
-          '9月',
-          '10月',
-          '11月',
-          '12月',
-        ],
-      },
-      yAxis: {
-        type: 'value',
-        max: 8000,
-        splitNumber: 4,
-      },
-      series: [
-        {
-          data: [3000, 2000, 3333, 5000, 3200, 4200, 3200, 2100, 3000, 5100, 6000, 3200, 4800],
-          type: 'bar',
-          barMaxWidth: 80,
-        },
-      ],
-    });
-  });
-</script>

+ 0 - 100
src/views/dashboard/analysis/components/VisitRadar.vue

@@ -1,100 +0,0 @@
-<template>
-  <Card title="转化率" :loading="loading">
-    <div ref="chartRef" :style="{ width, height }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-
-  const props = defineProps({
-    loading: Boolean,
-    width: {
-      type: String as PropType<string>,
-      default: '100%',
-    },
-    height: {
-      type: String as PropType<string>,
-      default: '300px',
-    },
-  });
-
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  watch(
-    () => props.loading,
-    () => {
-      if (props.loading) {
-        return;
-      }
-      setOptions({
-        legend: {
-          bottom: 0,
-          data: ['访问', '购买'],
-        },
-        tooltip: {},
-        radar: {
-          radius: '60%',
-          splitNumber: 8,
-          indicator: [
-            {
-              text: '电脑',
-              max: 100,
-            },
-            {
-              text: '充电器',
-              max: 100,
-            },
-            {
-              text: '耳机',
-              max: 100,
-            },
-            {
-              text: '手机',
-              max: 100,
-            },
-            {
-              text: 'Ipad',
-              max: 100,
-            },
-            {
-              text: '耳机',
-              max: 100,
-            },
-          ],
-        },
-        series: [
-          {
-            type: 'radar',
-            symbolSize: 0,
-            areaStyle: {
-              shadowBlur: 0,
-              shadowColor: 'rgba(0,0,0,.2)',
-              shadowOffsetX: 0,
-              shadowOffsetY: 10,
-              opacity: 1,
-            },
-            data: [
-              {
-                value: [90, 50, 86, 40, 50, 20],
-                name: '访问',
-                itemStyle: {
-                  color: '#b6a2de',
-                },
-              },
-              {
-                value: [70, 75, 70, 76, 20, 85],
-                name: '购买',
-                itemStyle: {
-                  color: '#5ab1ef',
-                },
-              },
-            ],
-          },
-        ],
-      });
-    },
-    { immediate: true },
-  );
-</script>

+ 0 - 80
src/views/dashboard/analysis/components/VisitSource.vue

@@ -1,80 +0,0 @@
-<template>
-  <Card title="访问来源" :loading="loading">
-    <div ref="chartRef" :style="{ width, height }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  const props = defineProps({
-    loading: Boolean,
-    width: {
-      type: String as PropType<string>,
-      default: '100%',
-    },
-    height: {
-      type: String as PropType<string>,
-      default: '300px',
-    },
-  });
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  watch(
-    () => props.loading,
-    () => {
-      if (props.loading) {
-        return;
-      }
-      setOptions({
-        tooltip: {
-          trigger: 'item',
-        },
-        legend: {
-          bottom: '1%',
-          left: 'center',
-        },
-        series: [
-          {
-            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],
-            name: '访问来源',
-            type: 'pie',
-            radius: ['40%', '70%'],
-            avoidLabelOverlap: false,
-            itemStyle: {
-              borderRadius: 10,
-              borderColor: '#fff',
-              borderWidth: 2,
-            },
-            label: {
-              show: false,
-              position: 'center',
-            },
-            emphasis: {
-              label: {
-                show: true,
-                fontSize: '12',
-                fontWeight: 'bold',
-              },
-            },
-            labelLine: {
-              show: false,
-            },
-            data: [
-              { value: 1048, name: '搜索引擎' },
-              { value: 735, name: '直接访问' },
-              { value: 580, name: '邮件营销' },
-              { value: 484, name: '联盟广告' },
-            ],
-            animationType: 'scale',
-            animationEasing: 'exponentialInOut',
-            animationDelay: function () {
-              return Math.random() * 100;
-            },
-          },
-        ],
-      });
-    },
-    { immediate: true },
-  );
-</script>

+ 0 - 165
src/views/dashboard/analysis/components/lineEcharts.vue

@@ -1,165 +0,0 @@
-<template>
-  <Card title="近半年用户新增趋势" :loading="loading">
-    <template #extra>
-      <div class="condition">
-          <div class="selct" style="display: inline-block;">
-            <span style="margin-right:15px">颗粒度</span>
-            <Select
-            v-model:value="value"
-            style="width: 100px;margin-right:30px"
-            placeholder="请选择颗粒度"
-            :options="options"
-            @change="handleChange"
-          ></Select>
-          </div>
-          <a-button type="primary" @click="handleExport" >导出</a-button>
-      </div>
-    </template>
-    <div ref="chartRef1" :style="{ width, height }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-import type { SelectProps } from 'ant-design-vue';
-import { Ref, ref, watch } from 'vue';
-import { Card, Select } from 'ant-design-vue';
-import { useECharts } from '/@/hooks/web/useECharts';
-const colorList = ['#38a0ff', '#73DDFF', '#fe9a8b', '#F56948', '#9E87FF'];
-const shadowColor = ['rgba(158,135,255, 0.3)','rgba(115,221,255, 0.3)','rgba(254,154,139, 0.3)']
-const emit = defineEmits(["alertSome"])
-import { exportElsxFile, } from '/@/utils/file/download';
-const props = defineProps({
-  loading: Boolean,
-  width: {
-    type: String as PropType<string>,
-    default: '100%',
-  },
-  height: {
-    type: String as PropType<string>,
-    default: '300px',
-  },
-  propsData:{
-    type:Object,
-    default:{
-      xData:['北京', '上海', '广州', '深圳', '香港', '澳门', '台湾'],
-      yData:[10, 10, 30, 12, 15, 3, 7],
-    }
-  }
-});
-const value = ref('0');
-const options = ref<SelectProps['options']>([
-    {
-      value: '0',
-      label: '日',
-    },
-    {
-      value: '1',
-      label: '周',
-    },
-    {
-      value: '2',
-      label: '月',
-    },
-    ]);
-const chartRef1 = ref<HTMLDivElement | null>(null);
-const { setOptions } = useECharts(chartRef1 as Ref<HTMLDivElement>);
-function handleChange(val){
-    emit('change',{type:'user',value:val})
-}
-function handleExport(){
-  console.log('props',props.propsData)
-  let fields  = {
-    'time':'日期',
-    'num':'数量',
-  }
-    let data = props.propsData.xData.map((ele,index) => {
-      return {
-        'time':ele,
-        'num':props.propsData.yData && props.propsData.yData[index] || 0,
-      }
-    })
-    exportElsxFile(data, fields,'用户趋势')
-}
-watch(
-  () => props.propsData,
-  (propsData) => {
-    setOptions({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          label: {
-            show: true,
-            backgroundColor: '#fff',
-            color: '#556677',
-            borderColor: 'rgba(0,0,0,0)',
-            shadowColor: 'rgba(0,0,0,0)',
-            shadowOffsetY: 0,
-          },
-          lineStyle: {
-            width: 0,
-          },
-        },
-        backgroundColor: '#fff',
-        textStyle: {
-          color: '#5c6c7c',
-        },
-        padding: [10, 10],
-        extraCssText: 'box-shadow: 1px 0 2px 0 rgba(163,163,163,0.5)',
-      },
-
-      xAxis: {
-          type: 'category',
-          data: propsData.xData,
-         
-        },
-      yAxis: [
-        {
-          type: 'value',
-          axisTick: {
-            show: false,
-          },
-          splitLine: {
-            show: true,
-            lineStyle: {
-              color: ['#f1f4f8'],
-              width: 1,
-              type: 'solid',
-            },
-          },
-          axisLabel: {
-            textStyle: {
-              color: '#556677',
-            },
-            formatter: '{value}',
-          },
-          axisLine: {
-            show: false,
-            lineStyle: {
-              color: '#DCE2E8',
-            },
-          },
-        },
-      ],
-      series: [
-        {
-          name: 'Adidas',
-          type: 'line',
-          data: propsData.yData,
-          symbolSize: 1,
-          smooth: true,
-          symbol:'none', //加这个
-          // yAxisIndex: 0,
-          showSymbol: false,
-          lineStyle: {
-            width: 2,
-            color: colorList[0],
-            shadowColor: shadowColor[0],
-            shadowBlur: 10,
-            shadowOffsetY: 20,
-          },
-        },
-      ],
-    });
-  },
-  { immediate: true,deep:true },
-);
-</script>

+ 0 - 156
src/views/dashboard/analysis/components/lineEcharts2.vue

@@ -1,156 +0,0 @@
-<template>
-  <Card title="近半年线上订单趋势" :loading="loading">
-    <template #extra>
-      <div class="condition">
-          <div class="selct" style="display: inline-block;">
-            <span style="margin-right:15px">颗粒度</span>
-            <Select
-            v-model:value="value"
-            style="width: 100px;margin-right:30px"
-            placeholder="请选择颗粒度"
-            :options="options"
-            @change="handleChange"
-          ></Select>
-          </div>
-          <a-button type="primary" @click="handleExport">导出</a-button>
-      </div>
-    </template>
-      <div ref="chartRef" :style="{ height, width }"></div>
-  </Card>
-</template>
-<script lang="ts">
-  import { basicProps } from './props';
-  // import { dateUtil } from '/@/utils/dateUtil';
-  import { Card, Select } from 'ant-design-vue';
-</script>
-<script lang="ts" setup>
-  import { ref, Ref, watch, defineEmits } from 'vue';
-  // import type { dataItemType } from './props';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  import { exportElsxFile, } from '/@/utils/file/download';
-  const props = defineProps({
-  loading: Boolean,
-    ...basicProps,
-  });
-  const value = ref('0');
-  const options = ref<SelectProps['options']>([
-    {
-      value: '0',
-      label: '日',
-    },
-    {
-      value: '1',
-      label: '周',
-    },
-    {
-      value: '2',
-      label: '月',
-    },
-    ]);
-  const emit = defineEmits(["alertSome"])
-  const downOrderData = ref<number[]>([]);
-  const incrementOrderData = ref<number[]>([]);
-  const partsOrderData = ref<number[]>([]);
-  const yixStringData = ref<string[]>([]);
-  const echartTypr = ref('line')
-  const nameList = ref<string[]>(['下载订单','权益订单','配件订单']);
-  const maxSize = ref(0);
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  function handleChange(val){
-    emit('change',{type:'order',value:val})
-  }
-  function handleExport(){
-    let fields  = {
-    'time':'日期',
-    'd':'下载订单',
-    'e':'权益订单',
-    'p':'配件订单',
-  }
-    let data = yixStringData.value.map((ele,index) => {
-      return {
-        'time':ele,
-        'd':downOrderData.value && downOrderData.value[index] || 0,
-        'e':incrementOrderData.value && incrementOrderData.value[index] || 0,
-        'p':partsOrderData.value && partsOrderData.value[index] || 0,
-      }
-    })
-    exportElsxFile(data, fields,'订单趋势')
-  }
-  function handlesetOptions() {
-    setOptions({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          lineStyle: {
-            width: 1,
-            color: '#019680',
-          },
-        },
-      },
-      legend: {
-        orient: 'horizontal',
-        bottom: 0,
-      },
-      // grid: { left: '2%', right: '2%', top: '10%', bottom: '10%', containLabel: true },
-      xAxis: {
-        type: 'category',
-        // data: [...new Array(30)].map((_item, index) => `${index + 1}日`),
-        data: yixStringData.value,
-      },
-      yAxis: {
-        type: 'value',
-        max: maxSize.value,
-        splitNumber: 4,
-      },
-      series: [
-        {
-          data: downOrderData.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#38a0ff' },
-          barMaxWidth: 80,
-          name: nameList.value[0],
-        },
-        {
-          data: incrementOrderData.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#4cca73' },
-          barMaxWidth: 80,
-          name: nameList.value[1],
-        },
-        {
-          data: partsOrderData.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#FDD56A' },
-          barMaxWidth: 80,
-          name: nameList.value[2],
-        },
-      ],
-    });
-  }
-  // props.viewStatics,
-  
-  watch(
-    () => props.echartData,
-    (echartData) => {
-      downOrderData.value = echartData.downOrder ||[]
-      incrementOrderData.value = echartData.incrementOrder ||[]
-      partsOrderData.value = echartData.partOrder ||[]
-      yixStringData.value = echartData.xdata ||[]
-      if(echartData.nameList){
-        nameList.value = echartData.nameList
-      }
-      if(echartData.echartTypr){
-        echartTypr.value = echartData.echartTypr
-      }
-      const maxNumber = Math.max(...echartData.downOrder.concat(echartData.incrementOrder));
-      const pow = Math.pow(10, maxNumber.toString().length - 1);
-      maxSize.value = maxNumber > 10 ? Math.floor(maxNumber / 10) * 10 + pow * 2 : 10;
-      handlesetOptions();
-    },
-    {
-      immediate: true,
-      deep: true,
-    },
-  );
-</script>

+ 0 - 165
src/views/dashboard/analysis/components/orderEchart.vue

@@ -1,165 +0,0 @@
-<template>
-  <Card :title="title||'订单数据统计'">
-    <template #extra>
-      <div class="condition">
-          <div class="selct" style="display: inline-block;">
-            <span style="margin-right:15px">颗粒度</span>
-            <Select
-            v-model:value="value"
-            style="width: 100px;margin-right:30px"
-            placeholder="请选择颗粒度"
-            :options="options"
-            @change="handleChange"
-          ></Select>
-          </div>
-          <a-button type="primary" @click="handleExport">导出</a-button>
-      </div>
-    </template>
-    <div ref="chartRef" :style="{ height, width }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { basicProps } from './props';
-  import type { SelectProps } from 'ant-design-vue';
-  import { Card, DatePicker, Select } from 'ant-design-vue';
-  import { ref, Ref, watch, defineEmits } from 'vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  import { exportElsxFile, } from '/@/utils/file/download';
-  const props = defineProps({
-  loading: Boolean,
-    ...basicProps,
-  });
-  const value = ref('0');
-  const options = ref<SelectProps['options']>([
-    {
-      value: '0',
-      label: '日',
-    },
-    {
-      value: '1',
-      label: '周',
-    },
-    {
-      value: '2',
-      label: '月',
-    },
-    ]);
-  const emit = defineEmits(["alertSome"])
-  const kjList = ref<number[]>([]);
-  const kkList = ref<number[]>([]);
-  const ssList = ref<number[]>([]);
-  const ssobjList = ref<number[]>([]);
-  const yixStringData = ref<string[]>([]);
-  const echartTypr = ref('line')
-  const nameList = ref<string[]>(['看见场景','看看场景','深时场景','深时obj']);
-  const maxSize = ref(0);
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>)
-
-  function handleChange(val){
-    emit('change',{type:'scene',value:val})
-  }
-  
-  function handleExport(){
-    let fields  = {
-    'time':'日期',
-    'kj':'看见场景',
-    'kk':'看看场景',
-    'ss':'深时场景',
-    'dy':'深时obj',
-  }
-    let data = yixStringData.value.map((ele,index) => {
-      return {
-        'time':ele,
-        'kj':kjList.value && kjList.value[index] || 0,
-        'kk':kkList.value && kkList.value[index] || 0,
-        'ss':ssList.value && ssList.value[index] || 0,
-        'dy':ssobjList.value && ssobjList.value[index] || 0,
-      }
-    })
-    exportElsxFile(data,fields,'场景趋势')
-  }
-
-  function handlesetOptions() {
-    setOptions({
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          lineStyle: {
-            width: 1,
-            color: '#019680',
-          },
-        },
-      },
-      legend: {
-        orient: 'horizontal',
-        bottom: 0,
-      },
-      // grid: { left: '2%', right: '2%', top: '10%', bottom: '10%', containLabel: true },
-      xAxis: {
-        type: 'category',
-        // data: [...new Array(30)].map((_item, index) => `${index + 1}日`),
-        data: yixStringData.value,
-      },
-      yAxis: {
-        type: 'value',
-        // max: maxSize.value,
-        splitNumber: 4,
-      },
-      series: [
-        {
-          data: kjList.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#38a0ff' },
-          barMaxWidth: 80,
-          name: nameList.value[0],
-        },
-        {
-          data: kkList.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#4cca73' },
-          barMaxWidth: 80,
-          name: nameList.value[1],
-        },
-        {
-          data: ssList.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#FDD56A' },
-          barMaxWidth: 80,
-          name: nameList.value[2],
-        },
-        {
-          data: ssobjList.value,
-          type: echartTypr.value,
-          itemStyle: { color: '#d58b55' },
-          barMaxWidth: 80,
-          name: nameList.value[3],
-        },
-      ],
-    });
-  }
-  watch(
-    () => props.echartData,
-    (echartData) => {
-      kjList.value = echartData.kjList ||[]
-      kkList.value = echartData.kkList ||[]
-      ssList.value = echartData.ssList ||[]
-      ssobjList.value = echartData.ssobjList ||[]
-      yixStringData.value = echartData.xdata ||[]
-      if(echartData.nameList){
-        nameList.value = echartData.nameList
-      }
-      if(echartData.echartTypr){
-        echartTypr.value = echartData.echartTypr
-      }
-      // const maxNumber = Math.max(...echartData.downOrder.concat(echartData.incrementOrder));
-      // const pow = Math.pow(10, maxNumber.toString().length - 1);
-      // maxSize.value = maxNumber > 10 ? Math.floor(maxNumber / 10) * 10 + pow * 2 : 10;
-      handlesetOptions();
-    },
-    {
-      immediate: true,
-      deep: true,
-    },
-  );
-</script>

+ 0 - 52
src/views/dashboard/analysis/components/props.ts

@@ -1,52 +0,0 @@
-import { PropType } from 'vue';
-
-export interface BasicProps {
-  width: string;
-  height: string;
-}
-export type dataItemType = {
-  date: string;
-  amount: string | number;
-};
-export type echartData = {
-  xdata: string[];
-  downOrder: number[];
-  incrementOrder: number[];
-  partOrder: number[];
-  nameList?:string[];
-  kjList?:number[];
-  kkList?:number[];
-  ssList?:number[];
-  ssobjList?:number[];
-  echartTypr?:string;
-};
-export const basicProps = {
-  width: {
-    type: String as PropType<string>,
-    default: '100%',
-  },
-  height: {
-    type: String as PropType<string>,
-    default: '280px',
-  },
-  viewStatics: {
-    type: Array as PropType<Array<dataItemType>>,
-    default: [],
-  },
-  shareStatics: {
-    type: Array as PropType<Array<dataItemType>>,
-    default: [],
-  },
-  bulletChatAmounts: {
-    type: Array as PropType<Array<dataItemType>>,
-    default: [],
-  },
-  userAmount: {
-    type: Array as PropType<Array<dataItemType>>,
-    default: [],
-  },
-  echartData: {
-    type: Object as PropType<echartData>,
-    default: {},
-  },
-};

+ 0 - 60
src/views/dashboard/analysis/data.ts

@@ -1,60 +0,0 @@
-export interface GrowCardItem {
-  icon: string;
-  title: string;
-  value: number;
-  unit: string;
-  color: string;
-  action: string;
-}
-
-export const growCardList: GrowCardItem[] = [
-  {
-    title: '累计用户',
-    // icon: 'fa6-solid:users-gear',
-    icon: 'visit-count|svg',
-    value: 2000,
-    unit: '人',
-    color: 'green',
-    action: '年',
-  },
-  {
-    title: '上月新增用户',
-    icon: 'akar-icons:person-add',
-    value: 20000,
-    unit: '人',
-    color: 'blue',
-    action: '月',
-  },
-  {
-    title: '今日新增用户',
-    icon: 'carbon:user-role',
-    value: 8000,
-    unit: '人',
-    color: 'orange',
-    action: '日',
-  },
-  {
-    title: '上月权益订单数',
-    icon: 'fxemoji:notchedrightsemi3dot',
-    value: 20000,
-    unit: '笔',
-    color: 'blue',
-    action: '月',
-  },
-  {
-    title: '上月下载订单数',
-    icon: 'download-count|svg',
-    value: 8000,
-    unit: '笔',
-    color: 'orange',
-    action: '月',
-  },
-  {
-    title: '上月配件订单数',
-    icon: 'transaction|svg',
-    value: 5000,
-    unit: '人',
-    color: 'purple',
-    action: '月',
-  },
-];

+ 0 - 209
src/views/dashboard/analysis/index.vue

@@ -1,209 +0,0 @@
-<template>
-  <div class="p-4">
-    <GrowCard :loading="loading" class="enter-y" :list="growCardList" />
-    <div class="md:flex !my-4 enter-y">
-      <lineEcharts
-        class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-4"
-        name="chartRef1"
-        @change="Search"
-        :propsData="echartData"
-        @export="handleExport"
-      />
-      <lineEcharts2 name="chartRef2" class="md:w-1/2 mx-4 w-full" @export="handleExport"  @change="Search" :echartData="orderData"  />
-    </div>
-    <sceneEchart title="近半年场景新增趋势" class="!my-4 enter-y" @export="handleExport" @change="Search" :echartData="scenetData" />
-    <!-- <SiteAnalysis class="!my-4 enter-y" :loading="loading" /> -->
-    <!-- <div class="md:flex enter-y">
-      <VisitRadar class="md:w-1/3 w-full" :loading="loading" />
-      <VisitSource class="md:w-1/3 !md:mx-4 !md:my-0 !my-4 w-full" :loading="loading" />
-      <SalesProductPie class="md:w-1/3 w-full" :loading="loading" />
-    </div> -->
-  </div>
-</template>
-<script lang="ts" setup>
-import { ref, onMounted, reactive } from 'vue';
-import { userTotal, orderTotal, orderTrend,userTrend,sceneTrend, cameraExport, downExport, incrementExport } from '/@/api/statistics/index';
-import GrowCard from './components/GrowCard.vue';
-import SiteAnalysis from './components/SiteAnalysis.vue';
-import sceneEchart from './components/orderEchart.vue';
-import VisitSource from './components/VisitSource.vue';
-import VisitRadar from './components/VisitRadar.vue';
-import lineEcharts from './components/lineEcharts.vue';
-import lineEcharts2 from './components/lineEcharts2.vue';
-import SalesProductPie from './components/SalesProductPie.vue';
-import { Row, Col } from 'ant-design-vue';
-const loading = ref(true);
-interface GrowCardItem {
-  icon: string;
-  title: string;
-  value: number;
-  unit: string;
-  color: string;
-  action: string;
-}
-const exportData = reactive({
-  orderData:[],
-  sceneData:[],
-  cameraData:[],
-})
-const orderData = reactive({
-    xdata:[],
-    downOrder:[],
-    incrementOrder:[],
-    partOrder:[],
-  })
-const echartData = reactive({
-    xData:[],
-    yData:[],
-  })
-const scenetData = reactive({
-    xdata:[],
-    kjList:[],
-    kkList:[],
-    ssList:[],
-    ssobjList:[],
-    echartTypr:'bar',
-  })
-const SearchData = reactive({
-    startTime:'',
-    endTime:'',
-    orderType:0,
-    sceneType:0,
-    userType:0,
-  })
-onMounted(() => {
-  getData();
-  getAddUser();
-  getOrder()
-  getSceneList()
-});
-const growCardList = ref<GrowCardItem[]>([]);
-async function getData() {
-  try {
-    loading.value = true;
-    const { totalUserCount, preMonthAddCount, todayAddCount, todayActiveCount } = await userTotal();
-    const { preMonThPowCount, preMonThDownCount, preMonThPartCount } = await orderTotal();
-    let list = [
-      {
-        title: '累计用户',
-        // icon: 'fa6-solid:users-gear',
-        icon: 'visit-count|svg',
-        value: totalUserCount || 0,
-        unit: '人',
-        color: 'green',
-        action: '年',
-      },
-      {
-        title: '上月新增用户',
-        icon: 'akar-icons:person-add',
-        value: preMonthAddCount || 0,
-        unit: '人',
-        color: 'blue',
-        action: '月',
-      },
-      {
-        title: '今日新增用户',
-        icon: 'carbon:user-role',
-        value: todayAddCount || 0,
-        unit: '人',
-        color: 'orange',
-        action: '日',
-      },
-      {
-        title: '上月权益订单数',
-        icon: 'fxemoji:notchedrightsemi3dot',
-        value: preMonThPowCount,
-        unit: '笔',
-        color: 'blue',
-        action: '月',
-      },
-      {
-        title: '上月下载订单数',
-        icon: 'download-count|svg',
-        value: preMonThDownCount,
-        unit: '笔',
-        color: 'orange',
-        action: '月',
-      },
-      {
-        title: '上月配件订单数',
-        icon: 'transaction|svg',
-        value: preMonThPartCount,
-        unit: '人',
-        color: 'blue',
-        action: '月',
-      },
-    ];
-    growCardList.value = list;
-    loading.value = false;
-  } catch (error) {
-    loading.value = false;
-  }
-}
-async function getAddUser() {
-  let xdata = [], yData=[]
-    const data = await userTrend({...SearchData,type:SearchData.userType});
-    data.map(ele => {
-      xdata.push(ele.groupKey)
-      yData.push(ele.count)
-    })
-    echartData.xData = xdata
-    echartData.yData = yData
-}
-
-
-async function getOrder() {
-    let downlist = [],xdata = []
-    const {downOrder,incrementOrder,partOrder} = await orderTrend({...SearchData,type:SearchData.orderType});
-    downOrder.map(ele => {
-      xdata.push(ele.groupKey)
-      downlist.push(ele.count)
-    })
-    orderData.xdata = xdata
-    orderData.downOrder = downlist
-    orderData.incrementOrder = incrementOrder.map(ele => ele.count)
-    orderData.partOrder = partOrder &&partOrder.map(ele => ele.count)|| []
-  }
-  async function getSceneList() {
-    let downlist = [],xdata = []
-    const {kjList,kkList,ssList,ssobjList} = await sceneTrend({...SearchData,type:SearchData.sceneType});
-    kjList.map(ele => {
-      xdata.push(ele.groupKey)
-      downlist.push(ele.count)
-    })
-    scenetData.xdata = xdata
-    scenetData.kjList = downlist
-    scenetData.kkList = kkList.map(ele => ele.count)
-    scenetData.ssList = ssList &&ssList.map(ele => ele.count)|| []
-    scenetData.ssobjList = ssobjList.map(ele => ele.count)|| []
-  }
-  function handleExport(val){
-    console.log('handleExport',val)
-    let obj = {
-      'user':cameraExport,
-      'order':incrementExport,
-      'scene':downExport,
-    }
-  }
-
-  function Search(val){
-    const {value,type} = val
-    console.log('handleChange',value,type)
-    if(type){
-      switch(type){
-        case 'user':
-        SearchData.userType = value
-        getAddUser()
-        break;
-        case 'order':
-        SearchData.orderType = value
-        getOrder()
-        break;
-        case 'scene':
-        SearchData.sceneType = value
-        getSceneList()
-        break;
-      }
-    }
-  }
-</script>

+ 0 - 100
src/views/dashboard/test/index.vue

@@ -1,100 +0,0 @@
-<template>
-  <Card title="转化率" :loading="loading">cdesssss 
-    <div ref="chartRef" :style="{ width, height }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-
-  const props = defineProps({
-    loading: Boolean,
-    width: {
-      type: String as PropType<string>,
-      default: '100%',
-    },
-    height: {
-      type: String as PropType<string>,
-      default: '300px',
-    },
-  });
-
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  watch(
-    () => props.loading,
-    () => {
-      if (props.loading) {
-        return;
-      }
-      setOptions({
-        legend: {
-          bottom: 0,
-          data: ['访问', '购买'],
-        },
-        tooltip: {},
-        radar: {
-          radius: '60%',
-          splitNumber: 8,
-          indicator: [
-            {
-              text: '电脑',
-              max: 100,
-            },
-            {
-              text: '充电器',
-              max: 100,
-            },
-            {
-              text: '耳机',
-              max: 100,
-            },
-            {
-              text: '手机',
-              max: 100,
-            },
-            {
-              text: 'Ipad',
-              max: 100,
-            },
-            {
-              text: '耳机',
-              max: 100,
-            },
-          ],
-        },
-        series: [
-          {
-            type: 'radar',
-            symbolSize: 0,
-            areaStyle: {
-              shadowBlur: 0,
-              shadowColor: 'rgba(0,0,0,.2)',
-              shadowOffsetX: 0,
-              shadowOffsetY: 10,
-              opacity: 1,
-            },
-            data: [
-              {
-                value: [90, 50, 86, 40, 50, 20],
-                name: '访问',
-                itemStyle: {
-                  color: '#b6a2de',
-                },
-              },
-              {
-                value: [70, 75, 70, 76, 20, 85],
-                name: '购买',
-                itemStyle: {
-                  color: '#5ab1ef',
-                },
-              },
-            ],
-          },
-        ],
-      });
-    },
-    { immediate: true },
-  );
-</script>

+ 0 - 31
src/views/dashboard/workbench/components/DynamicInfo.vue

@@ -1,31 +0,0 @@
-<template>
-  <Card title="最新动态" v-bind="$attrs">
-    <template #extra>
-      <a-button type="link" size="small">更多</a-button>
-    </template>
-    <List item-layout="horizontal" :data-source="dynamicInfoItems">
-      <template #renderItem="{ item }">
-        <ListItem>
-          <ListItemMeta>
-            <template #description>
-              {{ item.date }}
-            </template>
-            <!-- eslint-disable-next-line -->
-            <template #title> {{ item.name }} <span v-html="item.desc"> </span> </template>
-            <template #avatar>
-              <Icon :icon="item.avatar" :size="30" />
-            </template>
-          </ListItemMeta>
-        </ListItem>
-      </template>
-    </List>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Card, List } from 'ant-design-vue';
-  import { dynamicInfoItems } from './data';
-  import { Icon } from '/@/components/Icon';
-
-  const ListItem = List.Item;
-  const ListItemMeta = List.Item.Meta;
-</script>

+ 0 - 34
src/views/dashboard/workbench/components/ProjectCard.vue

@@ -1,34 +0,0 @@
-<template>
-  <Card title="项目" v-bind="$attrs">
-    <template #extra>
-      <a-button type="link" size="small">更多</a-button>
-    </template>
-
-    <template v-for="item in items" :key="item">
-      <CardGrid class="!md:w-1/3 !w-full">
-        <span class="flex">
-          <Icon :icon="item.icon" :color="item.color" size="30" />
-          <span class="text-lg ml-4">{{ item.title }}</span>
-        </span>
-        <div class="flex mt-2 h-10 text-secondary">{{ item.desc }}</div>
-        <div class="flex justify-between text-secondary">
-          <span>{{ item.group }}</span>
-          <span>{{ item.date }}</span>
-        </div>
-      </CardGrid>
-    </template>
-  </Card>
-</template>
-<script lang="ts">
-  import { defineComponent } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { Icon } from '/@/components/Icon';
-  import { groupItems } from './data';
-
-  export default defineComponent({
-    components: { Card, CardGrid: Card.Grid, Icon },
-    setup() {
-      return { items: groupItems };
-    },
-  });
-</script>

+ 0 - 19
src/views/dashboard/workbench/components/QuickNav.vue

@@ -1,19 +0,0 @@
-<template>
-  <Card title="快捷导航" v-bind="$attrs">
-    <template v-for="item in navItems" :key="item">
-      <CardGrid>
-        <span class="flex flex-col items-center">
-          <Icon :icon="item.icon" :color="item.color" size="20" />
-          <span class="text-md mt-2">{{ item.title }}</span>
-        </span>
-      </CardGrid>
-    </template>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Card } from 'ant-design-vue';
-  import { navItems } from './data';
-  import { Icon } from '/@/components/Icon';
-
-  const CardGrid = Card.Grid;
-</script>

+ 0 - 100
src/views/dashboard/workbench/components/SaleRadar.vue

@@ -1,100 +0,0 @@
-<template>
-  <Card title="销售统计" :loading="loading">
-    <div ref="chartRef" :style="{ width, height }"></div>
-  </Card>
-</template>
-<script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-
-  const props = defineProps({
-    loading: Boolean,
-    width: {
-      type: String as PropType<string>,
-      default: '100%',
-    },
-    height: {
-      type: String as PropType<string>,
-      default: '400px',
-    },
-  });
-
-  const chartRef = ref<HTMLDivElement | null>(null);
-  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
-  watch(
-    () => props.loading,
-    () => {
-      if (props.loading) {
-        return;
-      }
-      setOptions({
-        legend: {
-          bottom: 0,
-          data: ['Visits', 'Sales'],
-        },
-        tooltip: {},
-        radar: {
-          radius: '60%',
-          splitNumber: 8,
-          indicator: [
-            {
-              text: '2017',
-              max: 100,
-            },
-            {
-              text: '2017',
-              max: 100,
-            },
-            {
-              text: '2018',
-              max: 100,
-            },
-            {
-              text: '2019',
-              max: 100,
-            },
-            {
-              text: '2020',
-              max: 100,
-            },
-            {
-              text: '2021',
-              max: 100,
-            },
-          ],
-        },
-        series: [
-          {
-            type: 'radar',
-            symbolSize: 0,
-            areaStyle: {
-              shadowBlur: 0,
-              shadowColor: 'rgba(0,0,0,.2)',
-              shadowOffsetX: 0,
-              shadowOffsetY: 10,
-              opacity: 1,
-            },
-            data: [
-              {
-                value: [90, 50, 86, 40, 50, 20],
-                name: 'Visits',
-                itemStyle: {
-                  color: '#b6a2de',
-                },
-              },
-              {
-                value: [70, 75, 70, 76, 20, 85],
-                name: 'Sales',
-                itemStyle: {
-                  color: '#67e0e3',
-                },
-              },
-            ],
-          },
-        ],
-      });
-    },
-    { immediate: true },
-  );
-</script>

+ 0 - 33
src/views/dashboard/workbench/components/WorkbenchHeader.vue

@@ -1,33 +0,0 @@
-<template>
-  <div class="lg:flex">
-    <Avatar :src="userinfo.avatar || headerImg" :size="72" class="!mx-auto !block" />
-    <div class="md:ml-6 flex flex-col justify-center md:mt-0 mt-2">
-      <h1 class="md:text-lg text-md">早安, {{ userinfo.realName }}, 开始您一天的工作吧!</h1>
-      <span class="text-secondary"> 今日晴,20℃ - 32℃! </span>
-    </div>
-    <div class="flex flex-1 justify-end md:mt-0 mt-4">
-      <div class="flex flex-col justify-center text-right">
-        <span class="text-secondary"> 待办 </span>
-        <span class="text-2xl">2/10</span>
-      </div>
-
-      <div class="flex flex-col justify-center text-right md:mx-16 mx-12">
-        <span class="text-secondary"> 项目 </span>
-        <span class="text-2xl">8</span>
-      </div>
-      <div class="flex flex-col justify-center text-right md:mr-10 mr-4">
-        <span class="text-secondary"> 团队 </span>
-        <span class="text-2xl">300</span>
-      </div>
-    </div>
-  </div>
-</template>
-<script lang="ts" setup>
-  import { computed } from 'vue';
-  import { Avatar } from 'ant-design-vue';
-  import { useUserStore } from '/@/store/modules/user';
-  import headerImg from '/@/assets/images/header.jpg';
-
-  const userStore = useUserStore();
-  const userinfo = computed(() => userStore.getUserInfo);
-</script>

+ 0 - 156
src/views/dashboard/workbench/components/data.ts

@@ -1,156 +0,0 @@
-interface GroupItem {
-  title: string;
-  icon: string;
-  color: string;
-  desc: string;
-  date: string;
-  group: string;
-}
-
-interface NavItem {
-  title: string;
-  icon: string;
-  color: string;
-}
-
-interface DynamicInfoItem {
-  avatar: string;
-  name: string;
-  date: string;
-  desc: string;
-}
-
-export const navItems: NavItem[] = [
-  {
-    title: '首页',
-    icon: 'ion:home-outline',
-    color: '#1fdaca',
-  },
-  {
-    title: '仪表盘',
-    icon: 'ion:grid-outline',
-    color: '#bf0c2c',
-  },
-  {
-    title: '组件',
-    icon: 'ion:layers-outline',
-    color: '#e18525',
-  },
-  {
-    title: '系统管理',
-    icon: 'ion:settings-outline',
-    color: '#3fb27f',
-  },
-  {
-    title: '权限管理',
-    icon: 'ion:key-outline',
-    color: '#4daf1bc9',
-  },
-  {
-    title: '图表',
-    icon: 'ion:bar-chart-outline',
-    color: '#00d8ff',
-  },
-];
-
-export const dynamicInfoItems: DynamicInfoItem[] = [
-  {
-    avatar: 'dynamic-avatar-1|svg',
-    name: '威廉',
-    date: '刚刚',
-    desc: `在 <a>开源组</a> 创建了项目 <a>Vue</a>`,
-  },
-  {
-    avatar: 'dynamic-avatar-2|svg',
-    name: '艾文',
-    date: '1个小时前',
-    desc: `关注了 <a>威廉</a> `,
-  },
-  {
-    avatar: 'dynamic-avatar-3|svg',
-    name: '克里斯',
-    date: '1天前',
-    desc: `发布了 <a>个人动态</a> `,
-  },
-  {
-    avatar: 'dynamic-avatar-4|svg',
-    name: 'Vben',
-    date: '2天前',
-    desc: `发表文章 <a>如何编写一个Vite插件</a> `,
-  },
-  {
-    avatar: 'dynamic-avatar-5|svg',
-    name: '皮特',
-    date: '3天前',
-    desc: `回复了 <a>杰克</a> 的问题 <a>如何进行项目优化?</a>`,
-  },
-  {
-    avatar: 'dynamic-avatar-6|svg',
-    name: '杰克',
-    date: '1周前',
-    desc: `关闭了问题 <a>如何运行项目</a> `,
-  },
-  {
-    avatar: 'dynamic-avatar-1|svg',
-    name: '威廉',
-    date: '1周前',
-    desc: `发布了 <a>个人动态</a> `,
-  },
-  {
-    avatar: 'dynamic-avatar-1|svg',
-    name: '威廉',
-    date: '2021-04-01 20:00',
-    desc: `推送了代码到 <a>Github</a>`,
-  },
-];
-
-export const groupItems: GroupItem[] = [
-  {
-    title: 'Github',
-    icon: 'carbon:logo-github',
-    color: '',
-    desc: '不要等待机会,而要创造机会。',
-    group: '开源组',
-    date: '2021-04-01',
-  },
-  {
-    title: 'Vue',
-    icon: 'ion:logo-vue',
-    color: '#3fb27f',
-    desc: '现在的你决定将来的你。',
-    group: '算法组',
-    date: '2021-04-01',
-  },
-  {
-    title: 'Html5',
-    icon: 'ion:logo-html5',
-    color: '#e18525',
-    desc: '没有什么才能比努力更重要。',
-    group: '上班摸鱼',
-    date: '2021-04-01',
-  },
-  {
-    title: 'Angular',
-    icon: 'ion:logo-angular',
-    color: '#bf0c2c',
-    desc: '热情和欲望可以突破一切难关。',
-    group: 'UI',
-    date: '2021-04-01',
-  },
-  {
-    title: 'React',
-    icon: 'bx:bxl-react',
-    color: '#00d8ff',
-    desc: '健康的身体是实目标的基石。',
-    group: '技术牛',
-    date: '2021-04-01',
-  },
-  {
-    title: 'Js',
-    icon: 'ion:logo-javascript',
-    color: '#4daf1bc9',
-    desc: '路是走出来的,而不是空想出来的。',
-    group: '架构组',
-    date: '2021-04-01',
-  },
-];

+ 0 - 36
src/views/dashboard/workbench/index.vue

@@ -1,36 +0,0 @@
-<template>
-  <PageWrapper>
-    <template #headerContent> <WorkbenchHeader /> </template>
-    <div class="lg:flex">
-      <div class="lg:w-7/10 w-full !mr-4 enter-y">
-        <ProjectCard :loading="loading" class="enter-y" />
-        <DynamicInfo :loading="loading" class="!my-4 enter-y" />
-      </div>
-      <div class="lg:w-3/10 w-full enter-y">
-        <QuickNav :loading="loading" class="enter-y" />
-
-        <Card class="!my-4 enter-y" :loading="loading">
-          <img class="xl:h-50 h-30 mx-auto" src="../../../assets/svg/illustration.svg" />
-        </Card>
-
-        <SaleRadar :loading="loading" class="enter-y" />
-      </div>
-    </div>
-  </PageWrapper>
-</template>
-<script lang="ts" setup>
-  import { ref } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { PageWrapper } from '/@/components/Page';
-  import WorkbenchHeader from './components/WorkbenchHeader.vue';
-  import ProjectCard from './components/ProjectCard.vue';
-  import QuickNav from './components/QuickNav.vue';
-  import DynamicInfo from './components/DynamicInfo.vue';
-  import SaleRadar from './components/SaleRadar.vue';
-
-  const loading = ref(true);
-
-  setTimeout(() => {
-    loading.value = false;
-  }, 1500);
-</script>

+ 0 - 142
src/views/device/OutflowModal.vue

@@ -1,142 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    title="批量出库"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-    :min-height="0"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm" :model="model">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-      </BasicForm>
-      <a @click="getTemplate" style="padding: 20px 0 0 80px">下载批量出库模板</a>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { downloadByData } from '/@/utils/file/download'
-  // import { sceneMove } from '/@/api/operate';
-  import { companyUploadExcel, downTemplate } from '/@/api/customer';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi, AddAndUpload } from '/@/api/product/index';
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const modelRef = ref({});
-      const fileFlow = reactive({
-        file: null,
-      });
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'file',
-          component: 'Upload',
-          label: t('routes.product.file'),
-          required: true,
-          rules: [{ required: true, message: t('common.uploadMessge') }],
-          // helpMessage: t('routes.corporation.uploadHelp'),
-          itemProps: {
-            validateTrigger: 'onBlur',
-          },
-          componentProps: {
-            api: uploadApi,
-            maxNumber: 1,
-            maxSize: 5,
-            fileFlow: true,
-            accept: ['xls', 'xlsx'],
-            afterFetch: function (data) {
-              // console.log('uploadApi', data);
-              // Reflect.set(data, 'url', data.file);
-              fileFlow.file = data.file;
-              console.log(fileFlow.file);
-              return data;
-            },
-          },
-
-          colProps: {
-            span: 22,
-          },
-        },
-      ];
-      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
-        labelWidth: 120,
-        schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        // console.log(data);
-        data && onDataReceive(data);
-      });
-
-      function onDataReceive(data) {
-        modelRef.value = data;
-        resetFields();
-        setFieldsValue({
-          type: data.sceneName,
-        });
-      }
-      const handleSubmit = async () => {
-        try {
-          const params = await validate();
-          const apiData = {
-            file: fileFlow.file,
-            data:{
-              type: 1,
-            }
-          };
-          const res = await companyUploadExcel(apiData);
-          console.log('res', res);
-          closeModal();
-          resetFields();
-          createMessage.success(res || '导出成功');
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      };
-      function handleVisibleChange(v) {
-        // console.log(v);
-        // v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      async function getTemplate() {
-        try {
-          const res:BlobPart = await downTemplate({ type: 1 });
-          downloadByData(res.data,'出库模板.xlsx')
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      }
-      return {
-        register,
-        schemas,
-        registerForm,
-        model: modelRef,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-        getTemplate,
-      };
-    },
-  });
-</script>

+ 0 - 140
src/views/device/batchPutModal.vue

@@ -1,140 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    title="批量入库"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-    :min-height="0"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm" :model="model">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-      </BasicForm>
-      <a @click="getTemplate" style="padding: 20px 0 0 80px">下载批量入库模板</a>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  // import { sceneMove } from '/@/api/operate';
-  import { companyUploadExcel, downTemplate } from '/@/api/customer';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { downloadByData } from '/@/utils/file/download'
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const modelRef = ref({});
-      const fileFlow = reactive({
-        file: null,
-      });
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'file',
-          component: 'Upload',
-          label: t('routes.product.file'),
-          required: true,
-          rules: [{ required: true, message: t('common.uploadMessge') }],
-          // helpMessage: t('routes.corporation.uploadHelp'),
-          itemProps: {
-            validateTrigger: 'onBlur',
-          },
-          componentProps: {
-            maxNumber: 1,
-            maxSize: 5,
-            fileFlow: true,
-            accept: ['xls', 'xlsx'],
-            afterFetch: function (data) {
-              // console.log('uploadApi', data);
-              // Reflect.set(data, 'url', data.file);
-              fileFlow.file = data.file;
-              console.log(fileFlow.file);
-              return data;
-            },
-          },
-
-          colProps: {
-            span: 22,
-          },
-        },
-      ];
-      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
-        labelWidth: 120,
-        schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        // console.log(data);
-        data && onDataReceive(data);
-      });
-
-      function onDataReceive(data) {
-        modelRef.value = data;
-        resetFields();
-        setFieldsValue({
-          type: data.sceneName,
-        });
-      }
-      const handleSubmit = async () => {
-        try {
-          const params = await validate();
-          const apiData = {
-            file: fileFlow.file,
-            data:{
-              type: 0,
-            }
-          };
-          const res = await companyUploadExcel(apiData);
-          closeModal();
-          resetFields();
-          createMessage.success( res || '导入成功');
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      };
-      function handleVisibleChange(v) {
-        // console.log(v);
-        // v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      async function getTemplate() {
-        try {
-          const res:BlobPart = await downTemplate({ type: 0 });
-          console.log('downTemplate',res)
-          downloadByData(res.data,'入库模板.xlsx')
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      }
-      return {
-        register,
-        schemas,
-        registerForm,
-        model: modelRef,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-        getTemplate,
-      };
-    },
-  });
-</script>

+ 0 - 222
src/views/device/detailsMoadl.vue

@@ -1,222 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :title="title"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-    :height="800"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm" :model="model">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-import { defineComponent, ref, onMounted, reactive } from 'vue';
-import { BasicModal, useModalInner } from '/@/components/Modal';
-import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { companyList } from '/@/api/customer';
-// import { sceneMove } from '/@/api/operate';
-import { downTemplate } from '/@/api/customer';
-import { cameraParam, cameraUpdate, cameraOut } from '/@/api/device';
-import { CameraList } from '/@/api/order';
-import { useI18n } from '/@/hooks/web/useI18n';
-const { t } = useI18n();
-interface Option {
-  value: string;
-}
-
-export default defineComponent({
-  components: { BasicModal, BasicForm },
-  props: {
-    userData: { type: Object },
-  },
-  emits: ['reload'],
-  setup(_, { emit }) {
-    const modelRef = ref({
-      isUpdate:false,
-    });
-    const title = ref('设备出库');
-    const optionsOrderSn = ref<Option[]>([]);
-    const optionsName = ref<Option[]>([]);
-    const fileFlow = reactive({
-      file: null,
-    });
-    const { createMessage } = useMessage();
-    const schemas: FormSchema[] = [
-      {
-        field: 'id',
-        component: 'Input',
-        label: 'id',
-        show: false,
-      },
-      {
-        field: 'outType',
-        component: 'Select',
-        label: '出库类型',
-        required: true,
-        colProps: {
-          span: 18,
-        },
-        componentProps: {
-          options: [
-            {
-              label: t('routes.product.outType.0'),
-              value: '0',
-              key: '0',
-            },
-            {
-              label: t('routes.product.outType.1'),
-              value: '1',
-              key: '1',
-            },
-            {
-              label: t('routes.product.outType.2'),
-              value: 2,
-              key: '2',
-            },
-            {
-              label: t('routes.product.outType.3'),
-              value: '3',
-              key: '3',
-            },
-          ],
-        },
-      },
-      {
-        field: 'companyName',
-        component: 'AutoComplete',
-        label: '客户名称',
-        colProps: {
-          span: 18,
-        },
-        componentProps: {
-          filterOption: onFilterOption,
-          onSearch: async (searchText: string) => {
-            const {list} = await companyList({ companyName: searchText });
-            let optionsList = list.map((ele) => { return { ...ele,value: ele.companyName }; }) || []
-            console.log('paramList',optionsList)
-            optionsName.value = optionsList || [];
-            updateSchema({
-              field: 'companyName',
-              componentProps:{
-                options: optionsName.value,
-              },
-            })
-          },
-          onChange: (data) => {
-            console.log('data', data);
-          },
-        },
-      },
-      {
-        field: 'orderSn',
-        component: 'AutoComplete',
-        label: '订单号',
-        colProps: {
-          span: 18,
-        },
-        componentProps: {
-          options: optionsOrderSn.value,
-          filterOption: onFilterOption,
-          onSearch: async (searchText: string) => {
-            const { list } = await CameraList({ orderSn: searchText });
-            optionsOrderSn.value = !searchText ? [] : list.map((ele) => { return { value: ele.orderSn }; });
-            updateSchema({
-              field: 'orderSn',
-              componentProps:{
-                options: optionsOrderSn.value,
-              },
-            })
-          },
-          onChange: (data) => {
-            console.log('data', data);
-          },
-        },
-      },
-    ];
-    const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-      labelWidth: 120,
-      schemas,
-      showActionButtonGroup: false,
-      actionColOptions: {
-        span: 24,
-      },
-    });
-    onMounted(() => {});
-    let addListFunc = () => {};
-    const [register, { closeModal }] = useModalInner((data) => {
-      // console.log(data);
-      data && onDataReceive(data);
-    });
-
-    function onDataReceive(data) {
-      modelRef.value = data;
-      title.value = data.isUpdate?'编辑':'设备出库'
-      console.log('onDataReceive', data);
-      const { outType } = data;
-      let obj = t('routes.product.outType')
-      resetFields();
-      setFieldsValue({
-        type: obj[outType],
-        ...data,
-      });
-    }
-
-    const handleSubmit = async () => {
-      const apiUrl = modelRef.value.isUpdate?cameraUpdate:cameraOut
-      try {
-        const params = await validate();
-        console.log('params', params);
-        const res = await apiUrl(params);
-        console.log('res', res);
-        closeModal();
-        resetFields();
-        createMessage.success(t('common.optSuccess'));
-        emit('reload');
-      } catch (error) {
-        console.log('not passing', error);
-      }
-    };
-    function onFilterOption(inputText: string, option: Option) {
-      return option.value.toUpperCase().indexOf(inputText.toUpperCase()) >= 0;
-    }
-
-    function handleVisibleChange(v) {
-      // console.log(v);
-      // v && props.userData && nextTick(() => onDataReceive(props.userData));
-    }
-
-    async function getTemplate() {
-      try {
-        const res = await downTemplate({ type: 2 });
-        console.log('res', res);
-      } catch (error) {
-        console.log('not passing', error);
-      }
-    }
-    return {
-      register,
-      schemas,
-      registerForm,
-      model: modelRef,
-      title,
-      fileFlow,
-      handleVisibleChange,
-      onFilterOption,
-      handleSubmit,
-      addListFunc,
-      resetFields,
-      t,
-      getTemplate,
-    };
-  },
-});
-</script>

+ 0 - 185
src/views/device/distributeModal.vue

@@ -1,185 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :title="t('routes.retailer.device.title')"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-    :min-height="150"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm" :model="model">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-      </BasicForm>
-      <a v-if="!model.id" @click="getTemplate" style="padding: 20px 0 0 80px">{{t('routes.retailer.device.dowmTips')}}</a>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { cameraIn } from '/@/api/device';
-  import { getSubAgent, downTemplate, giveCamera, giveCameraBatch } from '/@/api/retailer';
-  import { companyUploadExcel } from '/@/api/customer';
-  import { downloadByData } from '/@/utils/file/download'
-  import { uploadApi } from '/@/api/product/index';
-  import { useI18n } from '/@/hooks/web/useI18n';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['reload'],
-    setup(_, { emit }) {
-      const modelRef = ref({});
-      const fileFlow = reactive({
-        file: null,
-        title: '设备分发',
-      });
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'id',
-          component: 'Input',
-          label: t('routes.product.types'),
-          show: false,
-          colProps: {
-            span: 24,
-          },
-        },
-        {
-          field: 'subAgentId',
-          component: 'ApiSelect',
-          label: t('routes.retailer.name'),
-          required: true,
-          colProps: {
-            span: 18,
-          },
-          componentProps: {
-            maxLength: 50,
-            style: 'width: 240px',
-            api: getSubAgent,
-            // numberToString: true,
-            labelField: 'name',
-            valueField: 'id',
-            immediate: true,
-          },
-          colProps: {
-            xl: 18,
-            xxl: 18,
-          },
-        },
-        {
-          field: 'file',
-          component: 'Upload',
-          label: t('routes.retailer.device.list'),
-          required: true,
-          rules: [{ required: true, message: t('common.uploadMessge') }],
-          // helpMessage: t('routes.corporation.uploadHelp'),
-          itemProps: {
-            validateTrigger: 'onBlur',
-          },
-          componentProps: {
-            api: uploadApi,
-            maxNumber: 1,
-            maxSize: 1000,
-            fileFlow:true,
-            accept: ['xlsx', 'xls'],
-            afterFetch: function (data) {
-              // Reflect.set(data, 'url', data.file);
-              fileFlow.file = data.file
-              return data;
-            },
-          },
-
-          colProps: {
-            span: 22,
-          },
-        },
-      ];
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: 120,
-        schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        // console.log(data);
-        data && onDataReceive(data);
-      });
-
-      function onDataReceive(data) {
-        modelRef.value = data;
-        resetFields();
-        updateSchema({
-          field: 'file',
-          show: data.id ? false : true,
-        })
-        setFieldsValue({
-          id: data.id,
-          subAgentId: data.subAgentId,
-        });
-      }
-      async function getTemplate() {
-        try {
-          const res:BlobPart = await downTemplate({ type: 0, filename:  t('routes.retailer.device.filename')+'.xlsx' });
-          console.log('downTemplate',res)
-          downloadByData(res.data)
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      }
-
-      function handleVisibleChange() {}
-
-      const handleSubmit = async () => {
-        try {
-          const params = await validate();
-          console.log('params', params);
-          if (params.id) {
-            await giveCamera(params);
-            createMessage.success(t('common.optSuccess'));
-          } else {
-            const apiData = {
-              file: fileFlow.file,
-              data: {
-                subAgentId: params.subAgentId,
-              }
-            };
-            let num = await giveCameraBatch(apiData);
-            createMessage.success(t('routes.retailer.exportText', { value: num }));
-          }
-          closeModal();
-          resetFields();
-          emit('reload');
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      };
-      return {
-        register,
-        schemas,
-        registerForm,
-        model: modelRef,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        getTemplate,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 402
src/views/device/index.vue

@@ -1,402 +0,0 @@
-<template>
-  <PageWrapper contentBackground>
-    <div class="desc-wrap-BasicTable">
-      <BasicTable @register="registerTable">
-        <template #toolbar>
-          <a-button type="primary" v-if="hasPermission([RoleEnum.SUPER])" @click="handleAdd"> {{t('routes.retailer.allff')}}</a-button>
-        </template>
-        <template #action="{ record }">
-          <TableAction
-            stopButtonPropagation
-            :actions="[
-              {
-                label: t('routes.retailer.ff'),
-                ifShow: !record.subAgentName,
-                //icon: 'la:file-invoice-dollar',
-                onClick: headleDetails.bind(null, record),
-              },
-              {
-                label: t('routes.retailer.Unbind'),
-                ifShow: !!record.subAgentName,
-                //icon: 'la:file-invoice-dollar',
-                onClick: headleUnbind.bind(null, record),
-              },
-            ]"
-          />
-        </template>
-      </BasicTable>
-    </div>
-    <distributeModal @reload="reload" @register="registerAddModal" />
-  </PageWrapper>
-</template>
-<script lang="ts">
-  import { defineComponent, h, onMounted, computed } from 'vue';
-  import {
-    BasicTable,
-    useTable,
-    TableAction,
-    BasicColumn,
-    TableImg,
-    FormProps,
-  } from '/@/components/Table';
-  import { usePermission } from '/@/hooks/web/usePermission';
-  import { RoleEnum } from '/@/enums/roleEnum';
-  import { PageWrapper } from '/@/components/Page';
-  import { Descriptions } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { cameraList } from '/@/api/customer';
-  import { cameraDelete } from '/@/api/device';
-  import { useModal } from '/@/components/Modal';
-  import { getSubAgent } from '/@/api/retailer';
-  import { useRouter } from 'vue-router';
-  import { UnbindCameraApi } from '/@/api/account';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  import { useLocaleStore } from '/@/store/modules/locale';
-  import { dincrementList } from '/@/api/equity';
-  import { useUserStore } from '/@/store/modules/user';
-  import distributeModal from './distributeModal.vue';
-  export default defineComponent({
-    components: {
-      BasicTable,
-      TableAction,
-      PageWrapper,
-      TableImg,
-      distributeModal,
-      [Descriptions.name]: Descriptions,
-      [Descriptions.Item.name]: Descriptions.Item,
-    },
-    setup() {
-      const { t } = useI18n();
-      const userStore = useUserStore();
-      const getUserInfo = userStore.getUserInfo;
-      const { hasPermission } = usePermission();
-      const { createMessage, createConfirm } = useMessage();
-      const permissionStore = usePermissionStore();
-      const { getCheckPerm } = permissionStore;
-      const router = useRouter();
-      const localeStore = useLocaleStore();
-      const isEn = computed(() => localeStore.getLocale === 'en');
-      const companyId: Number = router.currentRoute.value.params.id - 0;
-      const [registerAddModal, { openModal }] = useModal();
-      onMounted(() => {
-        // console.log(router.currentRoute.value.params.id);
-      });
-      const columns: BasicColumn[] = [
-        {
-          title: t('routes.device.snCode'),
-          dataIndex: 'snCode',
-          width: 180,
-        },
-        {
-          title: t('routes.device.wifiName'),
-          dataIndex: 'wifiName',
-          width: 150,
-        },
-        {
-          title: t('routes.device.deviceType'),
-          dataIndex: 'type',
-          ellipsis: false,
-          width: 100,
-          customRender: ({ record }) => {
-            let typeObj = {
-              '0': t('routes.device.type.0'),
-              '1': t('routes.device.type.1'),
-              '2': t('routes.device.type.2'),
-              '9': t('routes.device.type.9'),
-              '10': t('routes.device.type.10'),
-              '11': t('routes.device.type.11'),
-            };
-            return typeObj[record.type];
-          },
-        },
-
-        {
-          title: t('routes.device.activatedTime'),
-          dataIndex: 'activatedTime',
-          width: 180,
-        },
-        {
-          title: t('routes.retailer.fxs'),
-          dataIndex: 'subAgentName',
-          ellipsis: true,
-          width: 160,
-          ifShow: hasPermission([RoleEnum.SUPER]),
-          customRender({ record }) {
-            return record.subAgentName || '-';
-          }
-        },
-        {
-          title: t('routes.equity.Type'),
-          dataIndex: 'validTimeType',
-          width: 180,
-          customRender({ record }) {
-            return record.validTimeType == 0
-              ? t('routes.equity.equityType.0')
-              : record.validTimeType == 1
-              ? t('routes.equity.equityType.3')
-              : t('routes.device.NoBind');
-          },
-        },
-        {
-          title: t('routes.device.statusName'),
-          dataIndex: 'incrementStatus',
-          customRender({ record }) {
-            if (record.incrementStatus == -1) {
-              return '-';
-            } else {
-              return record.incrementStatus == 0
-                ? t('routes.device.status.0')
-                : t('routes.device.status.1');
-            }
-          },
-          width: 180,
-        },
-        {
-          title: t('routes.device.userName'),
-          dataIndex: 'userName',
-          width: 180,
-          customRender({ record }) {
-            return record.userName ? record.userName : '-';
-          },
-        },
-      ];
-      const searchForm: Partial<FormProps> = {
-        labelWidth: 120,
-        autoAdvancedLine: 1,
-        actionColOptions: {
-          span: 24,
-        },
-        schemas: [
-          {
-            field: 'snCode',
-            component: 'Input',
-            label: t('routes.device.snCode'),
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-          },
-          {
-            field: 'type',
-            component: 'Select',
-            label: t('routes.device.deviceType'),
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-            componentProps: {
-              options: [
-                {
-                  //   label: t('routes.device.type.0'),
-                  //   value: 0,
-                  //   key: '0',
-                  // },{
-                  label: t('routes.device.type.1'),
-                  value: 1,
-                  key: '1',
-                },
-                {
-                  label: t('routes.device.type.2'),
-                  value: 9,
-                  key: '9',
-                },
-                {
-                  label: t('routes.device.type.3'),
-                  value: 10,
-                  key: '10',
-                },
-                {
-                  label: t('routes.device.type.11'),
-                  value: 11,
-                  key: '11',
-                },
-              ],
-            },
-          },
-          {
-            field: 'userName',
-            component: 'Input',
-            label: t('routes.device.userName'),
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-          },
-          {
-            field: 'incrementTypeId',
-            component: 'ApiSelect',
-            label: t('routes.equity.Type'),
-            componentProps: {
-              maxLength: 50,
-              api: async function () {
-                const list = await dincrementList();
-                return list.map((ele) => {
-                  return {
-                    name: t(`routes.finance.equityType.${ele.validTimeType}`),
-                    value: ele.id,
-                  };
-                });
-              },
-              numberToString: true,
-              labelField: 'name',
-              valueField: 'value',
-              immediate: true,
-            },
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-          },
-          {
-            field: 'incrementStatus',
-            component: 'Select',
-            label: t('routes.device.statusName'),
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-            componentProps: {
-              options: [
-                {
-                  label: t('routes.device.status.0'),
-                  value: '0',
-                  key: '0',
-                },
-                {
-                  label: t('routes.device.status.1'),
-                  value: '1',
-                  key: '1',
-                },
-              ],
-            },
-          },
-          {
-            field: 'bindStatus',
-            component: 'Select',
-            label: t('routes.device.bindStatus'),
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-            componentProps: {
-              options: [
-                {
-                  label: t('routes.device.status.2'),
-                  value: '1',
-                  key: '1',
-                },
-                {
-                  label: t('routes.device.status.3'),
-                  value: '0',
-                  key: '0',
-                },
-              ],
-            },
-          },
-          {
-            field: 'subAgentId',
-            component: 'ApiSelect',
-            ifShow: hasPermission([RoleEnum.SUPER]),
-            label: t('routes.device.subAgentName'),
-            componentProps: {
-              maxLength: 50,
-              api: getSubAgent,
-              numberToString: true,
-              labelField: 'name',
-              valueField: 'id',
-              immediate: true,
-              style: { maxWidth: '430px' },
-            },
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-          },
-        ],
-      };
-      const [registerTable, { reload }] = useTable({
-        api: cameraList,
-        columns: columns,
-        searchInfo: { companyId },
-        useSearchForm: true,
-        formConfig: searchForm,
-        showTableSetting: true,
-        showIndexColumn: false,
-        rowKey: 'id',
-        beforeFetch: (T) => {
-          if (T.ctivated) {
-            T.activatedStartTime = T.ctivated[0];
-            T.activatedEndTime = T.ctivated[1];
-          }
-          return T;
-        },
-        fetchSetting: {
-          pageField: 'pageNum',
-          sizeField: 'pageSize',
-          listField: 'list',
-          totalField: 'total',
-        },
-        actionColumn: {
-          width: 150,
-          title: t('common.operating'),
-          ifShow: hasPermission([RoleEnum.SUPER]),
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-        },
-        canResize: false,
-      });
-      async function headleUnbind(record: Recordable) {
-        createConfirm({
-          iconType: 'warning',
-          title: () => h('span', t('common.reminder')),
-          content: t('routes.retailer.UnbindTips'),
-          onOk: async () => {
-            await UnbindCameraApi({ id: record.id });
-            createMessage.success(t('common.optSuccess'));
-            reload();
-          },
-        });
-      }
-      async function handleDelete(record: Recordable) {
-        createConfirm({
-          iconType: 'warning',
-          title: () => h('span', t('common.reminder')),
-          content: '删除设备后需要重新入库<br/>确定删除吗?',
-          onOk: async () => {
-            await cameraDelete({ id: record.id });
-            createMessage.success(t('common.optSuccess'));
-            reload();
-          },
-        });
-      }
-      function handleAdd() {
-        openModal(true, {});
-      }
-      function headleDetails(record: Recordable) {
-        openModal(true, record);
-      }
-      return {
-        registerTable,
-        headleUnbind,
-        reload,
-        handleDelete,
-        getCheckPerm,
-        handleAdd,
-        headleDetails,
-        registerAddModal,
-        hasPermission,
-        RoleEnum,
-        t,
-      };
-    },
-  });
-</script>
-<style lang="less" scoped>
-  .desc-wrap-BasicTable {
-    background-color: #f0f2f5;
-    .vben-basic-table-form-container {
-      padding: 0;
-    }
-  }
-</style>

+ 0 - 126
src/views/device/putModal.vue

@@ -1,126 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    title="设备入库"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-    :min-height="0"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm" :model="model">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { cameraIn } from '/@/api/device'
-  import { companyUploadExcel, downTemplate } from '/@/api/customer';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['reload',],
-    setup(_, { emit }) {
-      const modelRef = ref({});
-      const fileFlow = reactive({
-        file: null,
-      });
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'wifiName',
-          component: 'Input',
-          label: 'wifi名称',
-          colProps: {
-            span: 18,
-          },
-          helpMessage:'wifi名称需包含前缀,如“4DKKPRO_”、“4DKKMI_”、“4DSS_”、“4DKK_”。',
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                // var reg = /\S+@\S+\.\S+/;
-                if (!value) {
-                  return Promise.reject('请输入wifi名称');
-                }
-                var list:string[] = ['4DKKPRO_','4DKKMI_','4DSS_','4DKK_'];
-                const some = list.some(item=>{
-                  return value.indexOf(item) != -1
-                })
-                console.log('validator',some)
-                if(!some){
-                  return Promise.reject('wifi名称需包含前缀,如“4DKKPRO_”、“4DKKMI_”、“4DSS_”、“4DKK_”。');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-        }
-      ];
-      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
-        labelWidth: 120,
-        schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        // console.log(data);
-        data && onDataReceive(data);
-      });
-
-      function onDataReceive(data) {
-        modelRef.value = data;
-        resetFields();
-        setFieldsValue({
-          type: data.sceneName,
-        });
-      }
-      function handleVisibleChange() {
-
-      }
-
-      const handleSubmit = async () => {
-        try {
-          const params = await validate();
-          await cameraIn(params);
-          closeModal();
-          resetFields();
-          createMessage.success(t('common.optSuccess'));
-          emit('reload');
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      };
-      return {
-        register,
-        schemas,
-        registerForm,
-        model: modelRef,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 170
src/views/equity/DownModal.vue

@@ -1,170 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :title="t('routes.equity.addDowm')"
-    height="500"
-    width="550px"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-        <template #img="{ model }">
-          <TableImg
-            v-if="model.invoiceUrl"
-            :size="200"
-            :adaptations="true"
-            :simpleShow="true"
-            :imgList="[model.invoiceUrl]"
-          />
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive, computed } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { TableImg } from '/@/components/Table';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceRegister, InvoiceDetail } from '/@/api/order';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi } from '/@/api/product/index';
-  import { ResultEnum } from '/@/enums/httpEnum';
-  import dayjs from 'dayjs';
-  import { checkjxsUserName, addDowm } from '/@/api/equity';
-  import { useUserStore } from '/@/store/modules/user';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm, TableImg },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const fileFlow = reactive({
-        file: null,
-        type: 2, //2-普通发票,3-专用发票
-      });
-      const userStore = useUserStore();
-      const agent = computed(() => userStore.getAgent);
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'userName',
-          component: 'Input',
-          label: t('routes.equity.userName'),
-          required: true,
-          itemProps: {
-            autoLink: false, // 添加该属性即可解决多触发一次 validator,value 为空值 
-          },
-          componentProps: {
-            autoComplete: 'off',
-            // readonly:preventAutoFill.value
-          },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                console.log('value', value);
-                // const regEmail = /^(.+)@(.+)$/;
-                // const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
-                if (!value) {
-                  return Promise.reject(t('routes.equity.rules.userName'));
-                }
-                // if (!(regPos.test(value) || regEmail.test(value))) {
-                //   /* eslint-disable-next-line */
-                //     return Promise.reject(t('routes.equity.rules.userName1'));
-                // }
-                const res = await checkjxsUserName({ userName: value });
-                if (!res) {
-                  return Promise.reject(t('routes.equity.rules.userName2'));
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-          colProps: {
-            span: 16,
-          },
-        },
-        {
-          field: 'count',
-          component: 'InputNumber',
-          label: t('routes.equity.addcount'),
-          required: true,
-          suffix: `${t('routes.equity.syks')} ${agent.value.downSubNum} ${t(
-            'routes.equity.unit.2',
-          )}`,
-          // defaultValue:1,
-          componentProps: {
-            max: agent.value.downSubNum,
-            min: 1,
-          },
-          colProps: {
-            span: 23,
-          },
-        },
-      ];
-
-      const [registerForm, { validate, resetFields, updateSchema }] = useForm({
-        labelWidth: 120,
-        schemas: schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        resetFields();
-        updateSchema([
-          {
-            field: 'count',
-            suffix: `${t('routes.equity.syks')} ${agent.value.downSubNum} ${t(
-              'routes.equity.unit.2',
-            )}`,
-            componentProps: {
-              max: agent.value.downSubNum,
-              min: 1,
-            },
-          },
-        ]);
-        // data && onDataReceive(data);
-      });
-      async function onDataReceive() {
-        resetFields();
-      }
-      const handleSubmit = async () => {
-        const values = await validate();
-        const res = await addDowm(values);
-        console.log('res', res);
-        closeModal();
-        emit('update', true);
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      return {
-        register,
-        registerForm,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 207
src/views/equity/EditModal.vue

@@ -1,207 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :title="t('routes.equity.renew')"
-    height="500"
-    width="600"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-        <template #img="{ model }">
-          <TableImg
-            v-if="model.invoiceUrl"
-            :size="200"
-            :adaptations="true"
-            :simpleShow="true"
-            :imgList="[model.invoiceUrl]"
-          />
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive, computed } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { TableImg } from '/@/components/Table';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceRegister, InvoiceDetail } from '/@/api/order';
-  import { useUserStore } from '/@/store/modules/user';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { renewApi } from '/@/api/equity/index';
-  import dayjs from 'dayjs';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm, TableImg },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const fileFlow = reactive({
-        file: null,
-        type: 2, //2-普通发票,3-专用发票
-        validTimeType: 0,
-        incrementEndTime: '',
-        isExpired: 0,
-      });
-      const { createMessage } = useMessage();
-      const userStore = useUserStore();
-      const agent = computed(() => userStore.getAgent);
-      const schemas: FormSchema[] = [
-        {
-          field: 'userName',
-          component: 'Input',
-          label: t('routes.equity.userName'),
-          slot: 'text',
-          colProps: {
-            span: 24,
-          },
-        },
-        {
-          field: 'id',
-          component: 'Input',
-          label: t('routes.equity.id'),
-          slot: 'text',
-          colProps: {
-            span: 24,
-          },
-        },
-        {
-          field: 'totalTime',
-          component: 'Select',
-          label: t('routes.equity.totalTime'),
-          required: true,
-          suffix: `${t('routes.equity.syks')} ${agent.value.majorSubNum} ${t(
-            'routes.equity.unit.1',
-          )}`,
-          itemProps: {
-            validateTrigger: 'onBlur',
-          },
-          componentProps: {
-            options: [],
-            listHeight: 150,
-            allowClear: false,
-            onChange: (value) => {
-              setFieldsValue({
-                incrementEndTime: 
-                dayjs(fileFlow.incrementEndTime || new Date()).add(value, fileFlow.validTimeType == 0 ? 'year' : 'month')
-                  .format('YYYY-MM-DD'),
-              });
-            },
-          },
-          colProps: {
-            span: 18,
-          },
-        },
-        {
-          field: 'incrementEndTime',
-          component: 'DatePicker',
-          label: t('routes.equity.expiryTime'),
-          required: true,
-          defaultValue: dayjs().add(1, 'year').format('YYYY-MM-DD'),
-          componentProps: {
-            disabled: true,
-            valueFormat: 'YYYY-MM-DD',
-            format: 'YYYY-MM-DD',
-            disabledDate: (current) => {
-              return current && current < dayjs().endOf('day');
-            },
-          },
-          colProps: {
-            span: 22,
-          },
-        },
-      ];
-
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: 120,
-        schemas: schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        data && onDataReceive(data);
-      });
-      async function onDataReceive(data) {
-        resetFields();
-        // let detail = await InvoiceDetail({id:data.id})
-        fileFlow.type = data.type;
-        fileFlow.validTimeType = data.validTimeType;
-        fileFlow.isExpired = data.isExpired;
-        fileFlow.incrementEndTime = dayjs(data.isExpired == 1 ? new Date() : data.incrementEndTime).format('YYYY-MM-DD')
-        console.log('data', data, fileFlow.incrementEndTime);
-        updateSchema([
-          {
-            field: 'totalTime',
-            suffix: `${t('routes.equity.syks')} ${
-              data.validTimeType == 1 ? agent.value.highSubNum : agent.value.majorSubNum
-            } ${data.validTimeType == 1 ? t('routes.equity.unit.-2') : t('routes.equity.unit.-1')}`,
-            componentProps: {
-              options: timeOption(data.validTimeType),
-            },
-          },
-        ]);
-        setFieldsValue({
-          ...data,
-          incrementEndTime: dayjs(fileFlow.incrementEndTime).add(1, data.validTimeType == 0 ? 'year' : 'month')
-            .format('YYYY-MM-DD'),
-        });
-      }
-      function timeOption(incrementTypeId) {
-        let list = [];
-        let timeVal = incrementTypeId == 1 ? agent.value.highSubNum : agent.value.majorSubNum;
-        let value = 10,
-          unit = t('routes.equity.unit.-1');
-        if (incrementTypeId == 1) {
-          //高级会员月
-          value = timeVal > 12 ? 12 : timeVal;
-          unit = t('routes.equity.unit.-3');
-        } else {
-          value = timeVal > 10 ? 10 : timeVal;
-        }
-        for (let index = 1; index <= value; index++) {
-          list.push({
-            label: index + unit,
-            value: index,
-            key: index,
-          });
-        }
-        return list;
-      }
-      const handleSubmit = async () => {
-        const params = await validate();
-        await renewApi(params);
-        createMessage.success(t('common.optSuccess'));
-        closeModal();
-        emit('update', true);
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      return {
-        register,
-        registerForm,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 339
src/views/equity/InvoiceModal.vue

@@ -1,339 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :title="t('routes.equity.add')"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    width="550px"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }"> {{ model[field] }}{{ fileFlow.type }} </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive, computed } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { dincrementList, checkjxsUserName, addApi } from '/@/api/equity';
-  import { useUserStore } from '/@/store/modules/user';
-  import dayjs from 'dayjs';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const fileFlow = reactive({
-        file: null,
-        type: 2, //2-普通发票,3-专用发票
-        validTimeType: 0,
-      });
-      const userStore = useUserStore();
-      const { createMessage } = useMessage();
-      const agent = computed(() => userStore.getAgent);
-      const schemas: FormSchema[] = [
-        {
-          field: 'userName',
-          component: 'Input',
-          label: t('routes.equity.userName'),
-          required: true,
-          componentProps: {
-            autoComplete: 'off',
-            style: 'width:200px',
-            // readonly:preventAutoFill.value
-          },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                // const regEmail = /^(.+)@(.+)$/;
-                // const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
-                if (!value) {
-                  return Promise.reject(t('routes.equity.rules.userName'));
-                }
-                // if (!(regPos.test(value) || regEmail.test(value))) {
-                //   /* eslint-disable-next-line */
-                // return Promise.reject(t('routes.equity.rules.userName1'));
-                // }
-                // useThrottleFn(handleSplitLeftMenu, 50);
-                const res = await checkjxsUserName({ userName: value });
-                //await checkUserName({userName:value})
-                // useThrottleFn(,50)()
-                console.log('validator', res);
-                if (!res) {
-                  return Promise.reject(t('routes.equity.rules.userName2'));
-                }
-                return Promise.resolve();
-              },
-              trigger: 'blur',
-            },
-          ],
-          colProps: {
-            span: 19,
-          },
-        },
-        {
-          field: 'incrementTypeId',
-          component: 'ApiSelect',
-          label: t('routes.equity.Type'),
-          required: true,
-          componentProps: {
-            maxLength: 50,
-            style: 'width:200px',
-            api: async function () {
-              const list = await dincrementList();
-              return list.map((ele) => {
-                return { name: t(`routes.finance.equityType.${ele.validTimeType}`), value: ele.id, key: ele.id };
-              });
-            },
-            numberToString: true,
-            labelField: 'name',
-            valueField: 'value',
-            immediate: true,
-            params: {
-              agentName: '',
-            },
-            onChange: (value) => {
-              let { count = 1 } = getFieldsValue();
-              let totalTime = 1
-              updateSchema([
-                {
-                  field: 'incrementTypeId',
-                  suffix: `${t('routes.equity.syks')} ${
-                    value == 3 ? agent.value.highSubNum : agent.value.majorSubNum
-                  } ${value == 3 ? t('routes.equity.unit.-2') : t('routes.equity.unit.-1')}`,
-                },
-                {
-                  field: 'count',
-                  componentProps: {
-                    max: value == 3 ? agent.value.highSubNum : agent.value.majorSubNum,
-                    min: 1,
-                  },
-                },
-                {
-                  field: 'totalTime',
-                  suffix:
-                    totalTime && count
-                      ? `${t('routes.equity.jjxs')} ${totalTime * count} ${
-                          value == 3 ? t('routes.equity.unit.-2') : t('routes.equity.unit.-1')
-                        }`
-                      : '',
-                  componentProps: {
-                    options: timeOption(value),
-                  },
-                },
-              ]);
-              setFieldsValue({
-                count: 1,
-                totalTime: 1,
-                incrementEndTime: dayjs()
-                  .add(totalTime ? totalTime : 1, value != '3' ? 'year' : 'month')
-                  .format('YYYY-MM-DD'),
-              });
-            },
-          },
-          colProps: {
-            span: 23,
-          },
-        },
-        {
-          field: 'count',
-          component: 'InputNumber',
-          label: t('routes.equity.countNumber'),
-          required: true,
-          // suffix:`${t('routes.equity.syks')} ${agent.value.majorSubNum} ${t('routes.equity.unit.1')}`,
-          defaultValue: 1,
-          itemProps: {
-            validateTrigger: 'change',
-          },
-          componentProps: {
-            max: agent.value.majorSubNum,
-            min: 1,
-            onChange: (value) => {
-              let { incrementTypeId, totalTime } = getFieldsValue();
-              updateSchema([
-                {
-                  field: 'totalTime',
-                  suffix:
-                    totalTime && value
-                      ? `${t('routes.equity.jjxs')} ${value * totalTime} ${
-                          incrementTypeId == 3
-                            ? t('routes.equity.unit.-2')
-                            : t('routes.equity.unit.-1')
-                        }`
-                      : '',
-                },
-              ]);
-            },
-          },
-          colProps: {
-            span: 24,
-          },
-        },
-        {
-          field: 'totalTime',
-          component: 'Select',
-          label: t('routes.equity.totalTime'),
-          required: true,
-          itemProps: {
-            validateTrigger: 'change',
-          },
-          componentProps: {
-            options: [],
-            listHeight: 150,
-            style: 'width:200px',
-            allowClear: false,
-            onChange: (value) => {
-              let { incrementTypeId, count = 1 } = getFieldsValue();
-
-              updateSchema([
-                {
-                  field: 'totalTime',
-                  suffix:
-                    value && count
-                      ? `${t('routes.equity.jjxs')} ${value * count} ${
-                          incrementTypeId == 3
-                            ? t('routes.equity.unit.-2')
-                            : t('routes.equity.unit.-1')
-                        }`
-                      : '',
-                },
-              ]);
-              setFieldsValue({
-                incrementEndTime: dayjs(fileFlow.incrementEndTime || new Date())
-                  .add(value, incrementTypeId != 3 ? 'year' : 'month')
-                  .format('YYYY-MM-DD'),
-              });
-            },
-          },
-          colProps: {
-            span: 23,
-          },
-        },
-        {
-          field: 'incrementEndTime',
-          component: 'DatePicker',
-          label: t('routes.equity.expiryTime'),
-          required: true,
-          defaultValue: dayjs().add(1, 'year').format('YYYY-MM-DD'),
-          componentProps: {
-            disabled: true,
-            valueFormat: 'YYYY-MM-DD',
-            format: 'YYYY-MM-DD',
-            disabledDate: (current) => {
-              return current && current < dayjs().endOf('day');
-            },
-          },
-          colProps: {
-            span: 24,
-          },
-        },
-      ];
-
-      const [
-        registerForm,
-        { validate, resetFields, setFieldsValue, updateSchema, getFieldsValue },
-      ] = useForm({
-        labelWidth: 120,
-        schemas: schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        data && onDataReceive(data);
-      });
-
-      function onDataReceive(data) {
-        resetFields();
-        console.log('validTimeType', data);
-        fileFlow.type = data.type;
-        fileFlow.validTimeType = data.validTimeType;
-        setFieldsValue(data);
-        updateSchema([
-          { field: 'shipNum', ifShow: fileFlow.type == 3 },
-          { field: 'email', ifShow: fileFlow.type == 2 },
-          { field: 'file', ifShow: fileFlow.type == 2 },
-          { field: 'incrementTypeId', suffix: '' },
-          { field: 'totalTime', suffix: '' },
-          {
-            field: 'count',
-            componentProps: {
-              max: agent.value.majorSubNum,
-              min: 1,
-            },
-          },
-        ]);
-      }
-      const handleSubmit = async () => {
-        // try {
-        validate();
-        const params = await validate();
-        console.log('params', params);
-        let timeVal =
-          params.incrementTypeId == 3 ? agent.value.highSubNum : agent.value.majorSubNum;
-        if (params.count * params.totalTime > timeVal) {
-          createMessage.error(t('routes.equity.totalMessge'));
-          return;
-        }
-        await addApi(params);
-        closeModal();
-        resetFields();
-        createMessage.success(t('common.optSuccess'));
-        emit('update', true);
-        // } catch (error) {
-        //   console.log('not passing', error);
-        // }
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      function timeOption(incrementTypeId) {
-        let list = [];
-        let timeVal = incrementTypeId == 3 ? agent.value.highSubNum : agent.value.majorSubNum;
-        let value = 10,
-          unit = t('routes.equity.unit.-1');
-        if (incrementTypeId == 3) {
-          //高级会员月
-          value = timeVal > 12 ? 12 : timeVal;
-          unit = t('routes.equity.unit.-3');
-        } else {
-          value = timeVal > 10 ? 10 : timeVal;
-        }
-        for (let index = 1; index <= value; index++) {
-          list.push({
-            label: index + unit,
-            value: index,
-            key: index,
-          });
-        }
-        return list;
-      }
-      return {
-        register,
-        registerForm,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        timeOption,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 247
src/views/equity/data.tsx

@@ -1,247 +0,0 @@
-import { Time } from '/@/components/Time';
-import { FormProps, BasicColumn } from '/@/components/Table';
-import { h, computed } from 'vue';
-import { FormSchema } from '/@/components/Form/index';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { useLocaleStore } from '/@/store/modules/locale';
-const { t } = useI18n();
-const localeStore = useLocaleStore();
-const isEn = computed(() => localeStore.getLocale === 'en');
-
-import { dincrementList } from '/@/api/equity';
-export const columnsDown: BasicColumn[] = [
-  {
-    title: t('routes.equity.count'),
-    dataIndex: 'userName',
-  },
-  {
-    title: t('routes.equity.dowmCount'),
-    dataIndex: 'count',
-    // slots: { customRender: 'orderStatus' },
-  },
-  {
-    title: t('routes.equity.timeList'),
-    dataIndex: 'createTime',
-    // slots: { customRender: 'orderStatus' },
-  },
-];
-export const columns: BasicColumn[] = [
-  {
-    title: t('routes.equity.id'),
-    dataIndex: 'id',
-    ellipsis: false,
-    width: 180,
-  },
-  {
-    title: t('routes.equity.userName'),
-    dataIndex: 'userName',
-    ellipsis: false,
-    width: 180,
-  },
-  {
-    title: t('routes.equity.Type'),
-    dataIndex: 'incrementTypeId',
-    width: 120,
-    customRender: ({ record }) => {
-      return t(`routes.equity.equityType.${record.incrementTypeId}`);
-    },
-  },
-  {
-    title: t('routes.equity.time'),
-    dataIndex: 'incrementStartTime',
-    width: 150,
-    customRender: ({ record }) => {
-      return (
-        record.incrementStartTime &&
-        h(Time, {
-          value: record.incrementStartTime,
-          mode: 'datetime',
-        })
-      );
-    },
-  },
-  {
-    title: t('routes.equity.expiryTime'),
-    dataIndex: 'incrementEndTime',
-    width: 150,
-    customRender: ({ record }) => {
-      return (
-        record.incrementEndTime &&
-        h(Time, {
-          value: record.incrementEndTime,
-          mode: 'datetime',
-        })
-      );
-    },
-  },
-  {
-    title: t('routes.equity.newTime'),
-    dataIndex: 'invoiceTime',
-    width: 150,
-    customRender: ({ record }) => {
-      return (
-        record.updateTime &&
-        h(Time, {
-          value: record.updateTime,
-          mode: 'datetime',
-        })
-      );
-    },
-  },
-];
-export const searchForm: Partial<FormProps> = {
-  labelWidth: 100,
-  schemas: [
-    {
-      field: 'id',
-      label: t('routes.equity.id'),
-      component: 'Input',
-      componentProps: {
-        maxLength: 100,
-      },
-      colProps: {
-        xl: 6,
-        xxl: 6,
-      },
-      rules: [
-        {
-          required: false,
-          // @ts-ignore
-          validator: async (rule, value) => {
-            // var reg = /\S+@\S+\.\S+/;
-            const regPos = /^[0-9]*$/;
-            if (!value) {
-              return Promise.resolve();
-            }
-            if (!regPos.test(value)) {
-              /* eslint-disable-next-line */
-              return Promise.reject(t('routes.equity.rules.id'));
-            }
-            return Promise.resolve();
-          },
-          trigger: 'change',
-        },
-      ],
-    },
-    {
-      field: 'userName',
-      label: t('routes.equity.userName'),
-      component: 'Input',
-      componentProps: {
-        maxLength: 100,
-      },
-      colProps: {
-        xl: 6,
-        xxl: 6,
-      },
-    },
-    {
-      field: 'incrementTypeId',
-      component: 'ApiSelect',
-      label: t('routes.equity.Type'),
-      colProps: {
-        xl: 6,
-        xxl: 6,
-      },
-      componentProps: {
-        maxLength: 50,
-        api: async function () {
-          const list = await dincrementList();
-          return list.map((ele) => {
-            return { name: t(`routes.finance.equityType.${ele.validTimeType}`), value: ele.id };
-          });
-        },
-        numberToString: true,
-        labelField: 'name',
-        valueField: 'value',
-        immediate: true,
-      },
-    },
-  ],
-};
-export const DownSchemas: Partial<FormProps> = {
-  labelWidth: isEn.value ? 125 : 100,
-  schemas: [
-    {
-      field: 'userName',
-      label: t('routes.equity.userName'),
-      component: 'Input',
-      componentProps: {
-        maxLength: 100,
-      },
-      colProps: {
-        xl: 6,
-        xxl: 6,
-      },
-    },
-    {
-      field: 'timeList',
-      label: t('routes.equity.timeList'),
-      component: 'RangePicker',
-      componentProps: {
-        maxLength: 100,
-        valueFormat: 'YYYY-MM-DD',
-        format: 'YYYY-MM-DD',
-      },
-      colProps: {
-        xl: 7,
-        xxl: 7,
-      },
-    },
-  ],
-};
-export const InvoiceSchemas: FormSchema[] = [
-  {
-    field: 'type',
-    component: 'Input',
-    label: t('routes.product.types'),
-    slot: 'text',
-    colProps: {
-      span: 24,
-    },
-  },
-  {
-    field: 'version',
-    component: 'Input',
-    label: t('routes.product.version'),
-    required: true,
-    colProps: {
-      span: 24,
-    },
-    rules: [
-      {
-        required: true,
-        // @ts-ignore
-        validator: async (rule, value) => {
-          if (!value) {
-            return Promise.reject(t('common.inputText') + t('routes.product.version'));
-          }
-          if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
-            /* eslint-disable-next-line */
-            return Promise.reject('不支持中文字符');
-          }
-          return Promise.resolve();
-        },
-        trigger: 'change',
-      },
-    ],
-    componentProps: {
-      maxLength: 15,
-      onChange: (data) => {
-        console.log('data', data);
-      },
-    },
-  },
-  {
-    field: 'description',
-    component: 'InputTextArea',
-    required: true,
-    label: t('routes.product.description'),
-    componentProps: {
-      rows: 4,
-    },
-    colProps: {
-      span: 24,
-    },
-  },
-];

+ 0 - 195
src/views/equity/index.vue

@@ -1,195 +0,0 @@
-<template>
-  <PageWrapper contentBackground>
-    <template #footer>
-      <a-tabs v-model:activeKey="incrementTypeId" @change="changeTable">
-        <a-tab-pane :key="0" :tab="t('routes.equity.incrementType.0')" />
-        <a-tab-pane :key="1" :tab="t('routes.equity.incrementType.1')" />
-      </a-tabs>
-    </template>
-
-    <div class="desc-wrap-BasicTable">
-      <BasicTable v-if="!incrementTypeId" @register="registerTable">
-        <template #toolbar>
-          <a-button type="primary" @click="handleInvoice"> {{ t('routes.equity.add') }}</a-button>
-        </template>
-        <template #action="{ record }">
-          <TableAction
-            stopButtonPropagation
-            :actions="[
-              {
-                label: t('routes.equity.renew'),
-                //icon: 'la:file-invoice-dollar',
-                onClick: headleDetails.bind(null, record),
-              },
-            ]"
-          />
-        </template>
-      </BasicTable>
-      <BasicTable v-else @register="registerDownTable">
-        <template #toolbar>
-          <a-button type="primary" @click="handleInvoice">
-            {{ t('routes.equity.addDowm') }}</a-button
-          >
-        </template>
-      </BasicTable>
-    </div>
-    <AddModal @update="reload" @register="registerAddModal" />
-    <EditModal @register="registerEditModal" @update="reload" />
-    <DownModal @register="registerDownModal" @update="reload" />
-  </PageWrapper>
-</template>
-<script lang="ts">
-  import { defineComponent, reactive, ref, computed } from 'vue';
-  import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
-  import { PageWrapper } from '/@/components/Page';
-  import { useModal } from '/@/components/Modal';
-  import { Descriptions, Tabs } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { listApi, dowmListApi } from '/@/api/equity';
-  import { useUserStore } from '/@/store/modules/user';
-  import { searchForm, columns, columnsDown, DownSchemas } from './data';
-  import AddModal from './InvoiceModal.vue';
-  import EditModal from './EditModal.vue';
-  import DownModal from './DownModal.vue';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  interface apiDataParam {
-    orderSn?: string;
-    payTimeStart?: string;
-    payTimeEnd?: string;
-    invoiceTimeStart?: string;
-    invoiceTimeEnd?: string;
-    orderBy?: string;
-    sortBy?: string;
-  }
-  export default defineComponent({
-    components: {
-      AddModal,
-      EditModal,
-      DownModal,
-      BasicTable,
-      TableAction,
-      PageWrapper,
-      TableImg,
-      [Descriptions.name]: Descriptions,
-      [Descriptions.Item.name]: Descriptions.Item,
-      [Tabs.name]: Tabs,
-      [Tabs.TabPane.name]: Tabs.TabPane,
-    },
-    setup() {
-      const { t } = useI18n();
-      const userStore = useUserStore();
-      const permissionStore = usePermissionStore();
-      const { getUserInfoAction } = userStore;
-      const agent = computed(() => userStore.getAgent);
-      const { getCheckPerm } = permissionStore;
-      const incrementTypeId = ref<number>(0); //0看看 、1看见、2深时
-      const apiData = reactive<apiDataParam>({
-        orderSn: '',
-        payTimeStart: '',
-        payTimeEnd: '',
-        invoiceTimeStart: '',
-        invoiceTimeEnd: '',
-        orderBy: '',
-        sortBy: '',
-      });
-      const [registerAddModal, { openModal: openAddModal }] = useModal();
-      const [registerDownModal, { openModal: openDownModal }] = useModal();
-      const [registerEditModal, { openModal: openEditModal }] = useModal();
-      const [registerTable, { reload: reloadEqiuty }] = useTable({
-        api: listApi,
-        title: '',
-        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
-        columns: columns,
-        useSearchForm: true,
-        formConfig: searchForm,
-        showTableSetting: true,
-        showIndexColumn: false,
-        // searchInfo: { incrementTypeId:0 },
-        rowKey: 'id',
-        fetchSetting: {
-          pageField: 'pageNum',
-          sizeField: 'pageSize',
-          listField: 'list',
-          totalField: 'total',
-        },
-        actionColumn: {
-          width: 100,
-          title: t('common.operating'),
-          fixed: 'right',
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-        },
-        canResize: false,
-      });
-      const [registerDownTable, { reload: reloadDown }] = useTable({
-        api: dowmListApi,
-        title: '',
-        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
-        columns: columnsDown,
-        useSearchForm: true,
-        formConfig: DownSchemas,
-        showTableSetting: true,
-        showIndexColumn: false,
-        searchInfo: { incrementTypeId: 1 },
-        rowKey: 'id',
-        fetchSetting: {
-          pageField: 'pageNum',
-          sizeField: 'pageSize',
-          listField: 'list',
-          totalField: 'total',
-        },
-        canResize: false,
-      });
-      function handleDelete(record: Recordable) {
-        console.log('点击了删除', record);
-      }
-      function handleInvoice(record: Recordable) {
-        if (incrementTypeId.value == 0) {
-          openAddModal(true, {
-            ...record,
-          });
-        } else {
-          openDownModal(true, {
-            ...record,
-          });
-        }
-      }
-      function handleEdit(record: Recordable) {
-        console.log('record', record);
-      }
-      function headleDetails(record: Recordable) {
-        console.log('record', record);
-        openEditModal(true, {
-          ...record,
-        });
-      }
-      function reload(value) {
-        if (value) {
-          getUserInfoAction();
-        }
-        if (incrementTypeId.value == 0) {
-          reloadEqiuty();
-        } else {
-          reloadDown();
-        }
-      }
-      return {
-        registerTable,
-        registerDownTable,
-        handleDelete,
-        registerAddModal,
-        registerEditModal,
-        handleInvoice,
-        handleEdit,
-        headleDetails,
-        reload,
-        reloadEqiuty,
-        reloadDown,
-        incrementTypeId,
-        getCheckPerm,
-        registerDownModal,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 153
src/views/finance/EditModal.vue

@@ -1,153 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    title="开票详情"
-    height="500"
-    :showOkBtn="false"
-    :showCancelBtn="false"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }">
-          {{ model[field]  }}
-        </template>
-        <template #img="{ model }">
-          <TableImg v-if="model.invoiceUrl" :size="200" :adaptations="true" :simpleShow="true" :imgList="[model.invoiceUrl]" />
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { TableImg } from '/@/components/Table';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceRegister, InvoiceDetail } from '/@/api/order';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi } from '/@/api/product/index';
-  import { ResultEnum } from '/@/enums/httpEnum';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm, TableImg },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const fileFlow = reactive({
-        file:null,
-        type:2,//2-普通发票,3-专用发票
-      })
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-          {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
-            required: true,
-          },
-          {
-            field: 'email',
-            component: 'Input',
-            label: '邮箱',
-            slot: 'text',
-            ifShow:fileFlow.type == 2,
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            slot: 'text',
-            required: true,
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'invoiceUrl',
-            component: 'Upload',
-            label: '电子发票',
-            ifShow:fileFlow.type == 2,
-            required: true,
-            slot: 'img',
-            colProps: {
-              span: 22,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            slot: 'text',
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
-            component: 'Input',
-            ifShow:fileFlow.type == 3,
-            slot: 'text',
-            label: '快递单号',
-            required: true,
-            colProps: {
-              span: 24,
-            },
-          },
-      ];
-
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: 120,
-        schemas:schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        data && onDataReceive(data);
-      });
-      async function onDataReceive(data) {
-        resetFields();
-        let detail = await InvoiceDetail({id:data.id})
-        fileFlow.type = data.type
-        setFieldsValue({
-          ...data,
-          ...detail,
-        });
-        updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'invoiceUrl',ifShow:fileFlow.type == 2,},
-        ])
-      }
-      const handleSubmit = async () => {
-          closeModal();
-          emit('update');
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      return {
-        register,
-        registerForm,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 44
src/views/finance/GrowCard.vue

@@ -1,44 +0,0 @@
-<template>
-  <div class="md:flex">
-    <template v-for="(item, index) in list" :key="item.title">
-      <Card
-        size="small"
-        :loading="loading"
-        :title="item.name"
-        class="md:w-1/6 w-full !md:mt-0 !mt-6"
-        :class="[index + 1 < 6 && '!md:mr-6']"
-        :canExpan="false"
-      >
-        <template #extra>
-          <Tag :color="item.color">{{ item.action }}</Tag>
-        </template>
-
-        <div class="py-4 flex justify-between">
-          <CountTo :prefix="item.unit" :startVal="0" :endVal="item.value" class="text-2xl" />
-          <!-- <Icon :icon="item.icon" :size="40" /> -->
-        </div>
-
-        <div class="flex justify-between">
-          <span>{{ item.title }}</span>
-          <!-- <CountTo :prefix="item.unit" :startVal="0" :endVal="item.value" /> -->
-        </div>
-      </Card>
-    </template>
-  </div>
-</template>
-<script lang="ts" setup>
-  import { CountTo } from '/@/components/CountTo/index';
-  import { Icon } from '/@/components/Icon';
-  import { Tag, Card } from 'ant-design-vue';
-  import { growCardList, GrowCardItem } from '../data';
-
-  defineProps({
-    loading: {
-      type: Boolean,
-    },
-    list: {
-      type: Array as PropType<Array<GrowCardItem>>,
-      default: [],
-    },
-  });
-</script>

+ 0 - 193
src/views/finance/InvoiceModal.vue

@@ -1,193 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    title="开票登记"
-    :okText="okText"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }">
-          {{ model[field]  }}{{fileFlow.type}}
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { InvoiceRegister } from '/@/api/order';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { uploadApi } from '/@/api/product/index';
-  import { ResultEnum } from '/@/enums/httpEnum';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const fileFlow = reactive({
-        file:null,
-        type:2,//2-普通发票,3-专用发票
-      })
-      const okText = ref('发送')
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-          {
-            field: 'id',
-            component: 'Input',
-            show:false,
-            label: '发票编号',
-            required: true,
-          },
-          {
-            field: 'email',
-            component: 'Input',
-            label: '邮箱',
-            slot: 'text',
-            ifShow:fileFlow.type == 2,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'file',
-            component: 'Upload',
-            label: '电子发票',
-            ifShow:fileFlow.type == 2,
-            required: true,
-            rules: [{ required: true, message: t('common.uploadMessge') }],
-            itemProps: {
-              validateTrigger: 'onBlur',
-            },
-            componentProps: {
-              api: uploadApi,
-              fileFlow:true,
-              maxNumber: 1,
-              maxSize: 1000,
-              accept: ['jpeg','jpg','png'],
-              afterFetch: function (data) {
-                console.log('url',data)
-                // Reflect.set(data, 'url', data.file);
-                fileFlow.file = data.file
-                return data;
-              },
-            },
-
-            colProps: {
-              span: 22,
-            },
-          },{
-            field: 'invoiceNum',
-            component: 'Input',
-            label: '发票编号',
-            required: true,
-            componentProps: {
-              maxLength: 50,
-            },
-            colProps: {
-              span: 24,
-            },
-          },{
-            field: 'shipNum',
-            component: 'Input',
-            ifShow:fileFlow.type == 3,
-            label: '快递单号',
-            componentProps: {
-              maxLength: 50,
-            },
-            required: true,
-            colProps: {
-              span: 24,
-            },
-          },
-      ];
-
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: 120,
-        schemas:schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        data && onDataReceive(data);
-      });
-      function onDataReceive(data) {
-        resetFields();
-        fileFlow.type = data.type
-        setFieldsValue(data);
-        okText.value = fileFlow.type == 2?'发送':'确认'
-        updateSchema([
-          {field: 'shipNum',ifShow:fileFlow.type == 3,},
-          {field: 'email',ifShow:fileFlow.type == 2,},
-          {field: 'file',ifShow:fileFlow.type == 2,},
-        ])
-      }
-      const handleSubmit = async () => {
-        try {
-          const params = await validate();
-          const apiData = {
-            data:fileFlow.type == 3?{
-              id:params.id,
-              invoiceNum:params.invoiceNum,
-              shipNum:params.shipNum,
-            }:{
-              id:params.id,
-              invoiceNum:params.invoiceNum,
-              file:fileFlow.file,
-            // file:params.file[0],
-            }
-          }
-          console.log('res', apiData,params);
-          await InvoiceRegister(apiData);
-          closeModal();
-          resetFields();
-          createMessage.success(t('common.optSuccess'));
-          emit('update');
-        } catch (error) {
-          console.log('not passing', error);
-        }
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      return {
-        register,
-        registerForm,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        okText,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 269
src/views/finance/data.tsx

@@ -1,269 +0,0 @@
-import { Time } from '/@/components/Time';
-import { FormProps, BasicColumn } from '/@/components/Table';
-import { h, ref, computed } from 'vue';
-import { FormSchema } from '/@/components/Form/index';
-import { useI18n } from '/@/hooks/web/useI18n';
-const { t } = useI18n();
-import { dincrementList } from '/@/api/equity';
-import type { Dayjs } from 'dayjs';
-const selectPriceDate = ref('');
-import dayjs from 'dayjs';
-import { useLocaleStore } from '/@/store/modules/locale';
-const localeStore = useLocaleStore();
-const isEn = computed(() => localeStore.getLocale === 'en');
-import { getSubAgent } from '/@/api/retailer';
-
-export const columns: BasicColumn[] = [
-  {
-    title: t('routes.equity.timeList'),
-    dataIndex: 'createTime',
-    width: 150,
-    customRender: ({ record }) => {
-      return (
-        record.createTime &&
-        h(Time, {
-          value: record.createTime,
-          mode: 'datetime',
-        })
-      );
-    },
-  },
-  {
-    title: t('routes.equity.Type'),
-    dataIndex: 'type',
-    width: 120,
-    customRender: ({ record }) => {
-      return t(`routes.finance.equityType.${record.type}`) || '-';
-    },
-  },
-  {
-    title: t('routes.equity.nickName'),
-    dataIndex: 'nickName',
-    width: 100,
-  },
-  {
-    title: t('routes.equity.userName1'),
-    dataIndex: 'userName',
-    width: 180,
-  },
-  {
-    title: t('routes.equity.email'),
-    dataIndex: 'email',
-    // slots: { customRender: 'orderType' },
-    width: 150,
-  },
-  {
-    title: t('routes.finance.agentName'),
-    dataIndex: 'agentName',
-    // slots: { customRender: 'orderType' },
-    width: 150,
-  },
-  {
-    title: t('routes.equity.userCount'),
-    dataIndex: 'count',
-    // slots: { customRender: 'orderStatus' },
-    width: 120,
-  },
-  {
-    title: t('routes.finance.totalTime'),
-    dataIndex: 'totalTime',
-    // slots: { customRender: 'orderStatus' },
-    width: 120,
-    customRender: ({ record }) => {
-      return record.type == 2 ? '-' : record.totalTime;
-    },
-  },
-  {
-    title: t('routes.equity.giveType'),
-    dataIndex: 'giveType',
-    // slots: { customRender: 'orderStatus' },
-    width: 180,
-    customRender: ({ record }) => {
-      return t(`routes.finance.giveType.${record.giveType}`) || '-';
-    },
-  },
-];
-export const searchForm: Partial<FormProps> = {
-  labelWidth: isEn.value ? 140 : 100,
-  schemas: [
-    {
-      field: 'type',
-      label: t('routes.equity.Type'),
-      component: 'ApiSelect',
-      labelWidth: 70,
-      componentProps: {
-        maxLength: 50,
-        api: async function () {
-          const list = await dincrementList();
-          const optionList = [];
-          list.map((ele) => {
-            optionList.push({
-              name: t(`routes.finance.equityType.${ele.validTimeType}`),
-              value: ele.validTimeType,
-              key: ele.validTimeType,
-            });
-          });
-          optionList.push({
-            name: t('routes.finance.equityType.2'),
-            value: 2,
-            key: '2',
-          });
-          console.log('ele.id', optionList);
-          return optionList;
-        },
-        numberToString: true,
-        labelField: 'name',
-        valueField: 'value',
-        immediate: true,
-      },
-      colProps: {
-        xl: 8,
-        xxl: 8,
-      },
-    },
-    {
-      field: 'giveType',
-      label: t('routes.equity.giveType'),
-      component: 'Select',
-      labelWidth: 70,
-      componentProps: {
-        // style:''
-        options: [
-          {
-            label: t('routes.finance.giveType.0'),
-            value: 0,
-            key: '0',
-          },
-          {
-            label: t('routes.finance.giveType.1'),
-            value: 1,
-            key: '1',
-          },
-          {
-            label: t('routes.finance.giveType.2'),
-            value: 2,
-            key: '2',
-          },
-          {
-            label: t('routes.finance.giveType.3'),
-            value: 3,
-            key: '3',
-          },
-        ],
-      },
-      colProps: {
-        xl: 8,
-        xxl: 8,
-      },
-    },
-    {
-      field: 'subAgentId',
-      component: 'ApiSelect',
-      label: t('routes.finance.agentName'),
-      componentProps: {
-        maxLength: 50,
-        api: getSubAgent,
-        numberToString: true,
-        labelField: 'name',
-        valueField: 'id',
-        immediate: true,
-        params: {
-          type: 1,
-        },
-        style: 'max-width: 250px',
-      },
-      colProps: {
-        xl: 8,
-        xxl: 8,
-      },
-    },
-    {
-      field: 'timeList',
-      label: t('routes.equity.timeList'),
-      component: 'RangePicker',
-      componentProps: {
-        maxLength: 100,
-        valueFormat: 'YYYY-MM-DD',
-        format: 'YYYY-MM-DD',
-        onCalendarChange: (date) => {
-          console.log('current', date);
-          selectPriceDate.value = date[0];
-        },
-        onOpenChange: (status) => {
-          if (!status) {
-            selectPriceDate.value = '';
-          }
-        },
-        disabledDate: (current) => {
-          if (selectPriceDate.value) {
-            return (
-              current > dayjs(selectPriceDate.value).add(3, 'year') ||
-              current < dayjs(selectPriceDate.value).subtract(3, 'year')
-            );
-          } else {
-            return false;
-          }
-        },
-      },
-      colProps: {
-        xl: 9,
-        xxl: 9,
-      },
-    },
-  ],
-};
-export const InvoiceSchemas: FormSchema[] = [
-  {
-    field: 'type',
-    component: 'Input',
-    label: t('routes.product.types'),
-    slot: 'text',
-    colProps: {
-      span: 24,
-    },
-  },
-  {
-    field: 'version',
-    component: 'Input',
-    label: t('routes.product.version'),
-    required: true,
-    colProps: {
-      span: 24,
-    },
-    rules: [
-      {
-        required: true,
-        // @ts-ignore
-        validator: async (rule, value) => {
-          if (!value) {
-            return Promise.reject(t('common.inputText') + t('routes.product.version'));
-          }
-          if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
-            /* eslint-disable-next-line */
-            return Promise.reject(t('routes.equity.zhTips'));
-          }
-          return Promise.resolve();
-        },
-        trigger: 'change',
-      },
-    ],
-    componentProps: {
-      maxLength: 15,
-      onChange: (data) => {
-        console.log('data', data);
-      },
-    },
-  },
-  {
-    field: 'description',
-    component: 'InputTextArea',
-    required: true,
-    label: t('routes.product.description'),
-    componentProps: {
-      rows: 4,
-    },
-    colProps: {
-      span: 24,
-    },
-  },
-];

+ 0 - 230
src/views/finance/index.vue

@@ -1,230 +0,0 @@
-<template>
-  <div>
-    <GrowCard :loading="loading" class="enter-y" :list="growCardList" />
-    <BasicTable @register="registerTable">
-      <template #toolbar>
-        <a-button type="primary" @click="exportExcel">
-          {{ t('routes.equity.exportExcel') }}</a-button
-        >
-      </template>
-    </BasicTable>
-    <AddModal @update="reload" @register="registerAddModal" />
-    <EditModal @register="registerEditModal" @update="reload" />
-  </div>
-</template>
-<script lang="ts">
-  import { defineComponent, h, reactive, ref, onMounted, computed } from 'vue';
-  import GrowCard from './GrowCard.vue';
-  import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
-  import { PageWrapper } from '/@/components/Page';
-  import { useModal } from '/@/components/Modal';
-  import { Descriptions } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { logData, logList, DownExport } from '/@/api/finance';
-  import { searchForm, columns } from './data';
-  import AddModal from './InvoiceModal.vue';
-  import EditModal from './EditModal.vue';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  import { useLocaleStore } from '/@/store/modules/locale';
-
-  interface apiDataParam {
-    orderSn?: string;
-    payTimeStart?: string;
-    payTimeEnd?: string;
-    invoiceTimeStart?: string;
-    invoiceTimeEnd?: string;
-    orderBy?: string;
-    sortBy?: string;
-  }
-  interface GrowCardItem {
-    icon: string;
-    title: string;
-    value: number;
-    unit: string;
-    color: string;
-    action: string;
-    name: string;
-  }
-  export default defineComponent({
-    components: {
-      AddModal,
-      GrowCard,
-      EditModal,
-      BasicTable,
-      TableAction,
-      PageWrapper,
-      TableImg,
-      [Descriptions.name]: Descriptions,
-      [Descriptions.Item.name]: Descriptions.Item,
-    },
-    setup() {
-      const { t } = useI18n();
-      const loading = ref(true);
-      const growCardList = ref<GrowCardItem[]>([]);
-      const localeStore = useLocaleStore();
-      const isEn = computed(() => localeStore.getLocale === 'en');
-      onMounted(async () => {
-        const { agentData, subAgentData } = await logData({});
-        loading.value = false;
-        growCardList.value = [
-          {
-            title: t('routes.equity.CardMajorNum'),
-            name: t('routes.finance.equityType.0'),
-            // icon: 'fa6-solid:users-gear',
-            icon: 'visit-count|svg',
-            value: agentData.lastMajorNum || 0,
-            unit: t('routes.equity.unit.-1'),
-            color: 'blue',
-            action: t('routes.retailer.jxs'),
-          },
-          {
-            title: t('routes.equity.CardHighNum'),
-            name: t('routes.finance.equityType.1'),
-            icon: 'akar-icons:person-add',
-            value: agentData.lastHighNum || 0,
-            unit: t('routes.equity.unit.-2'),
-            color: 'blue',
-            action: t('routes.retailer.jxs'),
-          },
-          {
-            title: t('routes.equity.CardDownNum'),
-            name: t('routes.finance.equityType.2'),
-            icon: 'carbon:user-role',
-            value: agentData.lastDownNum || 0,
-            unit: t('routes.equity.unit.2'),
-            color: 'blue',
-            action: t('routes.retailer.jxs'),
-          },
-          {
-            title: t('routes.equity.CardMajorNum'),
-            name: t('routes.finance.equityType.0'),
-            // icon: 'fa6-solid:users-gear',
-            icon: 'visit-count|svg',
-            value: subAgentData.lastMajorNum || 0,
-            unit: t('routes.equity.unit.-1'),
-            color: 'orange',
-            action: t('routes.retailer.fxs'),
-          },
-          {
-            title: t('routes.equity.CardHighNum'),
-            name: t('routes.finance.equityType.1'),
-            icon: 'akar-icons:person-add',
-            value: subAgentData.lastHighNum || 0,
-            unit: t('routes.equity.unit.-2'),
-            color: 'orange',
-            action: t('routes.retailer.fxs'),
-          },
-          {
-            title: t('routes.equity.CardDownNum'),
-            name: t('routes.finance.equityType.2'),
-            icon: 'carbon:user-role',
-            value: subAgentData.lastDownNum || 0,
-            unit: t('routes.equity.unit.2'),
-            color: 'orange',
-            action: t('routes.retailer.fxs'),
-          },
-        ];
-      });
-      const permissionStore = usePermissionStore();
-      const { getCheckPerm } = permissionStore;
-      const apiData = reactive<apiDataParam>({
-        orderSn: '',
-        payTimeStart: '',
-        payTimeEnd: '',
-        invoiceTimeStart: '',
-        invoiceTimeEnd: '',
-        orderBy: '',
-        sortBy: '',
-      });
-      const { createMessage, createConfirm } = useMessage();
-      const [registerAddModal, { openModal: openAddModal }] = useModal();
-      const [registerEditModal, { openModal: openEditModal }] = useModal();
-      const [registerTable, { reload }] = useTable({
-        api: logList,
-        title: t('routes.equity.listTitle'),
-        titleHelpMessage: [
-          t('routes.equity.titleHelpMessage.1'),
-          t('routes.equity.titleHelpMessage.2'),
-          t('routes.equity.titleHelpMessage.3'),
-        ],
-        columns: columns,
-        useSearchForm: true,
-        formConfig: searchForm,
-        showTableSetting: true,
-        showIndexColumn: false,
-        rowKey: 'id',
-        beforeFetch: (params) => {
-          let searchData = {
-            orderSn: params.orderSn,
-            payTimeStart: params.payTime && params.payTime[0],
-            payTimeEnd: params.payTime && params.payTime[1],
-            invoiceTimeStart: params.invoiceTime && params.invoiceTime[0],
-            invoiceTimeEnd: params.invoiceTime && params.invoiceTime[1],
-          };
-          apiData.orderSn = searchData.orderSn;
-          apiData.payTimeStart = searchData.payTimeStart;
-          apiData.payTimeEnd = searchData.payTimeEnd;
-          apiData.invoiceTimeStart = searchData.invoiceTimeStart;
-          apiData.invoiceTimeEnd = searchData.invoiceTimeEnd;
-          return {
-            ...params,
-            ...searchData,
-          };
-        },
-        fetchSetting: {
-          pageField: 'pageNum',
-          sizeField: 'pageSize',
-          listField: 'list',
-          totalField: 'total',
-        },
-        canResize: false,
-      });
-      function handleDelete(record: Recordable) {
-        console.log('点击了删除', record);
-      }
-      function handleInvoice(record: Recordable) {
-        openAddModal(true, {
-          ...record,
-        });
-      }
-      function handleEdit(record: Recordable) {
-        console.log('record', record);
-      }
-      function headleDetails(record: Recordable) {
-        console.log('record', record);
-        openEditModal(true, {
-          ...record,
-        });
-      }
-      function exportExcel() {
-        createConfirm({
-          iconType: 'warning',
-          title: () => h('span', t('common.reminder')),
-          content: () => h('span', t('routes.equity.excelTitle')),
-          onOk: async () => {
-            await DownExport({
-              ...apiData,
-              lang: isEn.value ? 'en' : 'cn',
-            });
-          },
-        });
-      }
-      return {
-        registerTable,
-        handleDelete,
-        registerAddModal,
-        registerEditModal,
-        handleInvoice,
-        exportExcel,
-        handleEdit,
-        headleDetails,
-        reload,
-        getCheckPerm,
-        loading,
-        growCardList,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 243
src/views/retailer/AddModal.vue

@@ -1,243 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :confirmLoading="loading"
-    :title="fileFlow.title"
-    @visible-change="handleVisibleChange"
-    @cancel="resetFields"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { uploadApi } from '/@/api/product/index';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { isEmojiCharacter } from '/@/utils';
-  import { checkUserName, checkjxsUserName } from '/@/api/equity';
-  import { addApi, updateApi } from '/@/api/retailer';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const modelRef = ref({});
-      const loading = ref(false)
-      const fileFlow = reactive({
-        file: null,
-        title: t('routes.retailer.add'),
-      })
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'id',
-          component: 'Input',
-          label: t('routes.retailer.form.name'),
-          show: false,
-          colProps: {
-            span: 24,
-          },
-          // required: true,
-        },
-        {
-          field: 'name',
-          component: 'Input',
-          label: t('routes.retailer.form.name'),
-          required: true,
-          colProps: {
-            span: 24,
-          },
-          componentProps: {
-            maxLength: 50,
-          },
-        },
-        {
-          field: 'nickName',
-          component: 'Input',
-          label: t('routes.retailer.form.nickName'),
-          colProps: {
-            span: 24,
-          },
-          componentProps: {
-            maxLength: 50,
-          },
-        },
-        {
-          field: 'userName',
-          component: 'Input',
-          label: t('routes.retailer.form.userId'),
-          required: true,
-          colProps: {
-            span: 24,
-          },
-          componentProps: {
-            placeholder:t('routes.retailer.form.userName'),
-            maxLength: 50,
-          },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                // const regEmail = /^(.+)@(.+)$/;
-                // const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
-                if (!value) {
-                  return Promise.reject(t('routes.retailer.form.userName'));
-                }
-                // if (!(regPos.test(value) || regEmail.test(value))) {
-                //   /* eslint-disable-next-line */
-                // return Promise.reject(t('routes.equity.rules.userName1'));
-                // }
-                // useThrottleFn(handleSplitLeftMenu, 50);
-                const res = await checkjxsUserName({ userName: value });
-                // useThrottleFn(,50)()
-                console.log('validator', res);
-                if (!res) {
-                  return Promise.reject(t('routes.equity.rules.userName2'));
-                }
-                return Promise.resolve();
-              },
-              trigger: 'blur',
-            },
-          ],
-        },
-        // {
-        //   field: 'orderSn',
-        //   component: 'Input',
-        //   label: t('routes.devices.orderSn'),
-        //   colProps: {
-        //     span: 24,
-        //   },
-        // },
-        // {
-        //   field: 'companyId',
-        //   component: 'ApiSelect',
-        //   label: t('routes.devices.companyId'),
-        //   itemProps: {
-        //     validateTrigger: 'blur',
-        //   },
-        //   componentProps: {
-        //     api: allCompanyApi,
-        //     numberToString: true,
-        //     labelField: 'name',
-        //     valueField: 'id',
-        //     immediate: true,
-        //     params: {
-        //       page: 1,
-        //       limit: 1000,
-        //     },
-        //   },
-        //   colProps: {
-        //     span: 24,
-        //   },
-        // },
-      ];
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: 120,
-        schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        data && onDataReceive(data);
-      });
-      function renderOwnTypeLabel(type: number): string {
-        switch (type) {
-          case 9:
-            return t('routes.product.type.2');
-          case 1:
-            return t('routes.product.type.1');
-          case 10:
-            return t('routes.product.type.3');
-          case 11:
-            return t('routes.product.type.11');
-          default:
-            return '';
-        }
-      }
-      function rendercameraTypeLabel(cameraType: number): string {
-        switch (cameraType) {
-          case 4:
-            return t('routes.devices.cameraName.4');
-          case 1:
-            return t('routes.devices.cameraName.1');
-          case 9:
-            return t('routes.devices.cameraName.9');
-          case 10:
-            return t('routes.devices.cameraName.10');
-          case 6:
-            return t('routes.devices.cameraName.6');
-          default:
-            return '';
-        }
-      }
-      function onDataReceive(data) {
-        modelRef.value = data
-        console.log('renderOwnTypeLabel',data)
-        fileFlow.title = data.id ? t('routes.retailer.editfxs') : t('routes.retailer.add');
-        resetFields();
-        updateSchema({
-          field: 'userName',
-          show: data.id ? false : true,
-        })
-        setFieldsValue({
-          ...data,
-        });
-      }
-      const handleSubmit = async () => {
-        loading.value = true
-        try {
-          const params = await validate();
-          let api = params.id ? updateApi : addApi;
-          const res = await api(params);
-          console.log('res', res);
-          closeModal();
-          resetFields();
-          createMessage.success(t('common.optSuccess'));
-          emit('update');
-          loading.value = false
-        } catch (error) {
-          loading.value = false
-          console.log('not passing', error);
-        }
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      return {
-        register,
-        rendercameraTypeLabel,
-        renderOwnTypeLabel,
-        schemas,
-        registerForm,
-        model: modelRef,
-        fileFlow,
-        loading,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-      };
-    },
-  });
-</script>

+ 0 - 214
src/views/retailer/EditModal.vue

@@ -1,214 +0,0 @@
-<template>
-  <BasicModal
-    v-bind="$attrs"
-    @register="register"
-    :title="t('routes.retailer.setName')"
-    @visible-change="handleVisibleChange"
-    :confirmLoading="loading"
-    @cancel="resetFields"
-    width="650px"
-    @ok="handleSubmit"
-  >
-    <div class="pt-2px pr-3px">
-      <div class="name" style="line-height: 43px;">{{t('routes.retailer.form.dqname')}}:{{ modelRef.name }}</div>
-      <BasicForm @register="registerForm">
-        <template #text="{ model, field }">
-          {{ model[field] }}
-        </template>
-        <template #type="{ model, field }">
-          {{ renderOwnTypeLabel(Number(model[field])) }}
-        </template>
-      </BasicForm>
-    </div>
-  </BasicModal>
-</template>
-<script lang="ts">
-  import { defineComponent, ref, nextTick, onMounted, reactive, computed } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { isEmojiCharacter } from '/@/utils';
-  import { useUserStore } from '/@/store/modules/user';
-  import { addIncrementNum } from '/@/api/retailer';
-  import { useLocaleStore } from '/@/store/modules/locale';
-
-  const { t } = useI18n();
-  export default defineComponent({
-    components: { BasicModal, BasicForm },
-    props: {
-      userData: { type: Object },
-    },
-    emits: ['update', 'register'],
-    setup(props, { emit }) {
-      const modelRef = ref({});
-      const loading = ref(false);
-      const fileFlow = reactive({
-        file: null,
-      });
-      const userStore = useUserStore();
-      const { getUserInfoAction } = userStore
-      const isDev = computed(() => userStore.getSystemEnv);
-      const localeStore = useLocaleStore();
-      const isEn = computed(() => localeStore.getLocale === 'en');
-      const agent = computed(() => userStore.getAgent);
-      const { createMessage } = useMessage();
-      const schemas: FormSchema[] = [
-        {
-          field: 'id',
-          component: 'Input',
-          label: t('routes.product.types'),
-          show: false,
-          colProps: {
-            span: 24,
-          },
-        },
-        // {
-        //   field: 'name',
-        //   component: 'Input',
-        //   label: t('routes.retailer.form.dqname'),
-        //   slot: 'text',
-        //   colProps: {
-        //     span: 24,
-        //   },
-        // },
-        {
-          field: 'majorAddNum',
-          component: 'InputNumber',
-          label: t('routes.retailer.majorAddNum', {value: agent.value.majorSubNum}),
-          defaultValue: 0,
-          colProps: {
-            span: 22,
-          },
-        },
-        {
-          field: 'highAddNum',
-          component: 'InputNumber',
-          label: t('routes.retailer.highAddNum', {value: agent.value.highSubNum}),
-          defaultValue: 0,
-          ifShow: isDev.value,
-          colProps: {
-            span: 22,
-          },
-        },
-        {
-          field: 'downAddNum',
-          component: 'InputNumber',
-          label: t('routes.retailer.downAddNum', {value: agent.value.downSubNum}),
-          defaultValue: 0,
-          colProps: {
-            span: 22,
-          },
-        },
-      ];
-      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
-        labelWidth: isEn.value ? 470 : 330,
-        labelAlign: 'left',
-        schemas,
-        showActionButtonGroup: false,
-        actionColOptions: {
-          span: 24,
-        },
-      });
-      onMounted(() => {});
-      let addListFunc = () => {};
-      const [register, { closeModal }] = useModalInner((data) => {
-        data && onDataReceive(data);
-      });
-      function renderOwnTypeLabel(type: number): string {
-        switch (type) {
-          case 9:
-            return t('routes.product.type.2');
-          case 1:
-            return t('routes.product.type.1');
-          case 10:
-            return t('routes.product.type.3');
-          case 11:
-            return t('routes.product.type.11');
-          default:
-            return '';
-        }
-      }
-      function onDataReceive(data) {
-        modelRef.value = data;
-        console.log('onDataReceive', data);
-        resetFields();
-        setTimeout(() => {
-          updateSchema([
-            {
-              field: 'majorAddNum',
-              label: t('routes.retailer.majorAddNum', {value: agent.value.majorSubNum}),
-              componentProps: {
-                max: agent.value.majorSubNum,
-                min: 0,
-              },
-            },
-            {
-              field: 'highAddNum',
-              label: t('routes.retailer.highAddNum', {value: agent.value.highSubNum}),
-              componentProps: {
-                max: agent.value.highSubNum,
-                min: 0,
-              },
-              ifShow: isDev.value,
-            },
-            {
-              field: 'downAddNum',
-              label: t('routes.retailer.downAddNum', {value: agent.value.downSubNum}),
-              componentProps: {
-                max: agent.value.downSubNum,
-                min: 0,
-              },
-            },
-          ]);
-        }, 500);
-        setFieldsValue({
-          ...data,
-          downAddNum: 0,
-          majorAddNum: 0,
-          highAddNum: 0,
-        });
-      }
-      const handleSubmit = async () => {
-        loading.value = true;
-        try {
-          const params = await validate();
-          console.log('modelRef', params);
-          const apiData = {
-            // ...modelRef.value,
-            ...(params as any),
-          };
-          console.log('res', apiData);
-          const res = await addIncrementNum(apiData);
-          console.log('res', res);
-          closeModal();
-          resetFields();
-          createMessage.success(t('common.optSuccess'));
-          emit('update');
-          getUserInfoAction();
-          loading.value = false;
-        } catch (error) {
-          console.log('not passing', error);
-          loading.value = false;
-        }
-      };
-      function handleVisibleChange(v) {
-        v && props.userData && nextTick(() => onDataReceive(props.userData));
-      }
-      return {
-        register,
-        renderOwnTypeLabel,
-        schemas,
-        loading,
-        registerForm,
-        fileFlow,
-        handleVisibleChange,
-        handleSubmit,
-        addListFunc,
-        resetFields,
-        t,
-        modelRef,
-      };
-    },
-  });
-</script>

+ 0 - 252
src/views/retailer/index.vue

@@ -1,252 +0,0 @@
-<template>
-  <PageWrapper contentBackground>
-    <div class="desc-wrap-BasicTable">
-      <BasicTable @register="registerTimeTable">
-        <template #toolbar>
-          <a-button type="primary" @click="handleAdd"> {{t('routes.retailer.add')}}</a-button>
-        </template>
-        <template #action="{ record }">
-          <TableAction
-            stopButtonPropagation
-            :actions="[
-              {
-                label: t('routes.retailer.setName'),
-                //icon: 'la:file-invoice-dollar',
-                onClick: handleEdit.bind(null, record),
-              },
-              {
-                label: t('common.edit'),
-                //icon: 'la:file-invoice-dollar',
-                onClick: headleDetails.bind(null, record),
-              },
-            ]"
-          />
-        </template>
-      </BasicTable>
-    </div>
-    <AddModal @update="reload" @register="registerAddModal" />
-    <EditModal @register="registerEditModal" @update="reload" />
-  </PageWrapper>
-</template>
-<script lang="ts">
-  import { defineComponent, reactive, h, computed } from 'vue';
-  import { BasicTable, useTable, FormProps, TableAction, BasicColumn } from '/@/components/Table';
-  import { PageWrapper } from '/@/components/Page';
-  import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
-  import { listApi, banOrUnBan } from '/@/api/retailer';
-  import { useModal } from '/@/components/Modal';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import AddModal from './AddModal.vue';
-  import EditModal from './EditModal.vue';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { Switch } from 'ant-design-vue';
-  import { Time } from '/@/components/Time';
-  import { useUserStore } from '/@/store/modules/user';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  export default defineComponent({
-    components: {
-      BasicTable,
-      AddModal,
-      EditModal,
-      TableAction,
-      PageWrapper,
-      [Divider.name]: Divider,
-      [Card.name]: Card,
-      Empty,
-      [Descriptions.name]: Descriptions,
-      [Descriptions.Item.name]: Descriptions.Item,
-      [Steps.name]: Steps,
-      [Steps.Step.name]: Steps.Step,
-      [Tabs.name]: Tabs,
-      [Tabs.TabPane.name]: Tabs.TabPane,
-    },
-    setup() {
-      const { t } = useI18n();
-      const permissionStore = usePermissionStore();
-      const { getCheckPerm } = permissionStore;
-      const searchInfo = reactive<Recordable>({
-        // type: 1,
-      });
-      const [registerAddModal, { openModal: openAddModal }] = useModal();
-      const [registerEditModal, { openModal: openEditModal }] = useModal();
-      const userStore = useUserStore();
-      const isDev = computed(() => userStore.getSystemEnv);
-      const { createMessage } = useMessage();
-
-      const refundTimeTableSchema: BasicColumn[] = [
-        {
-          title: t('routes.retailer.name'),
-          width: 120,
-          dataIndex: 'name',
-        },
-        {
-          title: t('routes.retailer.form.nickName'),
-          width: 120,
-          dataIndex: 'nickName',
-        },
-        {
-          title: t('routes.retailer.form.userId'),
-          width: 100,
-          dataIndex: 'userName',
-        },
-        {
-          title: t('routes.retailer.majorTotalNum'),
-          width: 150,
-          dataIndex: 'majorTotalNum',
-          customRender: ({ record }) => {
-            return record.majorTotalNum - record.majorUseNum;
-          }
-        },
-        {
-          title: t('routes.retailer.highTotalNum'),
-          width: 150,
-          dataIndex: 'highTotalNum',
-          ifShow: isDev.value,
-          customRender: ({ record }) => {
-            return record.highTotalNum - record.highUseNum;
-          }
-        },
-        {
-          title: t('routes.retailer.downTotalNum'),
-          width: 150,
-          dataIndex: 'downTotalNum',
-          customRender: ({ record }) => {
-            return record.downTotalNum - record.downUseNum;
-          }
-        },
-        {
-          title: t('routes.retailer.createName'),
-          width: 120,
-          dataIndex: 'createName',
-        },
-        {
-          title: t('routes.retailer.createTime'),
-          width: 150,
-          dataIndex: 'createTime',
-          customRender: ({ record }) => {
-            return (
-              record.createTime &&
-              h(Time, {
-                value: record.createTime,
-                mode: 'datetime',
-              })
-            );
-          },
-        },
-        {
-          title: t('common.state'),
-          dataIndex: 'status',
-          width: 90,
-          customRender: ({ record }) => {
-            if (!Reflect.has(record, 'pendingStatus')) {
-              record.pendingStatus = false;
-            }
-            return h(Switch, {
-              checked: record.status == '0',
-              style: 'width: 90px',
-              checkedChildren: t('routes.retailer.form.enable'),
-              unCheckedChildren: t('routes.retailer.form.stopUsing'),
-              loading: false,
-              onChange: async (checked: boolean) => {
-                record.pendingStatus = true;
-                const newStatus = checked ? '0' : '1';
-                await banOrUnBan({ id: record.id, status: newStatus });
-                if (checked) {
-                  Reflect.set(record, 'status', newStatus);
-                } else {
-                  Reflect.set(record, 'status', newStatus);
-                }
-                reload();
-                createMessage.success(t('common.optSuccess'));
-              },
-            });
-          },
-        },
-      ];
-      const searchForm: Partial<FormProps> = {
-        labelWidth: 150,
-        autoSubmitOnEnter: true,
-        schemas: [
-          {
-            field: 'agentName',
-            label: t('routes.retailer.name'),
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 10,
-              xxl: 10,
-            },
-          },
-        ],
-      };
-      const [registerTimeTable, { reload }] = useTable({
-        api: listApi,
-        columns: refundTimeTableSchema,
-        useSearchForm: true,
-        formConfig: searchForm,
-        showTableSetting: true,
-        showIndexColumn: false,
-        rowKey: 'id',
-        fetchSetting: {
-          pageField: 'pageNum',
-          sizeField: 'pageSize',
-          listField: 'list',
-          totalField: 'total',
-        },
-        searchInfo: searchInfo,
-        // beforeFetch:(T)=>{
-        //   T.type = searchInfo.type
-        //   console.log('beforeFetch',T,searchInfo)
-        //   return T
-        // },
-        actionColumn: {
-          width: 180,
-          title: t('common.operating'),
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-        },
-        canResize: true,
-      });
-      function tabChange(val: string) {
-        console.log('tabChange', val);
-        reload();
-      }
-      async function handleDelete(record: Recordable) {
-        console.log('点击了删除', record);
-        await DelAndUpload({ id: record.id });
-        createMessage.success(t('common.optSuccess'));
-        reload();
-      }
-      function handleOpen(record: Recordable) {
-        console.log('点击了启用', record);
-      }
-      function handleAdd() {
-        openAddModal(true, {});
-      }
-      function headleDetails(record: Recordable) {
-        openAddModal(true, record);
-      }
-      function handleEdit(record: Recordable) {
-        openEditModal(true, record);
-      }
-      return {
-        registerTimeTable,
-        handleDelete,
-        handleOpen,
-        tabChange,
-        reload,
-        registerAddModal,
-        registerEditModal,
-        openAddModal,
-        handleEdit,
-        getCheckPerm,
-        t,
-        searchInfo,
-        handleAdd,
-        headleDetails,
-      };
-    },
-  });
-</script>

+ 3 - 3
src/views/scene/list.vue

@@ -13,7 +13,7 @@
     <div class="desc-wrap-BasicTable">
       <BasicTable @register="registerTable">
         <template #toolbar>
-          <a-button type="primary" @click="handleMove"> 同步场景</a-button>
+          <a-button type="primary" @click="handleMove"> {{t('routes.scene.sceneAsync')}}</a-button>
         </template>
 
         <template #href="{ record }">
@@ -28,12 +28,12 @@
             stopButtonPropagation
             :actions="[
               {
-                label: '查看',
+                label: t('common.see'),
                 disabled: record.status != 1,
                 onClick: handleSee.bind(null, record),
               },
               {
-                label: '删除',
+                label: t('common.delText'),
                 color: 'error',
                 onClick: handleDelete.bind(null, record),
               },

+ 3 - 3
src/views/scene/modal/SyncModal.vue

@@ -55,7 +55,7 @@
       });
       const columns: BasicColumn[] = [
         {
-          title: '名称',
+          title: t('routes.scene.title'),
           dataIndex: 'title',
           // slots: { customRender: 'href' },
           width: 150,
@@ -67,7 +67,7 @@
           width: 180,
         },
         {
-          title: '所属账户',
+          title: t('routes.scene.userName'),
           dataIndex: 'userName',
           ellipsis: true,
           width: 180,
@@ -94,7 +94,7 @@
         schemas: [
           {
             field: 'title',
-            label: '名称',
+            label: t('routes.scene.title'),
             component: 'Input',
             labelWidth: 50,
             componentProps: {

+ 25 - 0
translate.js

@@ -0,0 +1,25 @@
+const http = require('http');
+const fs = require('fs');
+
+function checkIfPhishing(urlToPrint, path, lang = 'zh') {
+  fs.mkdirSync(path, { recursive: true });
+  const file = fs.createWriteStream(`${path}/${lang}.json`);
+  const request = http.get(urlToPrint, function (response) {
+    response.pipe(file).on('finish', function () {
+      console.log(`lang: ${lang} get translate in ${path} Done!`);
+      // console.log(fs.readFileSync(`${lang}.json`, { encoding: "utf8" }));
+    });
+  });
+}
+// editor zh
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/geo_jp/backend/zh_Hans/',
+  'src/locales/lang/json',
+  'zh-CN',
+);
+// editor en
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/geo_jp/backend/ja/',
+  'src/locales/lang/json',
+  'ja',
+);