yb 3 тижнів тому
батько
коміт
362b57a799
100 змінених файлів з 2959 додано та 8493 видалено
  1. 5 9
      .editorconfig
  2. 4 13
      .env.dev
  3. 36 0
      .env.local
  4. 3 9
      .env.prod
  5. 4 4
      .env.stage
  6. 3 3
      .env.test
  7. 1 2
      .eslintignore
  8. 1 2
      .gitignore
  9. 4 26
      .prettierignore
  10. 211 0
      CLAUDE.md
  11. 2 3
      README.md
  12. 4 4
      build/vite/index.ts
  13. 57 60
      package.json
  14. 1665 666
      pnpm-lock.yaml
  15. 1 1
      postcss.config.js
  16. BIN
      public/UEditor/dialogs/anchor/anchor.html
  17. 0 60
      public/local-images/README.md
  18. BIN
      public/logo.gif
  19. BIN
      public/logo111.gif
  20. 1 1
      public/voice_new_order.mp3
  21. 1 5
      src/api/infra/demo/demo01/index.ts
  22. 0 6
      src/api/login/oauth2/index.ts
  23. 4 0
      src/api/mall/cashier/index.ts
  24. 6 0
      src/api/mall/coupon/index.ts
  25. 33 219
      src/api/mall/desk/shopdeskcategory/index.ts
  26. 21 0
      src/api/mall/order/storeOrder/statistics.ts
  27. 2 2
      src/api/mall/product/brand.ts
  28. 4 0
      src/api/mall/store/withdrawal/index.ts
  29. 12 0
      src/api/market/vipCard/index.ts
  30. 1 0
      src/api/pay/merchantDetails/index.ts
  31. BIN
      src/api/tools/materialgroup.js
  32. BIN
      src/assets/imgs/diy/app-nav-bar-mp.png
  33. 0 0
      src/assets/imgs/profile.jpg
  34. 0 0
      src/assets/svgs/icon.svg
  35. 0 0
      src/assets/svgs/on_good.svg
  36. 0 0
      src/assets/svgs/order.svg
  37. 0 0
      src/assets/svgs/pay-success.svg
  38. 0 0
      src/assets/svgs/payed_goods.svg
  39. 0 0
      src/assets/svgs/peoples.svg
  40. 0 0
      src/assets/svgs/sales.svg
  41. 0 0
      src/assets/svgs/scan.svg
  42. 2 2
      src/assets/svgs/weixin.svg
  43. 8 8
      src/components/AppLinkInput/data.ts
  44. 2 2
      src/components/Cropper/index.ts
  45. 2 2
      src/components/Cropper/src/Cropper.vue
  46. 1 1
      src/components/Cropper/src/CropperAvatar.vue
  47. 2 1
      src/components/Cropper/src/types.ts
  48. 33 50
      src/components/DictTag/index.ts
  49. 1 1
      src/components/DocAlert/index.vue
  50. 2 2
      src/components/Echart/index.ts
  51. 66 34
      src/components/Form/index.ts
  52. 5 6
      src/components/Materials/src/editorMaterials.vue
  53. 2 2
      src/components/OperateLogV2/index.ts
  54. 2 2
      src/components/SimpleProcessDesigner/src/addNode.vue
  55. 1 1
      src/components/Table/src/helper.ts
  56. 0 91
      src/components/UploadFile/src/useUpload.ts
  57. 1 1
      src/components/index.ts
  58. 0 45
      src/config/image-mapping.ts
  59. 0 79
      src/directives/image/index.ts
  60. 1 4
      src/directives/index.ts
  61. 1 1
      src/directives/permission/hasPermi.ts
  62. 1 2
      src/hooks/web/useConfigGlobal.ts
  63. 0 48
      src/layout/components/LocaleDropdown/src/LocaleDropdown.vue
  64. 2 3
      src/layout/components/Logo/index.ts
  65. 2 5
      src/layout/components/Menu/index.ts
  66. 15 1
      src/layout/components/Menu/src/components/useRenderMenuItem.tsx
  67. 2 3
      src/layout/components/TabMenu/src/helper.ts
  68. 108 2054
      src/layout/components/UserInfo/src/components/LockDialog.vue
  69. 0 2410
      src/locales/ja.ts
  70. 15 1961
      src/locales/zh-CN.ts
  71. 1 13
      src/main.ts
  72. 9 12
      src/permission.ts
  73. 1 11
      src/router/index.ts
  74. 11 11
      src/store/index.ts
  75. 0 1
      src/store/modules/dict.ts
  76. 0 6
      src/store/modules/locale.ts
  77. 1 2
      src/store/modules/lock.ts
  78. 3 4
      src/store/modules/simpleWorkflow.ts
  79. 1 1
      src/styles/FormCreate/fonts/fontello.woff
  80. 1 1
      src/styles/index.scss
  81. 0 1
      src/styles/theme.scss
  82. 0 86
      src/styles/variables.scss
  83. 20 20
      src/utils/index.ts
  84. 22 22
      src/utils/tree.ts
  85. 10 9
      src/views/Home/Index2.vue
  86. 0 3
      src/views/Home/echarts-data.ts
  87. 8 7
      src/views/Home/types.ts
  88. 0 88
      src/views/Login/Register.vue
  89. 1 1
      src/views/Login/SocialLogin.vue
  90. 33 18
      src/views/Login/components/LoginForm.vue
  91. 3 3
      src/views/Login/components/LoginFormTitle.vue
  92. 122 177
      src/views/Login/components/QrCodeForm.vue
  93. 7 8
      src/views/Login/components/SSOLogin.vue
  94. 1 3
      src/views/Login/components/index.ts
  95. 9 10
      src/views/Profile/components/UserSocial.vue
  96. 11 11
      src/views/Profile/components/index.ts
  97. 111 0
      src/views/express/ExpressForm2.vue
  98. 27 21
      src/views/express/ExpressSet.vue
  99. 18 26
      src/views/express/index.vue
  100. 165 0
      src/views/express/index2.vue

+ 5 - 9
.editorconfig

@@ -1,8 +1,8 @@
 # 标题
-VITE_APP_TITLE="Tabemate Pro  オーダーシステム"
+VITE_APP_TITLE=意象点餐管理系统
 
 # 项目本地运行端口号
-VITE_PORT=8000
+VITE_PORT=80
 
 # open 运行 npm run dev 时自动打开浏览器
 VITE_OPEN=true
@@ -11,17 +11,13 @@ VITE_OPEN=true
 VITE_APP_TENANT_ENABLE=true
 
 # 验证码的开关
-VITE_APP_CAPTCHA_ENABLE=false
+VITE_APP_CAPTCHA_ENABLE=true
 
 # 文档地址的开关
 VITE_APP_DOCALERT_ENABLE=true
 
 # 百度统计
-# VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc
-VITE_APP_BAIDU_CODE=
+VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc
 
 # 百度地图ak
-# VITE_BAIDU_MAP_AK = m1YRfvvQt9dPVNuPSieTEDgRhZkIznSn
-VITE_BAIDU_MAP_AK= 
-
-# // https://api.ifoodme.com/doc.html#/home  接口文档地址
+VITE_BAIDU_MAP_AK = m1YRfvvQt9dPVNuPSieTEDgRhZkIznSn

+ 4 - 13
.env.dev

@@ -4,21 +4,12 @@ NODE_ENV=production
 VITE_DEV=true
 
 # 请求路径
-# VITE_BASE_URL='https://api.ifoodme.com'
-VITE_BASE_URL='http://localhost:48081'
+VITE_BASE_URL='https://apidc.yixiang.co'
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 # 上传路径
-
-# 远端,本地
-VITE_UPLOAD_URL='https://api.ifoodme.com/admin-api/infra/file/upload'
-
-# 是否使用本地图片映射
-VITE_USE_LOCAL_IMAGES=true
-
-# 本地图片根目录
-VITE_LOCAL_IMAGE_BASE=https://api.ifoodme.com
+VITE_UPLOAD_URL='https://apidc.yixiang.co/admin-api/infra/file/upload'
 
 # 接口地址
 VITE_API_URL=/admin-api
@@ -39,7 +30,7 @@ VITE_BASE_PATH=/
 VITE_OUT_DIR=dist
 
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN='https://api.ifoodme.com'
+VITE_MALL_H5_DOMAIN='http://mall.yudao.yixiang.co'
 
 # 验证码的开关
-VITE_APP_CAPTCHA_ENABLE=false
+VITE_APP_CAPTCHA_ENABLE=true

+ 36 - 0
.env.local

@@ -0,0 +1,36 @@
+# 本地开发环境:本地启动所有项目(前端、后端、APP)时使用,不依赖外部环境
+NODE_ENV=development
+
+VITE_DEV=true
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48081'
+#VITE_BASE_URL='http://111.229.149.174:8082'
+#VITE_BASE_URL='https://apidc.yixiang.co'
+
+# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务
+VITE_UPLOAD_TYPE=server
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48081/admin-api/infra/file/upload'
+#VITE_UPLOAD_URL='https://apidc.yixiang.co/admin-api/infra/file/upload'
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 打包路径
+VITE_BASE_PATH=/
+
+# 商城H5会员端域名
+VITE_MALL_H5_DOMAIN='http://localhost:3000'
+
+# 验证码的开关
+VITE_APP_CAPTCHA_ENABLE=true

+ 3 - 9
.env.prod

@@ -4,18 +4,12 @@ NODE_ENV=production
 VITE_DEV=false
 
 # 请求路径
-VITE_BASE_URL='https://api.ifoodme.com'
+VITE_BASE_URL='http://localhost:48081'
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 # 上传路径
-VITE_UPLOAD_URL='https://api.ifoodme.com/admin-api/infra/file/upload'
-
-# 是否使用本地图片映射
-VITE_USE_LOCAL_IMAGES=true
-
-# 本地图片根目录
-VITE_LOCAL_IMAGE_BASE=https://api.ifoodme.com
+VITE_UPLOAD_URL='http://localhost:48081/admin-api/infra/file/upload'
 
 # 接口地址
 VITE_API_URL=/admin-api
@@ -36,4 +30,4 @@ VITE_BASE_PATH=/
 VITE_OUT_DIR=dist-prod
 
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN='https://api.ifoodme.com'
+VITE_MALL_H5_DOMAIN='https://apidc.dayouqiantu.cn'

+ 4 - 4
.env.stage

@@ -4,12 +4,12 @@ NODE_ENV=production
 VITE_DEV=false
 
 # 请求路径
-VITE_BASE_URL='https://api.ifoodme.com'
+VITE_BASE_URL='https://apidc.dayouqiantu.cn'
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 # 上传路径
-VITE_UPLOAD_URL='https://api.ifoodme.com/admin-api/infra/file/upload'
+VITE_UPLOAD_URL='https://apidc.dayouqiantu.cn/admin-api/infra/file/upload'
 
 # 接口地址
 VITE_API_URL=/admin-api
@@ -24,10 +24,10 @@ VITE_DROP_CONSOLE=true
 VITE_SOURCEMAP=false
 
 # 打包路径
-VITE_BASE_PATH='https://api.ifoodme.com'
+VITE_BASE_PATH='https://apidc.dayouqiantu.cn'
 
 # 输出路径
 VITE_OUT_DIR=dist-stage
 
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN='https://api.ifoodme.com'
+VITE_MALL_H5_DOMAIN='https://apidc.dayouqiantu.cn'

+ 3 - 3
.env.test

@@ -4,12 +4,12 @@ NODE_ENV=production
 VITE_DEV=false
 
 # 请求路径
-VITE_BASE_URL=''
+VITE_BASE_URL='http://localhost:48081'
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 # 上传路径
-VITE_UPLOAD_URL='/admin-api/infra/file/upload'
+VITE_UPLOAD_URL='http://localhost:48081/admin-api/infra/file/upload'
 
 # 接口地址
 VITE_API_URL=/admin-api
@@ -30,4 +30,4 @@ VITE_BASE_PATH=/admin-ui-vue3/
 VITE_OUT_DIR=dist-test
 
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN=''
+VITE_MALL_H5_DOMAIN='https://apidc.dayouqiantu.cn'

+ 1 - 2
.eslintignore

@@ -22,8 +22,7 @@ module.exports = defineConfig({
     'plugin:@typescript-eslint/recommended',
     'prettier',
     'plugin:prettier/recommended',
-    '@unocss',
-    '@unocss/eslint-config'
+    '@unocss'
   ],
   rules: {
     'vue/no-setup-props-destructure': 'off',

+ 1 - 2
.gitignore

@@ -2,10 +2,9 @@ node_modules
 .DS_Store
 dist
 dist-ssr
-*.local
+#*.local
 /dist*
 pnpm-debug
 auto-*.d.ts
 .idea
 .history
-*.zip

+ 4 - 26
.prettierignore

@@ -62,7 +62,7 @@
     "editor.defaultFormatter": "esbenp.prettier-vscode"
   },
   "[typescript]": {
-    "editor.defaultFormatter": "esbenp.prettier-vscode"
+    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
   },
   "[typescriptreact]": {
     "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
@@ -86,7 +86,7 @@
     "source.fixAll.eslint": "explicit"
   },
   "[vue]": {
-    "editor.defaultFormatter": "esbenp.prettier-vscode"
+    "editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
   },
   "i18n-ally.localesPaths": ["src/locales"],
   "i18n-ally.keystyle": "nested",
@@ -137,30 +137,8 @@
     "*.ts": "$(capture).test.ts, $(capture).test.tsx",
     "*.tsx": "$(capture).test.ts, $(capture).test.tsx",
     "*.env": "$(capture).env.*",
-    "package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
+    "package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
   },
   "terminal.integrated.scrollback": 10000,
-  "[shellscript]": {
-    "editor.defaultFormatter": "foxundermoon.shell-format"
-  },
-  "workbench.colorCustomizations": {
-    "activityBar.activeBackground": "#ab307e",
-    "activityBar.background": "#ab307e",
-    "activityBar.foreground": "#e7e7e7",
-    "activityBar.inactiveForeground": "#e7e7e799",
-    "activityBarBadge.background": "#25320e",
-    "activityBarBadge.foreground": "#e7e7e7",
-    "commandCenter.border": "#e7e7e799",
-    "sash.hoverBorder": "#ab307e",
-    "statusBar.background": "#832561",
-    "statusBar.foreground": "#e7e7e7",
-    "statusBarItem.hoverBackground": "#ab307e",
-    "statusBarItem.remoteBackground": "#832561",
-    "statusBarItem.remoteForeground": "#e7e7e7",
-    "titleBar.activeBackground": "#832561",
-    "titleBar.activeForeground": "#e7e7e7",
-    "titleBar.inactiveBackground": "#83256199",
-    "titleBar.inactiveForeground": "#e7e7e799"
-  },
-  "peacock.color": "#832561"
+  "nuxt.isNuxtApp": false
 }

+ 211 - 0
CLAUDE.md

@@ -0,0 +1,211 @@
+# YShop Drink Vue 管理后台 - Claude Code 配置
+
+> 2级子项目配置 | 继承自 yshop (1级)
+
+## 项目信息
+
+| 属性 | 值 |
+|------|-----|
+| 项目名称 | yshop-drink-vue |
+| 所属项目 | yshop |
+| 项目类型 | frontend (管理后台) |
+| 版本 | 3.2.3 |
+| Node 版本 | >= 16.0.0 |
+| 包管理器 | pnpm >= 8.6.0 |
+
+## 技术栈
+
+| 技术 | 版本 | 用途 |
+|------|------|------|
+| Vue | 3.4.21 | 核心框架 |
+| Vite | 5.1.4 | 构建工具 |
+| TypeScript | 5.3.3 | 类型系统 |
+| Element Plus | 2.6.1 | UI 组件库 |
+| Pinia | 2.1.7 | 状态管理 |
+| Vue Router | 4.3.0 | 路由管理 |
+| UnoCSS | 0.58.5 | 原子化 CSS |
+| Axios | 1.6.8 | HTTP 请求 |
+| ECharts | 5.5.0 | 图表 |
+| BPMN.js | 8.9.0 | 流程设计 |
+
+## 项目结构
+
+```
+yshop-drink-vue/
+├── src/
+│   ├── api/                   # API 接口定义
+│   ├── assets/                # 静态资源
+│   ├── components/            # 公共组件
+│   ├── config/                # 配置
+│   ├── directives/            # 自定义指令
+│   ├── hooks/                 # 组合式函数
+│   ├── layout/                # 布局组件
+│   ├── locales/               # 国际化
+│   ├── plugins/               # 插件
+│   ├── router/                # 路由配置
+│   ├── store/                 # Pinia 状态
+│   ├── styles/                # 全局样式
+│   ├── types/                 # TypeScript 类型
+│   ├── utils/                 # 工具函数
+│   ├── views/                 # 页面视图
+│   ├── App.vue                # 根组件
+│   ├── main.ts                # 入口文件
+│   └── permission.ts          # 权限控制
+├── public/                    # 公共资源
+├── types/                     # 全局类型定义
+├── vite.config.ts             # Vite 配置
+├── tsconfig.json              # TS 配置
+├── uno.config.ts              # UnoCSS 配置
+└── package.json
+```
+
+## 页面模块
+
+```
+src/views/
+├── mall/                      # 商城管理
+│   ├── product/               # 商品管理
+│   ├── order/                 # 订单管理
+│   ├── store/                 # 门店管理
+│   ├── shop/                  # 店铺设置
+│   ├── desk/                  # 桌号管理
+│   ├── member/                # 会员管理
+│   ├── coupon/                # 优惠券
+│   ├── cashier/               # 收银台
+│   └── statistics/            # 数据统计
+├── pay/                       # 支付管理
+├── market/                    # 营销管理
+├── score/                     # 积分管理
+├── mp/                        # 公众号管理
+├── message/                   # 消息管理
+├── express/                   # 物流管理
+├── system/                    # 系统设置
+├── infra/                     # 基础设施
+├── Login/                     # 登录页
+├── Home/                      # 首页
+├── Profile/                   # 个人中心
+└── Error/                     # 错误页
+```
+
+## 开发命令
+
+```bash
+# 安装依赖
+pnpm install
+
+# 本地开发
+pnpm dev
+
+# 连接开发服务器
+pnpm dev-server
+
+# 类型检查
+pnpm ts:check
+
+# 构建
+pnpm build:local      # 本地环境
+pnpm build:dev        # 开发环境
+pnpm build:test       # 测试环境
+pnpm build:prod       # 生产环境
+
+# 预览构建结果
+pnpm preview
+
+# 代码检查
+pnpm lint:eslint      # ESLint
+pnpm lint:format      # Prettier
+pnpm lint:style       # Stylelint
+
+# 清理
+pnpm clean            # 删除 node_modules
+pnpm clean:cache      # 清理缓存
+```
+
+## 环境配置
+
+```
+.env                  # 基础配置
+.env.dev              # 开发环境
+.env.test             # 测试环境
+.env.stage            # 预发布环境
+.env.prod             # 生产环境
+```
+
+## API 规范
+
+```typescript
+// src/api/mall/product/index.ts
+import request from '@/config/axios'
+
+// 获取商品列表
+export const getProductPage = (params: ProductPageReqVO) => {
+  return request.get({ url: '/mall/product/page', params })
+}
+
+// 创建商品
+export const createProduct = (data: ProductVO) => {
+  return request.post({ url: '/mall/product/create', data })
+}
+```
+
+## 组件规范
+
+```vue
+<template>
+  <ContentWrap>
+    <!-- 内容 -->
+  </ContentWrap>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue'
+import * as ProductApi from '@/api/mall/product'
+
+defineOptions({ name: 'ProductList' })
+
+const loading = ref(false)
+const list = ref([])
+
+const getList = async () => {
+  loading.value = true
+  try {
+    list.value = await ProductApi.getProductPage({})
+  } finally {
+    loading.value = false
+  }
+}
+
+onMounted(() => {
+  getList()
+})
+</script>
+```
+
+## 权限控制
+
+```typescript
+// 按钮权限
+<el-button v-hasPermi="['mall:product:create']">新增</el-button>
+
+// 路由权限 (在菜单配置中设置)
+```
+
+## 主要功能
+
+| 模块 | 功能 |
+|------|------|
+| 商品管理 | CRUD、规格、分类、库存 |
+| 订单管理 | 列表、详情、发货、退款 |
+| 门店管理 | 门店信息、营业时间、结算 |
+| 桌号管理 | 桌号、二维码 |
+| 会员管理 | 会员列表、等级、余额 |
+| 优惠券 | 发券、核销 |
+| 收银台 | 堂食点餐 |
+| 数据统计 | 销售报表、趋势图 |
+
+## 核心文档
+
+| 文档 | 位置 | 内容 |
+|------|------|------|
+| 系统架构 | `../architecture.canvas` | 整体架构图 |
+| 后端 API | Swagger UI | 接口文档 |

+ 2 - 3
README.md

@@ -1,4 +1,3 @@
-onlineOrder
-订餐系统,类似肯德基点餐小程序模式,支持多门店模式,基础技术Java,uniapp(支持H5、微信小程序)
+意向订餐系统,类似肯德基点餐小程序模式,支持多门店模式,基础技术Java,uniapp(支持H5、微信小程序)
 采用当前流行技术组合的前后端分离点餐系统: SpringBoot3+jdk17+vue3、Spring Security OAuth2、MybatisPlus、SpringSecurity、jwt、redis、Vue3的前后端分离的系统,
-包含店铺管理、积分兑换、云小票打印、图片素材库、订单管理、多规格sku、积分、优惠券、充值、多门店、微信公众号等功能
+包含店铺管理、积分兑换、云小票打印、图片素材库、订单管理、多规格sku、积分、优惠券、充值、多门店、微信公众号等功能,更适合企业或个人二次开发.

+ 4 - 4
build/vite/index.ts

@@ -7,11 +7,11 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta
       name="keywords"
-      content="Tabemate Pro  オーダーシステム"
+      content="yshop管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
     />
     <meta
       name="description"
-      content="Tabemate Pro  オーダーシステム"
+      content="YSHOP管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
     />
     <title>%VITE_APP_TITLE%</title>
   </head>
@@ -136,8 +136,8 @@
       <div class="app-loading">
         <div class="app-loading-wrap">
           <div class="app-loading-title">
-            <img src="/logo111.gif" class="app-loading-logo" alt="Logo" />
-            <div class="app-loading-title">Tabemate Pro  オーダーシステムへようこそ</div>
+            <img src="/logo.gif" class="app-loading-logo" alt="Logo" />
+            <div class="app-loading-title">%VITE_APP_TITLE%</div>
           </div>
           <div class="app-loading-item">
             <div class="app-loading-outter"></div>

+ 57 - 60
package.json

@@ -1,6 +1,6 @@
 {
   "name": "yshop-drink-vue3",
-  "version": "3.1.1",
+  "version": "3.2.3",
   "description": "基于vue3、vite4、element-plus、typesScript",
   "author": "yshop",
   "private": false,
@@ -22,103 +22,101 @@
     "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
     "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
     "lint:style": "stylelint --fix \"./src/**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
-    "lint:lint-staged": "lint-staged -c ",
-    "deploy": "./bash/run.sh"
+    "lint:lint-staged": "lint-staged -c "
   },
   "dependencies": {
-    "@element-plus/icons-vue": "^2.3.1",
-    "@form-create/designer": "^3.2.10",
-    "@form-create/element-ui": "^3.2.18",
+    "@element-plus/icons-vue": "^2.1.0",
+    "@form-create/designer": "^3.1.3",
+    "@form-create/element-ui": "^3.1.24",
     "@iconify/iconify": "^3.1.1",
     "@videojs-player/vue": "^1.0.0",
-    "@vueuse/core": "^10.11.1",
+    "@vueuse/core": "^10.9.0",
+    "@vueuse/sound": "^2.1.3",
     "@wangeditor/editor": "^5.1.23",
-    "@wangeditor/editor-for-vue": "^5.1.12",
+    "@wangeditor/editor-for-vue": "^5.1.10",
     "@zxcvbn-ts/core": "^3.0.4",
     "animate.css": "^4.1.1",
-    "axios": "^1.7.9",
+    "axios": "^1.6.8",
     "benz-amr-recorder": "^1.1.5",
     "bpmn-js-token-simulation": "^0.10.0",
     "camunda-bpmn-moddle": "^7.0.1",
-    "cropperjs": "^1.6.2",
+    "cropperjs": "^1.6.1",
     "crypto-js": "^4.2.0",
-    "dayjs": "^1.11.13",
-    "diagram-js": "^12.8.1",
-    "driver.js": "^1.3.5",
-    "echarts": "^5.6.0",
+    "dayjs": "^1.11.10",
+    "diagram-js": "^12.8.0",
+    "driver.js": "^1.3.1",
+    "echarts": "^5.5.0",
     "echarts-wordcloud": "^2.1.0",
     "element-plus": "2.6.1",
-    "fast-xml-parser": "^4.5.1",
-    "highlight.js": "^11.11.1",
+    "fast-xml-parser": "^4.3.2",
+    "highlight.js": "^11.9.0",
     "jsencrypt": "^3.3.2",
     "lodash-es": "^4.17.21",
-    "min-dash": "^4.2.2",
+    "min-dash": "^4.1.1",
     "mitt": "^3.0.1",
     "nprogress": "^0.2.0",
-    "pinia": "^2.3.1",
-    "pinia-plugin-persistedstate": "^3.2.3",
-    "qrcode": "^1.5.4",
-    "qs": "^6.14.0",
+    "pinia": "^2.1.7",
+    "pinia-plugin-persistedstate": "^3.2.1",
+    "qrcode": "^1.5.3",
+    "qs": "^6.12.0",
     "steady-xml": "^0.1.0",
-    "url": "^0.11.4",
-    "video.js": "^7.21.6",
+    "url": "^0.11.3",
+    "video.js": "^7.21.5",
     "vue": "3.4.21",
-    "vue-baidu-map-3x": "^1.0.40",
+    "vue-baidu-map-3x": "^1.0.34",
     "vue-dompurify-html": "^4.1.4",
     "vue-i18n": "9.10.2",
-    "vue-router": "^4.5.0",
-    "vue-types": "^5.1.3",
+    "vue-router": "^4.3.0",
+    "vue-types": "^5.1.1",
     "vue-ueditor-wrap": "^3.0.8",
     "vuedraggable": "^4.1.0",
     "web-storage-cache": "^1.1.1",
     "xml-js": "^1.6.11"
   },
   "devDependencies": {
-    "@commitlint/cli": "^19.7.1",
-    "@commitlint/config-conventional": "^19.7.1",
-    "@iconify/json": "^2.2.307",
+    "@commitlint/cli": "^19.0.1",
+    "@commitlint/config-conventional": "^19.0.0",
+    "@iconify/json": "^2.2.187",
     "@intlify/unplugin-vue-i18n": "^2.0.0",
     "@purge-icons/generated": "^0.9.0",
     "@types/lodash-es": "^4.17.12",
-    "@types/node": "^20.17.19",
+    "@types/node": "^20.11.21",
     "@types/nprogress": "^0.2.3",
     "@types/qrcode": "^1.5.5",
-    "@types/qs": "^6.9.18",
-    "@typescript-eslint/eslint-plugin": "^7.18.0",
-    "@typescript-eslint/parser": "^7.18.0",
-    "@unocss/eslint-config": "^0.57.7",
-    "@unocss/eslint-plugin": "^66.0.0",
-    "@unocss/transformer-variant-group": "^0.58.9",
-    "@vitejs/plugin-legacy": "^5.4.3",
-    "@vitejs/plugin-vue": "^5.2.1",
+    "@types/qs": "^6.9.12",
+    "@typescript-eslint/eslint-plugin": "^7.1.0",
+    "@typescript-eslint/parser": "^7.1.0",
+    "@unocss/eslint-config": "^0.57.4",
+    "@unocss/transformer-variant-group": "^0.58.5",
+    "@vitejs/plugin-legacy": "^5.3.1",
+    "@vitejs/plugin-vue": "^5.0.4",
     "@vitejs/plugin-vue-jsx": "^3.1.0",
-    "autoprefixer": "^10.4.20",
+    "autoprefixer": "^10.4.17",
     "bpmn-js": "8.9.0",
     "bpmn-js-properties-panel": "0.46.0",
-    "consola": "^3.4.0",
-    "eslint": "^8.57.1",
+    "consola": "^3.2.3",
+    "eslint": "^8.57.0",
     "eslint-config-prettier": "^9.1.0",
     "eslint-define-config": "^2.1.0",
-    "eslint-plugin-prettier": "^5.2.3",
-    "eslint-plugin-vue": "^9.32.0",
-    "lint-staged": "^15.4.3",
-    "postcss": "^8.5.2",
-    "postcss-html": "^1.8.0",
+    "eslint-plugin-prettier": "^5.1.3",
+    "eslint-plugin-vue": "^9.22.0",
+    "lint-staged": "^15.2.2",
+    "postcss": "^8.4.35",
+    "postcss-html": "^1.6.0",
     "postcss-scss": "^4.0.9",
-    "prettier": "^3.5.1",
+    "prettier": "^3.2.5",
     "prettier-eslint": "^16.3.0",
-    "rimraf": "^5.0.10",
-    "rollup": "^4.34.7",
-    "sass": "^1.85.0",
-    "stylelint": "^16.14.1",
+    "rimraf": "^5.0.5",
+    "rollup": "^4.12.0",
+    "sass": "^1.69.5",
+    "stylelint": "^16.2.1",
     "stylelint-config-html": "^1.1.0",
-    "stylelint-config-recommended": "^14.0.1",
-    "stylelint-config-standard": "^36.0.1",
-    "stylelint-config-standard-scss": "^14.0.0",
+    "stylelint-config-recommended": "^14.0.0",
+    "stylelint-config-standard": "^36.0.0",
     "stylelint-order": "^6.0.4",
-    "terser": "^5.39.0",
+    "terser": "^5.28.1",
     "typescript": "5.3.3",
-    "unocss": "^0.58.9",
+    "unocss": "^0.58.5",
     "unplugin-auto-import": "^0.16.7",
     "unplugin-element-plus": "^0.8.0",
     "unplugin-vue-components": "^0.25.2",
@@ -129,9 +127,8 @@
     "vite-plugin-progress": "^0.0.7",
     "vite-plugin-purge-icons": "^0.10.0",
     "vite-plugin-svg-icons": "^2.0.1",
-    "vite-plugin-top-level-await": "^1.5.0",
-    "vite-plugin-vue-devtools": "^7.7.0",
-    "vue-eslint-parser": "^9.4.3",
+    "vite-plugin-top-level-await": "^1.3.1",
+    "vue-eslint-parser": "^9.3.2",
     "vue-tsc": "^1.8.27"
   },
   "license": "MIT",
@@ -147,4 +144,4 @@
     "node": ">= 16.0.0",
     "pnpm": ">=8.6.0"
   }
-}
+}

Різницю між файлами не показано, бо вона завелика
+ 1665 - 666
pnpm-lock.yaml


+ 1 - 1
postcss.config.js

@@ -1,5 +1,5 @@
 module.exports = {
-  printWidth: 140, // 每行代码长度(默认80)
+  printWidth: 100, // 每行代码长度(默认80)
   tabWidth: 2, // 每个tab相当于多少个空格(默认2)ab进行缩进(默认false)
   useTabs: false, // 是否使用tab
   semi: false, // 声明结尾使用分号(默认true)

BIN
public/UEditor/dialogs/anchor/anchor.html


+ 0 - 60
public/local-images/README.md

@@ -1,60 +0,0 @@
-# 本地图片目录
-
-> 作者:系统开发团队  
-> 日期:2023-05-15  
-> 版本:1.0.0
-
-这个目录用于存放本地图片,用于替换远程图片URL。主要用于开发环境中,可以提高开发效率,避免频繁请求远程图片。
-
-## 目录结构
-
-请按照以下结构组织图片:
-
-```
-local-images/
-  1/  # 对应服务器上的图片ID目录
-    image1.jpg
-    image2.png
-  2/
-    image3.jpg
-  ...
-  custom/  # 自定义目录,用于特殊映射
-    special-example.jpg
-```
-
-## 使用方法
-
-1. 将远程图片下载到本地
-2. 按照原始URL中的ID和文件名组织目录结构
-3. 在环境变量中设置 `VITE_USE_LOCAL_IMAGES=true` 启用本地图片映射
-
-## 映射规则
-
-系统支持两种映射方式:
-
-1. **URL前缀替换**:将远程URL中的API基础路径替换为本地路径
-2. **特定路径模式匹配**:根据特定的URL模式提取路径信息,构建本地路径
-3. **特定映射配置**:在 `src/config/image-mapping.ts` 中配置特定的映射规则
-
-## 示例
-
-### 基本映射
-
-远程URL: `http://localhost:48081/admin-api/infra/file/1/get/example.jpg`  
-本地路径: `/local-images/1/example.jpg`
-
-### 特定映射
-
-在 `src/config/image-mapping.ts` 中配置:
-
-```typescript
-export const imageMapping: Record<string, string> = {
-  'http://localhost:48081/admin-api/infra/file/1/get/example.jpg': '/local-images/custom/special-example.jpg'
-}
-```
-
-## 注意事项
-
-1. 本地图片映射功能仅在开发环境中启用,生产环境中将使用远程图片
-2. 确保本地图片与远程图片保持一致,避免显示差异
-3. 定期更新本地图片,与远程图片保持同步 

BIN
public/logo.gif


BIN
public/logo111.gif


+ 1 - 1
public/voice_new_order.mp3

@@ -1,7 +1,7 @@
 import request from '@/config/axios'
 
 export interface DataSourceConfigVO {
-  id: number
+  id: number | undefined
   name: string
   url: string
   username: string

+ 1 - 5
src/api/infra/demo/demo01/index.ts

@@ -1,6 +1,6 @@
 import request from '@/config/axios'
 import { getRefreshToken } from '@/utils/auth'
-import type { UserLoginVO, UserRegisterVO } from './types'
+import type { UserLoginVO } from './types'
 
 export interface SmsCodeVO {
   mobile: string
@@ -17,10 +17,6 @@ export const login = (data: UserLoginVO) => {
   return request.post({ url: '/system/auth/login', data })
 }
 
-export const register = (data: UserRegisterVO) => {
-  return request.post({ url: '/system/auth/register', data })
-}
-
 // 刷新访问令牌
 export const refreshToken = () => {
   return request.post({ url: '/system/auth/refresh-token?refreshToken=' + getRefreshToken() })

+ 0 - 6
src/api/login/oauth2/index.ts

@@ -7,12 +7,6 @@ export type UserLoginVO = {
   socialState?: string
 }
 
-export type UserRegisterVO = {
-  mobile: string
-  password: string
-  code?: string
-}
-
 export type TokenType = {
   id: number // 编号
   accessToken: string // 访问令牌

+ 4 - 0
src/api/mall/cashier/index.ts

@@ -40,6 +40,10 @@ export const createOrder = async (data) => {
   return await request.post({ url: `/cashier/createOrder`, data })
 }
 
+export const updateOrder = async (data) => {
+  return await request.post({ url: `/cashier/updateOrder`, data })
+}
+
 export const pay = async (data) => {
   return await request.post({ url: `/cashier/pay`, data })
 }

+ 6 - 0
src/api/mall/coupon/index.ts

@@ -67,3 +67,9 @@ export const downloadQrcode = (id) => {
   return request.download({ url: `/desk/shop-desk/download?id=` + id })
 }
 
+
+export const changeDesk = (params) => {
+  return request.get({ url: `/order/store-order/changeDesk`,params})
+}
+
+

+ 33 - 219
src/api/mall/desk/shopdeskcategory/index.ts

@@ -8,8 +8,6 @@ export interface StoreOrderVO {
   realName: string
   userPhone: string
   userAddress: string
-  createTime: any
-  dueTime: any
   cartId: string
   freightPrice: number
   totalNum: number
@@ -20,11 +18,11 @@ export interface StoreOrderVO {
   deductionPrice: number
   couponId: number
   couponPrice: number
-  paid: any
+  paid: byte
   payTime: Date
   payType: string
   status: boolean
-  refundStatus: any
+  refundStatus: byte
   refundReasonWapImg: string
   refundReasonWapExplain: string
   refundReasonTime: Date
@@ -51,13 +49,10 @@ export interface StoreOrderVO {
   verifyCode: string
   storeId: number
   shippingType: boolean
-  isChannel: boolean
+  isChannel: byte
   isSystemDel: boolean
 }
 
-export interface StoreOrderPageReqVO {
-
-}
 // 查询订单列表
 export const getStoreOrderPage = async (params: StoreOrderPageReqVO) => {
   return await request.get({ url: `/order/store-order/page`, params })
@@ -68,176 +63,8 @@ export const getStoreOrder = async (id: number) => {
   return await request.get({ url: `/order/store-order/get?id=` + id })
 }
 
-export interface IOrder {
-  orderId: string
-  extendOrderId: string
-  uid: number
-  realName: string
-  userPhone: string
-  statusStr: string
-  userAddress: string
-  cartId: string
-  freightPrice: number
-  totalNum: number
-  totalPrice: number
-  totalPostage: number
-  payPrice: number
-  payPostage: number
-  deductionPrice: number
-  couponId: number
-  couponPrice: number
-  paid: number
-  payTime: any // date-time
-  payType: string
-  status: number
-  refundStatus: number
-  refundReasonWapImg: string
-  refundReasonWapExplain: string
-  refundReasonTime: string // date-time
-  refundReasonWap: string
-  refundReason: string
-  refundPrice: number
-  deliverySn: string
-  deliveryName: string
-  deliveryType: string
-  deliveryId: string
-  gainIntegral: number
-  useIntegral: number
-  payIntegral: number
-  backIntegral: number
-  mark: string
-  unique: string
-  remark: string
-  merId: number
-  combinationId: number
-  pinkId: number
-  cost: number
-  seckillId: number
-  bargainId: number
-  verifyCode: string
-  storeId: number
-  shippingType: number
-  isChannel: number
-  isSystemDel: number
-  orderType: string
-  numberId: number
-  shopId: number
-  shopName: string
-  getTime: string // date-time
-  deskId: number
-  deskNumber: string
-  deskPeople: number
-  reachTime: string
-  /**
-   * 预约时间
-   */
-  dueTime: any
-  dueStatus: number
-  createTime: any // date-time
-  id: number
-
-  userRespVO: UserRespVO
-  storeOrderCartInfoDOList: StoreOrderCartInfoDO[]
-  shopDeskDO: ShopDeskDO
-  appDeskOrderVo: AppDeskOrderVo[]
-}
-
-interface UserRespVO {
-  id: number
-  username: string
-  nickname: string
-  remark: string
-  deptId: number
-  deptName: string
-  postIds: number[]
-  email: string
-  mobile: string
-  sex: number
-  avatar: string
-  status: number
-  loginIp: string
-  loginDate: string
-  createTime: string
-}
-
-export interface StoreOrderCartInfoDO {
-  id: number
-  oid: number
-  orderId: string
-  cartId: number
-  productId: number
-  cartInfo: string
-  unique: string
-  isAfterSales: number
-  title: string
-  image: string
-  number: number
-  spec: string
-  price: number
-  addProductMark: number
-  isOrder: number
-  uid: number
-  uidType: string
-  addTime: string
-  unickname: string
-  uavatar: string
-}
-
-interface ShopDeskDO {
-  createTime: string
-  updateTime: string
-  creator: string
-  updater: string
-  deleted: boolean
-  id: number
-  shopId: number
-  shopName: string
-  cateId: number
-  cateName: string
-  title: string
-  image: string
-  number: string
-  miniQrcode: string
-  h5Qrcode: string
-  aliQrcode: string
-  note: string
-  orderCount: number
-  costAmount: number
-  lastOrderNo: string
-  lastOrderTime: string
-  lastOrderStatus: number
-  status: number
-  dueStatus: number
-  dueTime: string
-  reachTime: string
-}
-
-interface AppDeskOrderVo {
-  uid: number
-  addTime: any
-  uavatar: string
-  unickname: string
-  isOrder: number
-  uidType: string
-  addProductMark: number
-  appDeskOrderGoodsVos: AppDeskOrderGoodsVo[]
-}
-
-interface AppDeskOrderGoodsVo {
-  id: number
-  title: string
-  image: string
-  number: number
-  price: number
-  spec: string
-  unickname: string
-  uavatar: string
-  statusStr: string
-}
-
-// 查询订单详情
 export const getStoreOrderInfo = async (id) => {
-  return await request.get<IOrder>({ url: `/order/store-order/getInfo?orderId=` + id })
+  return await request.get({ url: `/order/store-order/getInfo?orderId=` + id })
 }
 
 // 新增订单
@@ -250,43 +77,13 @@ export const updateStoreOrder = async (data: StoreOrderVO) => {
   return await request.put({ url: `/order/store-order/update`, data })
 }
 
-// 修改订单
-export const printStoreOrder = async (data: StoreOrderVO) => {
-  return await request.put({ url: `/order/store-order/print`, data })
-}
-
 // 删除订单
 export const deleteStoreOrder = async (id: number) => {
   return await request.delete({ url: `/order/store-order/delete?id=` + id })
 }
 
-export enum EPAY_TYPE {
-  // 现金支付
-  CASH = 'cash',
-  // Paypay支付
-  PAYPAY = 'paypay',
-  // 信用卡支付
-  CREDIT = 'credit_card',
-  // 西瓜卡支付
-  SUICA = 'suica',
-  // ID支付
-  ID = 'id',
-  // 日本快捷支付
-  QUICKPAY = 'quick_pay',
-  // 乐天支付
-  RAKUTENPAY = 'rekuten_pay '
-}
-export interface IPayStoreOrderQueryParams {
-  id: number
-  payType: EPAY_TYPE
-}
-
-export const payStoreOrderWithPayType = async (data: IPayStoreOrderQueryParams) => {
-  return await request.post({ url: `/order/store-order/pay`, data })
-}
-
 export const payStoreOrder = async (id: number) => {
-  return await request.get({ url: `/order/store-order/pay?id=`, id })
+  return await request.get({ url: `/order/store-order/pay?id=` + id })
 }
 
 export const takeStoreOrder = async (id: number) => {
@@ -294,42 +91,59 @@ export const takeStoreOrder = async (id: number) => {
 }
 
 export const rufundStoreOrder = async (data) => {
-  return await request.post({ url: `/order/store-order/refund`, data })
+  return await request.post({ url: `/order/store-order/refund`,data })
 }
 
+
 export const getStoreOrderRecordList = async (id: number) => {
   return await request.get({ url: `/order/store-order/record-list?id=` + id })
 }
 
+
+
 // 导出订单 Excel
 export const exportStoreOrder = async (params) => {
   return await request.download({ url: `/order/store-order/export-excel`, params })
 }
 
-export const getLogistic = async (param1, param2) => {
-  return await request.get({ url: `/order/express/getLogistic?shipperCode=` + param1 + `&logisticCode=` + param2 })
+export const getLogistic = async (param1,param2) => {
+  return await request.get({ url: `/order/express/getLogistic?shipperCode=` + param1 + `&logisticCode=` + param2})
 }
 
-export const getOrderHtml = async (param1, param2) => {
-  return await request.get({ url: `/order/store-order/printOrder?id=` + param1 + `&electId=` + param2 })
+export const getOrderHtml = async (param1,param2) => {
+  return await request.get({ url: `/order/store-order/printOrder?id=` + param1 + `&electId=` + param2})
 }
 
 export const getShopCount = async () => {
-  return await request.get({ url: `/order/store-order/count` })
+  return await request.get({ url: `/order/store-order/count`})
 }
 
 export const orderNoticeUrl = async () => {
-  return await request.get({ url: `/order/store-order/notice` })
+  return await request.get({ url: `/order/store-order/notice`})
 }
 
 export const orderDueCancel = async (id: number) => {
   return await request.get({ url: `/order/store-order/dueCancel?id=` + id })
 }
 
-export interface IPrintOrderByIdQueryParams {
-  id: number
+export const printOrder = async (id: number) => {
+  return await request.get({ url: `/order/store-order/print?id=` + id })
 }
 
-export const printOrderById = async (data: IPrintOrderByIdQueryParams) => {
-  return await request.post({ url: `/order/store-order/print`, data })
+export const clearDesk = async (id: number) => {
+  return await request.get({ url: `/order/store-order/clearDesk?id=` + id })
 }
+
+export const getDeskOrders = async (id: number) => {
+  return await request.get({ url: `/order/store-order/list?deskId=` + id })
+}
+
+export const getDueOrderCount = async (id: number) => {
+  return await request.get({ url: `/order/store-order/getDueOrderCount?deskId=` + id })
+}
+
+export const todayDueOrder = async (id) => {
+  return await request.get({ url: `/order/store-order/todayDueOrder?orderId=` + id })
+}
+
+

+ 21 - 0
src/api/mall/order/storeOrder/statistics.ts

@@ -0,0 +1,21 @@
+import request from '@/config/axios'
+
+
+// 获取销量概况
+export const getSales = async (params) => {
+  return await request.get({ url: `/shop/statistics/sale`, params })
+}
+
+// 获取订单概况
+export const getOrder = async (params) => {
+  return await request.get({ url: `/shop/statistics/order`, params })
+}
+
+// 获取商品概况
+export const getProduct = async (params) => {
+  return await request.get({ url: `/shop/statistics/product`, params })
+}
+
+
+
+

+ 2 - 2
src/api/mall/product/brand.ts

@@ -42,8 +42,8 @@ export const exportWebPrint = async (params) => {
 }
 
 // 查询redis配置
-export const getRedisSet = async () => {
-  return await request.get({ url: `/store/web-print/getRedisSet`})
+export const getRedisSet = async (brand) => {
+  return await request.get({ url: `/store/web-print/getRedisSet?brand=` + brand})
 }
 
 // 新增易联云打印机

+ 4 - 0
src/api/mall/store/withdrawal/index.ts

@@ -42,3 +42,7 @@ export const deleteWithdrawal = async (id: number) => {
 export const exportWithdrawal = async (params) => {
   return await request.download({ url: `/store/withdrawal/export-excel`, params })
 }
+
+export const checkBill = async (id: number) => {
+  return await request.get({ url: `/store/withdrawal/checkBill?id=` + id })
+}

+ 12 - 0
src/api/market/vipCard/index.ts

@@ -29,3 +29,15 @@ export const syncUser = (accountId) => {
     url: '/mp/user/sync?accountId=' + accountId
   })
 }
+
+export const addAdmin = (ids) => {
+  return request.get({
+    url: '/mp/user/addAdmin',
+    params: ids
+  })
+}
+
+export const delAdmin = async (id: number) => {
+  return await request.delete({ url: `/mp/user/delAdmin?id=` + id })
+}
+

+ 1 - 0
src/api/pay/merchantDetails/index.ts

@@ -17,6 +17,7 @@ export async function getPage(query) {
 export async function addObj(obj) {
   return await request.post({
     url: '/shop/material/create',
+
     data: obj
   })
 }

BIN
src/api/tools/materialgroup.js


BIN
src/assets/imgs/diy/app-nav-bar-mp.png


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/imgs/profile.jpg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/icon.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/on_good.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/order.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/pay-success.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/payed_goods.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/peoples.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/sales.svg


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/assets/svgs/scan.svg


+ 2 - 2
src/assets/svgs/weixin.svg

@@ -44,8 +44,8 @@
     </div>
     <!-- 底部对话框操作按钮 -->
     <template #footer>
-      <el-button type="primary" @click="handleSubmit">{{t('common.confirm')}}</el-button>
-      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      <el-button type="primary" @click="handleSubmit">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
   <Dialog v-model="detailSelectDialog.visible" title="" width="50%">

+ 8 - 8
src/components/AppLinkInput/data.ts

@@ -546,7 +546,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item :label="t('mall.type')">
+            <el-form-item label="类型">
               <el-radio-group v-model="cronValue.second.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -605,7 +605,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item :label="t('mall.type')">
+            <el-form-item label="类型">
               <el-radio-group v-model="cronValue.minute.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -664,7 +664,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item :label="t('mall.type')">
+            <el-form-item label="类型">
               <el-radio-group v-model="cronValue.hour.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -723,7 +723,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item :label="t('mall.type')">
+            <el-form-item label="类型">
               <el-radio-group v-model="cronValue.day.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -784,7 +784,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item :label="t('mall.type')">
+            <el-form-item label="类型">
               <el-radio-group v-model="cronValue.month.type">
                 <el-radio-button label="0">任意值</el-radio-button>
                 <el-radio-button label="1">范围</el-radio-button>
@@ -844,7 +844,7 @@ const inputChange = () => {
           </template>
           <el-form>
             <el-form>
-              <el-form-item :label="t('mall.type')">
+              <el-form-item label="类型">
                 <el-radio-group v-model="cronValue.week.type">
                   <el-radio-button label="0">任意值</el-radio-button>
                   <el-radio-button label="1">范围</el-radio-button>
@@ -923,7 +923,7 @@ const inputChange = () => {
             </div>
           </template>
           <el-form>
-            <el-form-item :label="t('mall.type')">
+            <el-form-item label="类型">
               <el-radio-group v-model="cronValue.year.type">
                 <el-radio-button label="-1">忽略</el-radio-button>
                 <el-radio-button label="0">任意值</el-radio-button>
@@ -963,7 +963,7 @@ const inputChange = () => {
     </div>
 
     <template #footer>
-      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
       <el-button type="primary" @click="submit()">确 认</el-button>
     </template>
   </el-dialog>

+ 2 - 2
src/components/Cropper/index.ts

@@ -95,7 +95,7 @@
         </div>
         <div :class="`${prefixCls}-right`">
           <div :class="`${prefixCls}-preview`">
-            <img v-if="previewSource" :alt="t('cropper.preview')" :src="convertImageUrl(previewSource)" />
+            <img v-if="previewSource" :alt="t('cropper.preview')" :src="previewSource" />
           </div>
           <template v-if="previewSource">
             <div :class="`${prefixCls}-group`">
@@ -120,7 +120,7 @@ import { useI18n } from 'vue-i18n'
 import type { CropendResult, Cropper } from './types'
 import { propTypes } from '@/utils/propTypes'
 import { CropperImage } from '@/components/Cropper'
-import { convertImageUrl } from '@/utils/image-helper'
+
 defineOptions({ name: 'CopperModal' })
 
 const props = defineProps({

+ 2 - 2
src/components/Cropper/src/Cropper.vue

@@ -5,7 +5,7 @@
       ref="imgElRef"
       :alt="alt"
       :crossorigin="crossorigin"
-      :src="convertImageUrl(src)"
+      :src="src"
       :style="getImageStyle"
     />
   </div>
@@ -17,7 +17,7 @@ import 'cropperjs/dist/cropper.css'
 import { useDesign } from '@/hooks/web/useDesign'
 import { propTypes } from '@/utils/propTypes'
 import { useDebounceFn } from '@vueuse/core'
-import { convertImageUrl } from '@/utils/image-helper'
+
 defineOptions({ name: 'Cropper' })
 
 type Options = Cropper.Options

+ 1 - 1
src/components/Cropper/src/CropperAvatar.vue

@@ -97,7 +97,7 @@ $prefix-cls: #{$namespace}--cropper-avatar;
     opacity: 0;
     transition: opacity 0.4s;
 
-    :deep(svg) {
+    ::v-deep(svg) {
       margin: auto;
     }
   }

+ 2 - 1
src/components/Cropper/src/types.ts

@@ -9,7 +9,7 @@ const props = defineProps({
   modelValue: propTypes.bool.def(false),
   title: propTypes.string.def('Dialog'),
   fullscreen: propTypes.bool.def(true),
-  width: propTypes.oneOfType([String, Number]).def('85%'),
+  width: propTypes.oneOfType([String, Number]).def('40%'),
   scroll: propTypes.bool.def(false), // 是否开启滚动条。如果是的话,按照 maxHeight 设置最大高度
   maxHeight: propTypes.oneOfType([String, Number]).def('400px')
 })
@@ -105,6 +105,7 @@ const dialogStyle = computed(() => {
     </template>
   </ElDialog>
 </template>
+
 <style lang="scss">
 .com-dialog {
   .#{$elNamespace}-overlay-dialog {

+ 33 - 50
src/components/DictTag/index.ts

@@ -1,77 +1,60 @@
 <script lang="tsx">
-import { defineComponent, PropType, computed } from 'vue'
+import { defineComponent, PropType, ref } from 'vue'
 import { isHexColor } from '@/utils/color'
 import { ElTag } from 'element-plus'
-import { getDictOptions, getDictObj } from '@/utils/dict'
-import type { CSSProperties } from 'vue'
+import { DictDataType, getDictOptions } from '@/utils/dict'
 
 export default defineComponent({
   name: 'DictTag',
   props: {
-    // 字典类型
     type: {
-      type: String,
+      type: String as PropType<string>,
       required: true
     },
-    // 字典值
     value: {
-      type: [String, Number, Boolean],
+      type: [String, Number, Boolean] as PropType<string | number | boolean>,
       required: true
-    },
-    // 自定义 Tag 的样式
-    style: {
-      type: Object as PropType<CSSProperties>,
-      default: () => ({})
     }
   },
   setup(props) {
-    // 获取字典数据
-    const dictOptions = computed(() => {
-      return getDictOptions(props.type)
-    })
-
-    // 获取字典对象
-    const dictObj = computed(() => {
-      if (props.value === undefined || props.value === null) {
+    const dictData = ref<DictDataType>()
+    const getDictObj = (dictType: string, value: string) => {
+      const dictOptions = getDictOptions(dictType)
+      dictOptions.forEach((dict: DictDataType) => {
+        if (dict.value === value) {
+          if (dict.colorType + '' === 'primary' || dict.colorType + '' === 'default') {
+            dict.colorType = ''
+          }
+          dictData.value = dict
+        }
+      })
+    }
+    const rederDictTag = () => {
+      if (!props.type) {
         return null
       }
-      return getDictObj(props.type, props.value.toString())
-    })
-
-    // 标签文本
-    const label = computed(() => {
-      return dictObj.value?.label || ''
-    })
-
-    // 标签类型
-    const type = computed(() => {
-      return dictObj.value?.tag || ''
-    })
-
-    // 标签颜色
-    const color = computed(() => {
-      return dictObj.value?.color || ''
-    })
-
-    // 渲染函数
-    return () => {
-      if (!props.type || props.value === undefined || props.value === null) {
+      // 解决自定义字典标签值为零时标签不渲染的问题
+      if (props.value === undefined || props.value === null) {
         return null
       }
-
-      // 只有当 type 有值且是有效的类型时才传递 type 属性
-      const validTypes = ['primary', 'success', 'info', 'warning', 'danger']
-      const tagProps = type.value && validTypes.includes(type.value) ? { type: type.value } : { type: 'info' } // 默认使用 info 类型
-
+      getDictObj(props.type, props.value.toString())
       // 添加标签的文字颜色为白色,解决自定义背景颜色时标签文字看不清的问题
-      const style = color.value && isHexColor(color.value) ? { ...props.style, color: '#fff' } : props.style
-
       return (
-        <ElTag style={style} {...tagProps} color={color.value && isHexColor(color.value) ? color.value : ''} disableTransitions={true}>
-          {label.value}
+        <ElTag
+          style={dictData.value?.cssClass ? 'color: #fff' : ''}
+          type={dictData.value?.colorType}
+          color={
+            dictData.value?.cssClass && isHexColor(dictData.value?.cssClass)
+              ? dictData.value?.cssClass
+              : ''
+          }
+          disableTransitions={true}
+        >
+          {dictData.value?.label}
         </ElTag>
       )
     }
+    return () => rederDictTag()
   }
 })
 </script>

+ 1 - 1
src/components/DocAlert/index.vue

@@ -39,7 +39,7 @@
       :disabled="limit > 0 && formData.length >= limit"
       @click="handleAdd"
     >
-      <Icon icon="ep:plus" /><span>{{t('form.add')}}</span>
+      <Icon icon="ep:plus" /><span>添加</span>
     </el-button>
   </el-tooltip>
 </template>

+ 2 - 2
src/components/Echart/index.ts

@@ -3,7 +3,7 @@ import pageError from '@/assets/svgs/404.svg'
 import networkError from '@/assets/svgs/500.svg'
 import noPermission from '@/assets/svgs/403.svg'
 import { propTypes } from '@/utils/propTypes'
-import { convertImageUrl } from '@/utils/image-helper'
+
 defineOptions({ name: 'Error' })
 
 interface ErrorMap {
@@ -48,7 +48,7 @@ const btnClick = () => {
 <template>
   <div class="flex justify-center">
     <div class="text-center">
-      <img :src="convertImageUrl(errorMap[type].url)" alt="" width="350" />
+      <img :src="errorMap[type].url" alt="" width="350" />
       <div class="text-14px text-[var(--el-color-info)]">{{ errorMap[type].message }}</div>
       <div class="mt-20px">
         <ElButton type="primary" @click="btnClick">{{ errorMap[type].buttonText }}</ElButton>

+ 66 - 34
src/components/Form/index.ts

@@ -1,12 +1,25 @@
 <template>
   <div v-if="type == 'image'">
-    <ul v-for="(item, index) in value" :key="index" class="el-upload-list el-upload-list--picture-card">
-      <li tabindex="0" class="el-upload-list__item is-ready" :style="'width: ' + width + 'px;height: ' + height + 'px'">
+
+    <ul
+      v-for="(item, index) in value"
+      :key="index"
+      class="el-upload-list el-upload-list--picture-card"
+    >
+      <li
+        tabindex="0"
+        class="el-upload-list__item is-ready"
+        :style="'width: ' + width + 'px;height: ' + height + 'px'"
+      >
         <div>
-          <img :src="convertedImageUrl(item)" alt="" class="el-upload-list__item-thumbnail" />
+          <img :src="item" alt="" class="el-upload-list__item-thumbnail" />
           <span class="el-upload-list__item-actions">
-            <span v-if="index != 0" class="el-upload-list__item-preview" @click="moveMaterial(index, 'up')">
-              <Icon icon="ep:back" />
+            <span
+              v-if="index != 0"
+              class="el-upload-list__item-preview"
+              @click="moveMaterial(index, 'up')"
+            >
+            <Icon icon="ep:back" />
             </span>
             <span class="el-upload-list__item-preview" @click="zoomMaterial(index)">
               <i class="el-icon-view"></i>
@@ -15,7 +28,11 @@
             <span class="el-upload-list__item-delete" @click="deleteMaterial(index)">
               <Icon icon="ep:delete" />
             </span>
-            <span v-if="index != value.length - 1" class="el-upload-list__item-preview" @click="moveMaterial(index, 'down')">
+            <span
+              v-if="index != value.length - 1"
+              class="el-upload-list__item-preview"
+              @click="moveMaterial(index, 'down')"
+            >
               <Icon icon="ep:right" />
             </span>
           </span>
@@ -28,8 +45,7 @@
       tabindex="0"
       class="el-upload el-upload--picture-card"
       :style="'width: ' + width + 'px;height: ' + height + 'px;' + 'line-height:' + height + 'px;'"
-      @click="toSeleteMaterial"
-    >
+      @click="toSeleteMaterial">
       <Icon icon="ep:plus" />
     </div>
 
@@ -37,9 +53,16 @@
       <el-container>
         <el-aside width="100px">
           <div style="margin-bottom: 10px">
-            <el-button class="el-icon-plus" size="small" @click="handleMaterialgroupAdd()"> 添加分组 </el-button>
+            <el-button class="el-icon-plus" size="small" @click="handleMaterialgroupAdd()">
+              添加分组
+            </el-button>
           </div>
-          <el-tabs v-model="materialgroupObjId" v-loading="materialgroupLoading" tab-position="left" @tab-click="tabClick">
+          <el-tabs
+            v-model="materialgroupObjId"
+            v-loading="materialgroupLoading"
+            tab-position="left"
+            @tab-click="tabClick"
+          >
             <el-tab-pane v-for="item in materialgroupList" :key="item.id" :name="item.id">
               <template #label>
                 <span> {{ item.name }}</span>
@@ -57,6 +80,7 @@
                     <span v-if="materialgroupObj.id != '-1'">
                       <el-button
                         size="small"
+                        type="text"
                         class="el-icon-edit"
                         style="margin-left: 10px"
                         @click="handleMaterialgroupEdit(materialgroupObj)"
@@ -64,10 +88,11 @@
                       >
                       <el-button
                         size="small"
+                        type="text"
                         class="el-icon-delete"
                         style="margin-left: 10px; color: red"
                         @click="materialgroupDelete(materialgroupObj)"
-                        >{{ t('action.delete') }}</el-button
+                        >删除</el-button
                       >
                     </span>
                   </el-col>
@@ -89,25 +114,32 @@
               </div>
             </template>
             <div v-loading="tableLoading">
-              <el-alert v-if="tableData.length <= 0" title="暂无数据" type="info" :closable="false" center show-icon />
+              <el-alert
+                v-if="tableData.length <= 0"
+                title="暂无数据"
+                type="info"
+                :closable="false"
+                center
+                show-icon
+              />
               <el-checkbox-group v-model="urls" :max="num - value.length">
                 <el-row :gutter="5">
                   <el-col v-for="(item, index) in tableData" :key="index" :span="4">
                     <el-card :body-style="{ padding: '5px' }">
-                      {{ console.log('item.url', item.url) }}
-                      {{ console.log('convertedImageUrl(item.url)', convertedImageUrl(item.url)) }}
                       <el-image
                         style="width: 100%; height: 100px"
-                        :src="convertedImageUrl(item.url)"
+                        :src="item.url"
                         fit="contain"
-                        :preview-src-list="[convertedImageUrl(item.url)]"
+                        :preview-src-list="[item.url]"
                         :z-index="9999"
                       />
                       <div>
                         <el-checkbox class="material-name" :label="item.url"> 选择 </el-checkbox>
                         <el-row>
                           <el-col :span="24" class="col-do">
-                            <el-button size="default" @click="materialDel(item)">{{ t('action.delete') }}</el-button>
+                            <el-button type="text" size="medium" @click="materialDel(item)"
+                              >删除</el-button
+                            >
                           </el-col>
                         </el-row>
                       </div>
@@ -132,8 +164,8 @@
       </el-container>
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="listDialogVisible = false">{{ t('common.cancel') }}</el-button>
-          <el-button type="primary" @click="sureUrls">{{ t('common.confirm') }}</el-button>
+          <el-button @click="listDialogVisible = false">取 消</el-button>
+          <el-button type="primary" @click="sureUrls">确 定</el-button>
         </span>
       </template>
     </el-dialog>
@@ -142,8 +174,7 @@
 
 <script setup name="Materials">
 import { ElMessageBox } from 'element-plus'
-import { ref, computed } from 'vue'
-import { useI18n } from 'vue-i18n'
+import { ref } from 'vue'
 import {
   getList as materialgroupPage,
   addObj as materialgroupAdd,
@@ -152,9 +183,6 @@ import {
 } from '@/api/tools/materialgroup'
 import { getPage, addObj, delObj } from '@/api/tools/material'
 import { getAccessToken } from '@/utils/auth'
-import { convertImageUrl } from '@/utils/image-helper'
-
-const { t } = useI18n()
 
 const props = defineProps({
   modelValue: {
@@ -192,7 +220,7 @@ const props = defineProps({
 
 const headers = ref({
   // Authorization: getToken()
-  Authorization: 'Bearer ' + getAccessToken()
+  Authorization: 'Bearer ' + getAccessToken(),
 })
 //const value = ref(props.value)
 const dialogVisible = ref(false)
@@ -219,13 +247,14 @@ const urls = ref([])
 const value = computed({
   get() {
     //  console.log('length:',props.modelValue.length)
-    if (!props.modelValue || props.modelValue.length == 0) {
-      return []
+    if(!props.modelValue || props.modelValue.length == 0){
+        return []
     }
     if (Array.isArray(props.modelValue)) {
       return props.modelValue
     }
     return [props.modelValue]
+    
   }
 })
 
@@ -264,6 +293,7 @@ function deleteMaterial(index) {
     //   emit('update:modelValue', urls.value[0])
     // }
     emit('update:modelValue', value.value)
+
   })
 }
 function toSeleteMaterial() {
@@ -430,7 +460,11 @@ function handleSuccess(response, file, fileList) {
   })
 }
 function beforeUpload(file) {
-  const isPic = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg'
+  const isPic =
+    file.type === 'image/jpeg' ||
+    file.type === 'image/png' ||
+    file.type === 'image/gif' ||
+    file.type === 'image/jpg'
   const isLt2M = file.size / 1024 / 1024 < 2
   if (!isPic) {
     this.$message.error('上传图片只能是 JPG、JPEG、PNG、GIF 格式!')
@@ -444,21 +478,19 @@ function beforeUpload(file) {
 
 const emit = defineEmits(['update:modelValue'])
 function sureUrls() {
-  console.log('value.value.length:', value.value.length)
+  console.log('value.value.length:',value.value.length)
   urls.value.forEach((item) => {
     value.value[value.value.length] = item
   })
-  console.log('urls.value:', value.value)
+  console.log('urls.value:',value.value)
   listDialogVisible.value = false
   if (urls.value.length > 1 || props.num > 1) {
     emit('update:modelValue', value.value)
   } else {
     emit('update:modelValue', value.value[0])
   }
-}
-
-const convertedImageUrl = (url) => {
-  return convertImageUrl(url)
+  
+  
 }
 </script>
 

+ 5 - 6
src/components/Materials/src/editorMaterials.vue

@@ -43,7 +43,7 @@
                         class="el-icon-delete"
                         style="margin-left: 10px; color: red"
                         @click="materialgroupDelete(materialgroupObj)"
-                        >{{t('action.delete')}}</el-button
+                        >删除</el-button
                       >
                     </span>
                   </el-col>
@@ -89,7 +89,7 @@
                         <el-row>
                           <el-col :span="24" class="col-do">
                             <el-button type="text" size="medium" @click="materialDel(item)"
-                              >{{t('action.delete')}}</el-button
+                              >删除</el-button
                             >
                           </el-col>
                         </el-row>
@@ -115,8 +115,8 @@
       </el-container>
       <!-- <template #footer> -->
         <span class="dialog-footer" style="color: red;">
-          <!-- <el-button @click="listDialogVisible = false">{{t('common.cancel')}}</el-button> -->
-          <el-button type="primary" @click="sureUrls">{{t('common.confirm')}}</el-button>
+          <!-- <el-button @click="listDialogVisible = false">取 消</el-button> -->
+          <el-button type="primary" @click="sureUrls">确 定</el-button>
         </span>
       <!-- </template> -->
       </div>
@@ -135,7 +135,6 @@ import {
 import { getPage, addObj, delObj } from '@/api/tools/material'
 import { getAccessToken } from '@/utils/auth'
 import '../../../../public/UEditor/dialogs/internal'
-import { convertImageUrl } from '@/utils/image-helper'
 
 const props = defineProps({
   value: {
@@ -385,7 +384,7 @@ function sureUrls() {
 
   let str = ''
   urls.value.forEach(item => {
-    str += '<img src="' + convertImageUrl(item) + '">'
+    str += '<img src="' + item + '">'
   })
   nowEditor.dialog.close(true)
   nowEditor.editor.setContent(str, true)

+ 2 - 2
src/components/OperateLogV2/index.ts

@@ -9,8 +9,8 @@
       v-model="times"
       value-format="YYYY-MM-DD HH:mm:ss"
       type="daterange"
-      :start-placeholder="t('public.startDate')"
-      :end-placeholder="t('public.endDate')"
+      start-placeholder="开始日期"
+      end-placeholder="结束日期"
       :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
       :shortcuts="shortcuts"
       class="!w-240px"

+ 2 - 2
src/components/SimpleProcessDesigner/src/addNode.vue

@@ -20,8 +20,8 @@
       @pagination="getList"
     />
     <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">{{t('common.confirm')}}</el-button>
-      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
 </template>

+ 1 - 1
src/components/Table/src/helper.ts

@@ -31,7 +31,7 @@
           </div>
           <div v-if="!disabled" class="handle-icon" @click="handleRemove(file)">
             <Icon icon="ep:delete" />
-            <span>{{t('action.delete')}}</span>
+            <span>删除</span>
           </div>
         </div>
       </template>

+ 0 - 91
src/components/UploadFile/src/useUpload.ts

@@ -1,91 +0,0 @@
-<!--
-/**
- * 全局图片组件
- * 
- * @author 系统开发团队
- * @date 2023-05-15
- * @version 1.0.0
- * @description 
- *   该组件是一个全局图片组件,用于处理图片URL,支持将远程图片URL转换为本地路径。
- *   主要特点:
- *   1. 自动处理图片URL,支持本地映射
- *   2. 处理图片加载失败的情况,显示默认图片
- *   3. 支持所有原生img标签的属性
- * 
- * @example
- * <AppImage src="http://example.com/image.jpg" alt="示例图片" />
- * 
- * @example
- * <AppImage 
- *   src="http://example.com/image.jpg" 
- *   alt="示例图片" 
- *   fallbackSrc="/images/default.png" 
- * />
- */
--->
-<template>
-  <img :src="convertImageUrl(processedSrc)" :alt="alt" v-bind="$attrs" @error="handleError" />
-</template>
-
-<script setup lang="ts">
-import { computed, ref } from 'vue'
-import { convertImageUrl } from '@/utils/image-helper'
-
-/**
- * 组件属性定义
- */
-const props = defineProps({
-  /**
-   * 图片URL
-   * 原始图片URL,将通过convertImageUrl函数处理
-   */
-  src: {
-    type: String,
-    required: true
-  },
-  /**
-   * 图片alt属性
-   * 图片的替代文本,用于无法显示图片时
-   */
-  alt: {
-    type: String,
-    default: ''
-  },
-  /**
-   * 图片加载失败时显示的默认图片
-   * 当原始图片加载失败时,将显示此图片
-   */
-  fallbackSrc: {
-    type: String,
-    default: '/images/no-image.png'
-  }
-})
-
-/**
- * 图片加载失败标志
- * 用于跟踪图片是否加载失败
- */
-const imgError = ref(false)
-
-/**
- * 处理后的图片URL
- * 根据图片加载状态和配置,返回最终要显示的图片URL
- */
-const processedSrc = computed(() => {
-  // 如果图片加载失败且有设置fallbackSrc,则显示fallbackSrc
-  if (imgError.value && props.fallbackSrc) {
-    return props.fallbackSrc
-  }
-  // 否则返回处理后的原始URL
-  return convertImageUrl(props.src)
-})
-
-/**
- * 处理图片加载失败事件
- * 当图片加载失败时,设置imgError为true,触发显示fallbackSrc
- */
-const handleError = () => {
-  console.warn(`图片加载失败: ${props.src}`)
-  imgError.value = true
-}
-</script>

+ 1 - 1
src/components/index.ts

@@ -165,7 +165,7 @@ service.interceptors.response.use(
           t('sys.api.errMsg901') +
           '</div>' +
           '<div> &nbsp; </div>' +
-          '<div> https://www.ifoodme.com/</div>' +
+          '<div> https://www.yixiang.co/</div>' +
           '<div> &nbsp; </div>' +
           '<div></div>'
       })

+ 0 - 45
src/config/image-mapping.ts

@@ -1,45 +0,0 @@
-/**
- * 图片映射配置文件
- *
- * @author 系统开发团队
- * @date 2023-05-15
- * @version 1.0.0
- * @description
- *   该配置文件用于定义特定图片URL的映射规则。
- *   可以为特定的远程图片URL指定本地路径,优先级高于通用映射规则。
- *   主要用于处理特殊情况,如需要将某些图片映射到特定的本地路径。
- */
-
-/**
- * 图片映射配置
- * 可以为特定的远程图片URL指定本地路径
- *
- * @example
- * {
- *   'http://example.com/image1.jpg': '/local-images/special/image1.jpg',
- *   'http://example.com/image2.jpg': '/local-images/special/image2.jpg'
- * }
- */
-export const imageMapping: Record<string, string> = {
-  // 远程URL: 本地路径
-  // 示例:
-  // 'http://localhost:48081/admin-api/infra/file/1/get/example.jpg': '/local-images/custom/special-example.jpg',
-  // 可以添加更多映射...
-}
-
-/**
- * 获取映射的本地路径
- * @param url 远程图片URL
- * @returns 映射的本地路径,如果没有映射则返回null
- *
- * @example
- * // 如果有映射,返回映射的本地路径
- * getMappedImagePath('http://example.com/image1.jpg') // 返回: '/local-images/special/image1.jpg'
- *
- * @example
- * // 如果没有映射,返回null
- * getMappedImagePath('http://example.com/no-mapping.jpg') // 返回: null
- */
-export const getMappedImagePath = (url: string): string | null => {
-  return imageMapping[url] || null
-}

+ 0 - 79
src/directives/image/index.ts

@@ -1,79 +0,0 @@
-/**
- * 图片URL处理指令模块
- *
- * @author 系统开发团队
- * @date 2023-05-15
- * @version 1.0.0
- * @description
- *   该模块提供了一个自定义指令,用于处理图片URL,支持将远程图片URL转换为本地路径。
- *   主要用于简化图片URL处理,减少重复代码,统一处理逻辑。
- */
-import type { App, Directive } from 'vue'
-import { convertImageUrl } from '@/utils/image-helper'
-
-/**
- * 图片URL处理指令
- * 使用方法:v-image="imageUrl"
- * 或者:v-image:[属性名]="imageUrl" 例如 v-image:src="imageUrl"
- *
- * @example
- * <!-- 基本用法,处理src属性 -->
- * <img v-image="imageUrl" alt="图片描述" />
- *
- * @example
- * <!-- 指定属性,处理background属性 -->
- * <div v-image:background="imageUrl">内容</div>
- *
- * @example
- * <!-- 与Element Plus结合使用 -->
- * <el-image v-image="product.image" />
- */
-export const imageDirective: Directive = {
-  /**
-   * 指令挂载时调用
-   * 当元素第一次绑定指令时执行
-   *
-   * @param el 指令绑定的元素
-   * @param binding 指令的绑定值和参数
-   */
-  mounted(el, binding) {
-    const attributeName = binding.arg || 'src'
-    const url = binding.value
-
-    if (url) {
-      const convertedUrl = convertImageUrl(url)
-      el.setAttribute(attributeName, convertedUrl)
-    }
-  },
-
-  /**
-   * 指令更新时调用
-   * 当绑定值变化时执行
-   *
-   * @param el 指令绑定的元素
-   * @param binding 指令的绑定值和参数
-   */
-  updated(el, binding) {
-    const attributeName = binding.arg || 'src'
-    const url = binding.value
-
-    if (url) {
-      const convertedUrl = convertImageUrl(url)
-      el.setAttribute(attributeName, convertedUrl)
-    }
-  }
-}
-
-/**
- * 设置图片处理指令
- * 在应用中注册v-image指令
- *
- * @param app Vue应用实例
- *
- * @example
- * // 在main.ts中调用
- * setupImageDirective(app)
- */
-export function setupImageDirective(app: App) {
-  app.directive('image', imageDirective)
-}

+ 1 - 4
src/directives/index.ts

@@ -1,16 +1,13 @@
 import type { App } from 'vue'
 import { hasRole } from './permission/hasRole'
 import { hasPermi } from './permission/hasPermi'
-import { setupImageDirective } from './image'
 
 /**
  * 导出指令:v-xxx
  * @methods hasRole 用户权限,用法: v-hasRole
  * @methods hasPermi 按钮权限,用法: v-hasPermi
- * @methods v-image 图片URL处理指令,用法: v-image="imageUrl" 或 v-image:src="imageUrl"
  */
-export function setupAuth(app: App<Element>) {
+export const setupAuth = (app: App<Element>) => {
   hasRole(app)
   hasPermi(app)
-  setupImageDirective(app)
 }

+ 1 - 1
src/directives/permission/hasPermi.ts

@@ -14,7 +14,7 @@ export const CACHE_KEY = {
   IS_DARK: 'isDark',
   LANG: 'lang',
   THEME: 'theme',
-  LAYOUT: 'layout',
+  LAYOUT: 'classic',
   DICT_CACHE: 'dictCache',
   // 登录表单
   LoginForm: 'loginForm',

+ 1 - 2
src/hooks/web/useConfigGlobal.ts

@@ -1,4 +1,3 @@
 import LocaleDropdown from './src/LocaleDropdown.vue'
-import LocaleSelect from './src/LocaleSelect.vue'
 
-export { LocaleDropdown, LocaleSelect }
+export { LocaleDropdown }

+ 0 - 48
src/layout/components/LocaleDropdown/src/LocaleDropdown.vue

@@ -1,48 +0,0 @@
-<script lang="ts" setup>
-import { useLocaleStore } from '@/store/modules/locale'
-import { useLocale } from '@/hooks/web/useLocale'
-import { propTypes } from '@/utils/propTypes'
-import { useDesign } from '@/hooks/web/useDesign'
-
-defineOptions({ name: 'LocaleSelect' }) // 修改组件名称
-
-const { getPrefixCls } = useDesign()
-
-const prefixCls = getPrefixCls('locale-select') // 修改类名前缀
-
-defineProps({
-  color: propTypes.string.def('')
-})
-
-const localeStore = useLocaleStore()
-
-const langMap = computed(() => localeStore.getLocaleMap)
-
-const currentLang = computed({
-  get: () => localeStore.getCurrentLocale.lang,
-  set: (lang: LocaleType) => {
-    if (lang === unref(currentLang)) return
-    // 需要重新加载页面让整个语言多初始化
-    window.location.reload()
-    localeStore.setCurrentLocale({
-      lang
-    })
-    const { changeLocale } = useLocale()
-    changeLocale(lang)
-  }
-})
-</script>
-
-<template>
-  <ElSelect
-    :class="prefixCls"
-    v-model="currentLang"
-  >
-    <ElOption
-      v-for="item in langMap"
-      :key="item.lang"
-      :label="item.name"
-      :value="item.lang"
-    />
-  </ElSelect>
-</template>

+ 2 - 3
src/layout/components/Logo/index.ts

@@ -73,7 +73,7 @@ watch(
       <div
         v-if="show"
         :class="[
-          'ml-10px text-14px font-700',
+          'ml-10px text-16px font-700',
           {
             'text-[var(--logo-title-text-color)]': layout === 'classic',
             'text-[var(--top-header-text-color)]':
@@ -81,8 +81,7 @@ watch(
           }
         ]"
       >
-      <div>Tabemate Pro</div>
-      <div>オーダーシステム</div>
+        {{ title }}
       </div>
     </router-link>
   </div>

+ 2 - 5
src/layout/components/Menu/index.ts

@@ -94,10 +94,7 @@ export default defineComponent({
         >
           {{
             default: () => {
-              // 渲染菜单 原来的写法现在注释了
-              {/* const { renderMenuItem } = useRenderMenuItem(unref(menuMode)) */}
-             
-              const { renderMenuItem } = useRenderMenuItem()
+              const { renderMenuItem } = useRenderMenuItem(unref(menuMode))
               return renderMenuItem(unref(routers))
             }
           }}
@@ -144,7 +141,7 @@ $prefix-cls: #{$namespace}-menu;
 
     // 设置子菜单悬停的高亮和背景色
     .#{$elNamespace}-sub-menu__title,
-    .#{$elNamespace}-menu-item {            
+    .#{$elNamespace}-menu-item {
       &:hover {
         color: var(--left-menu-text-active-color) !important;
         background-color: var(--left-menu-bg-color) !important;

+ 15 - 1
src/layout/components/Menu/src/components/useRenderMenuItem.tsx

@@ -48,6 +48,12 @@ export default defineComponent({
         )?.children
 
         tabActive.value = path
+        ref(unref(fixedMenu)).value = false;
+        if(path == '/index'){
+          appStore.setFixedMenu(false)
+          showMenu.value = false
+        }
+      
         if (children) {
           permissionStore.setMenuTabRouters(
             cloneDeep(children).map((v) => {
@@ -102,6 +108,7 @@ export default defineComponent({
       const oldPath = unref(tabActive)
       tabActive.value = item.children ? item.path : item.path.split('/')[0]
       if (item.children) {
+        appStore.setFixedMenu(true)
         if (newPath === oldPath || !unref(showMenu)) {
           showMenu.value = unref(fixedMenu) ? true : !unref(showMenu)
         }
@@ -117,12 +124,19 @@ export default defineComponent({
         push(item.path)
         permissionStore.setMenuTabRouters([])
         showMenu.value = false
+        fixedMenu.value = false
+        appStore.setFixedMenu(false)
       }
     }
 
     // 设置高亮
     const isActive = (currentPath: string) => {
       const { path } = unref(currentRoute)
+      //console.log('tabPathMap[currentPath]:',tabPathMap[currentPath])
+     // console.log('path22:',path)
+      if(path == '/index' && tabPathMap[currentPath].includes('/'+path)){
+        return true
+      }
       if (tabPathMap[currentPath].includes(path)) {
         return true
       }
@@ -199,7 +213,7 @@ export default defineComponent({
             {
               '!left-[var(--tab-menu-min-width)]': unref(collapse),
               '!left-[var(--tab-menu-max-width)]': !unref(collapse),
-              '!w-[calc(var(--left-menu-max-width)+1px)]': unref(showMenu) || unref(fixedMenu),
+              '!w-[calc(var(--left-menu-max-width)+1px)]': unref(showMenu) && unref(fixedMenu),
               '!w-0': !unref(showMenu) && !unref(fixedMenu)
             }
           ]}

+ 2 - 3
src/layout/components/TabMenu/src/helper.ts

@@ -8,7 +8,6 @@ import { useUserStore } from '@/store/modules/user'
 import LockDialog from './components/LockDialog.vue'
 import LockPage from './components/LockPage.vue'
 import { useLockStore } from '@/store/modules/lock'
-import {convertImageUrl} from '@/utils/image-helper'
 
 defineOptions({ name: 'UserInfo' })
 
@@ -51,14 +50,14 @@ const toProfile = async () => {
   push('/user/profile')
 }
 const toDocument = () => {
-  window.open('https://www.ifoodme.com/')
+  window.open('https://www.yixiang.co/')
 }
 </script>
 
 <template>
   <ElDropdown class="custom-hover" :class="prefixCls" trigger="click">
     <div class="flex items-center">
-      <ElAvatar :src="convertImageUrl(avatar)" alt="" class="w-[calc(var(--logo-height)-25px)] rounded-[50%]" />
+      <ElAvatar :src="avatar" alt="" class="w-[calc(var(--logo-height)-25px)] rounded-[50%]" />
       <span class="pl-[5px] text-14px text-[var(--top-header-text-color)] <lg:hidden">
         {{ userName }}
       </span>

+ 108 - 2054
src/layout/components/UserInfo/src/components/LockDialog.vue

@@ -1,94 +1,60 @@
 export default {
   common: {
-    inputText: 'Please enter',
+    inputText: 'Please input',
     selectText: 'Please select',
     startTimeText: 'Start time',
     endTimeText: 'End time',
     login: 'Login',
-    required: 'This field is required',
-    loginOut: 'Logout',
-    document: 'Project Documentation',
-    profile: 'Personal Center',
-    reminder: 'Warm Tips',
-    loginOutMessage: 'Do you want to quit the system?',
+    required: 'This is required',
+    loginOut: 'Login out',
+    document: 'Document',
+    profile: 'User Center',
+    reminder: 'Reminder',
+    loginOutMessage: 'Exit the system?',
     back: 'Back',
     ok: 'OK',
     save: 'Save',
     cancel: 'Cancel',
     close: 'Close',
-    reload: 'Reload',
+    reload: 'Reload current',
     success: 'Success',
-    closeTab: 'Close Tab',
-    closeTheLeftTab: 'Close left tab',
-    closeTheRightTab: 'Close right tab',
-    closeOther: 'Close other tabs',
-    closeAll: 'Close all tabs',
-    prevLabel: 'Previous',
+    closeTab: 'Close current',
+    closeTheLeftTab: 'Close left',
+    closeTheRightTab: 'Close right',
+    closeOther: 'Close other',
+    closeAll: 'Close all',
+    prevLabel: 'Prev',
     nextLabel: 'Next',
-    skipLabel: 'Skip',
+    skipLabel: 'Jump',
     doneLabel: 'End',
     menu: 'Menu',
-    menuDes: 'Menu bar rendered in a routed structure',
-    collapse: 'Expand and Zoom',
-    collapseDes: 'Expand and zoom menu bar',
-    tagsView: 'Tabs',
-    tagsViewDes: 'For recording routing history',
-    tool: 'Tools',
-    toolDes: 'For setting up a customized system',
+    menuDes: 'Menu bar rendered in routed structure',
+    collapse: 'Collapse',
+    collapseDes: 'Expand and zoom the menu bar',
+    tagsView: 'Tags view',
+    tagsViewDes: 'Used to record routing history',
+    tool: 'Tool',
+    toolDes: 'Used to set up custom systems',
     query: 'Query',
     reset: 'Reset',
-    shrink: 'Wrap Up',
+    shrink: 'Put away',
     expand: 'Expand',
-    confirmTitle: 'System Tips',
-    exportMessage: 'Confirm exporting data items?',
-    importMessage: 'Confirm importing data items?',
-    createSuccess: 'Add Success',
-    updateSuccess: 'Modify Succeed',
-    delMessage: 'Do you delete the selected data?',
-    delDataMessage: 'Do you want to delete the data?',
-    delNoData: 'Please select the data to be deleted.',
-    delSuccess: 'Delete Success',
-    index: 'Serial number',
+    confirmTitle: 'System Hint',
+    exportMessage: 'Whether to confirm export data item?',
+    importMessage: 'Whether to confirm import data item?',
+    createSuccess: 'Create Success',
+    updateSuccess: 'Update Success',
+    delMessage: 'Delete the selected data?',
+    delDataMessage: 'Delete the data?',
+    delNoData: 'Please select the data to delete',
+    delSuccess: 'Deleted successfully',
+    index: 'Index',
     status: 'Status',
-    createTime: 'Created',
-    updateTime: 'Updated',
+    createTime: 'Create Time',
+    updateTime: 'Update Time',
     copy: 'Copy',
     copySuccess: 'Copy Success',
-    copyError: 'Copy Failed',
-    search: 'Search',
-    detail: 'Details',
-    add: 'Add',
-    yes: 'Yes',
-    no: 'No',
-    selectShop: 'Select a store',
-    enterProductName: 'Please enter a product name',
-    selectCategory: 'Select Category',
-    enterKeyword: 'Please enter a keyword',
-    enterUnitName: 'Please enter the unit name',
-    enterPrice: 'Please input the product price',
-    enterMarketPrice: 'Please enter the market price',
-    enterStock: 'Inventory',
-    enterProductDescription: 'Please enter the product description',
-    enterPoints: 'Please enter the points earned',
-    addBasicInfo: 'Please add basic information',
-    selectAttribute: 'Please select attributes',
-    addCompleteSpec: 'Please add full specifications!',
-    addAttribute: 'Please add attributes!',
-    addSpec: 'Please add specifications!',
-    confirm: 'Confirm',
-    delete: 'Delete',
-    nextStep: 'Next',
-    previousStep: 'Previous',
-    uploadImage: 'Upload image',
-    addNewSpec: 'Add new specification',
-    generateNow: 'Generate Now',
-    selectShopFirst: 'Please select a store first',
-    selectCategoryFirst: 'Please select category first',
-    selectSpec: 'Select Specification',
-    enterSpecName: 'Please input specification',
-    enterSpecValue: 'Please enter specification value',
-    selectFreightTemplate: 'Select shipping template',
-    enterFreight: 'Please enter the e-mail address'
+    copyError: 'Copy Error'
   },
   lock: {
     lockScreen: 'Lock screen',
@@ -147,44 +113,34 @@ export default {
     small: 'Small'
   },
   login: {
-    welcome: 'Welcome to Tabemate Pro',
-    message: 'Welcome to Tabemate Pro',
-    tenantname: 'Tenant Name',
-    username: 'User Name',
+    welcome: 'Welcome to the system',
+    message: 'Backstage management system',
+    tenantname: 'TenantName',
+    username: 'Username',
     password: 'Password',
-    userType: 'User Type',
-    code: 'Verification Code',
-    login: 'Login',
-    relogin: 'Re-login',
-    otherLogin: 'Other Login Methods',
+    code: 'verification code',
+    login: 'Sign in',
+    relogin: 'Sign in again',
+    otherLogin: 'Sign in with',
     register: 'Register',
-    checkPassword: 'Confirm Password',
+    checkPassword: 'Confirm password',
     remember: 'Remember me',
-    hasUser: 'Already have an account? Go to login',
-    forgetPassword: 'Forgot your password?',
-    tenantNamePlaceholder: 'Please enter your tenant name',
-    usernamePlaceholder: 'Please enter your username',
-    passwordPlaceholder: 'Please enter your password',
-    codePlaceholder: 'Please enter the verification code',
-    mobileTitle: 'Mobile Login',
-    mobileNumber: 'Cell phone number',
-    mobileNumberPlaceholder: 'Please enter your cell phone number',
-    backLogin: 'Return to',
-    getSmsCode: 'Get verification code',
-    btnMobile: 'Mobile Login',
-    btnQRCode: 'QR Code Login',
-    qrcode: 'Scan QR code to login',
-    btnRegister: 'Register',
-    SmsSendMsg: 'Verification code sent',
-    loadingSystem: 'Loading system...',
-    YSHOPSourceCode: 'YSHOP source code',
-    retrievableAfterSeconds: 'Retrieve in seconds',
-    thisThirdPartyApplicationRequestsTheFollowingPermissions: 'This third-party application requests the following permissions',
-    agreeToAuthorization: 'Agree to authorize',
-    authorizationIn: 'Authorization in progress...',
-    rejection: 'Deny',
-    accessYourPersonalInformation: 'Access your personal information',
-    modifyYourPersonalInformation: 'Modify your personal information'
+    hasUser: 'Existing account? Go to login',
+    forgetPassword: 'Forget password?',
+    tenantNamePlaceholder: 'Please Enter Tenant Name',
+    usernamePlaceholder: 'Please Enter Username',
+    passwordPlaceholder: 'Please Enter Password',
+    codePlaceholder: 'Please Enter Verification Code',
+    mobileTitle: 'Mobile sign in',
+    mobileNumber: 'Mobile Number',
+    mobileNumberPlaceholder: 'Plaease Enter Mobile Number',
+    backLogin: 'back',
+    getSmsCode: 'Get SMS Code',
+    btnMobile: 'Mobile sign in',
+    btnQRCode: 'QR code sign in',
+    qrcode: 'Scan the QR code to log in',
+    btnRegister: 'Sign up',
+    SmsSendMsg: 'code has been sent'
   },
   captcha: {
     verification: 'Please complete security verification',
@@ -195,7 +151,6 @@ export default {
   },
   router: {
     login: 'Login',
-    socialLogin: 'Social Login',
     home: 'Home',
     analysis: 'Analysis',
     workplace: 'Workplace'
@@ -333,42 +288,27 @@ export default {
     header: 'Header'
   },
   action: {
-    setPrint: 'Configuring Printers',
-    check: 'Audit',
-    buyDetail: 'Purchase History',
-    order: 'Orders',
-    qrcode: 'QR Code',
-    couponRecord: 'Coupon Record',
-    yue: 'Points Balance',
-    userDetail: 'User Details',
-    refundOrder: 'Order Refund',
-    orderRecord: 'Order Record',
-    orderDetail: 'Order Details',
-    updateOrder: 'Modify Order',
-    orderSend: 'Order Shipment',
-    remark: 'Remarks',
-    sendInfo: 'Delivery Information',
-    batchCreate: 'Batch Add',
-    create: 'Add',
+    create: 'Create',
     add: 'Add',
     del: 'Delete',
     delete: 'Delete',
     edit: 'Edit',
+    update: 'Update',
     preview: 'Preview',
     more: 'More',
-    sync: 'Synchronize',
+    sync: 'Sync',
     save: 'Save',
-    detail: 'Details',
+    detail: 'Detail',
     export: 'Export',
     import: 'Import',
     generate: 'Generate',
-    logout: 'Force Exit',
+    logout: 'Login Out',
     test: 'Test',
-    typeCreate: 'Dictionary Type Addition',
-    typeUpdate: 'Dictionary Type Edit',
-    dataCreate: 'Dictionary Data Addition',
-    dataUpdate: 'Dictionary Data Editing',
-    update: 'Update'
+    typeCreate: 'Dict Type Create',
+    typeUpdate: 'Dict Type Eidt',
+    dataCreate: 'Dict Data Create',
+    dataUpdate: 'Dict Data Eidt',
+    fileUpload: 'File Upload'
   },
   dialog: {
     dialog: 'Dialog',
@@ -384,7 +324,9 @@ export default {
       apiTimeoutMessage: 'The interface request timed out, please refresh the page and try again!',
       apiRequestFailed: 'The interface request failed, please try again later!',
       networkException: 'network anomaly',
-      networkExceptionMsg: 'Please check if your network connection is normal! The network is abnormal',
+      networkExceptionMsg:
+        'Please check if your network connection is normal! The network is abnormal',
+
       errMsg401: 'The user does not have permission (token, user name, password error)!',
       errMsg403: 'The user is authorized, but access is forbidden!',
       errMsg404: 'Network request error, the resource was not found!',
@@ -411,7 +353,8 @@ export default {
       subTitle500: 'Sorry, the server is reporting an error.',
       noDataTitle: 'No data on the current page.',
       networkErrorTitle: 'Network Error',
-      networkErrorSubTitle: 'Sorry, Your network connection has been disconnected, please check your network!'
+      networkErrorSubTitle:
+        'Sorry, Your network connection has been disconnected, please check your network!'
     },
     lock: {
       unlock: 'Click to unlock',
@@ -421,36 +364,42 @@ export default {
       placeholder: 'Please enter the lock screen password or user password'
     },
     login: {
-      backSignIn: 'Back',
-      signInFormTitle: 'Sign In',
-      ssoFormTitle: 'Tri-party authorisation',
-      mobileSignInFormTitle: 'Mobile Login',
-      qrSignInFormTitle: 'QR Code Login',
-      signUpFormTitle: 'Register',
-      forgetFormTitle: 'Reset Password',
-      signInTitle: 'Out-of-the-box middle and back office management system',
-      signInDesc: 'Enter your personal details to get started!',
+      backSignIn: 'Back sign in',
+      mobileSignInFormTitle: 'Mobile sign in',
+      qrSignInFormTitle: 'Qr code sign in',
+      signInFormTitle: 'Sign in',
+      signUpFormTitle: 'Sign up',
+      forgetFormTitle: 'Reset password',
+
+      signInTitle: 'Backstage management system',
+      signInDesc: 'Enter your personal details and get started!',
       policy: 'I agree to the xxx Privacy Policy',
-      scanSign: `Scan the code and click 'Confirm' to complete your login.`,
-      loginButton: 'Sign In',
-      registerButton: 'Sign Up',
+      scanSign: `scanning the code to complete the login`,
+
+      loginButton: 'Sign in',
+      registerButton: 'Sign up',
       rememberMe: 'Remember me',
-      forgetPassword: 'Forgot your password?',
-      otherSignIn: 'Other Login Methods',
-      loginSuccessTitle: 'Login Successful',
+      forgetPassword: 'Forget Password?',
+      otherSignIn: 'Sign in with',
+
+      // notify
+      loginSuccessTitle: 'Login successful',
       loginSuccessDesc: 'Welcome back',
-      accountPlaceholder: 'Please enter your account number',
-      passwordPlaceholder: 'Please enter your password',
-      smsPlaceholder: 'Please enter the verification code',
-      mobilePlaceholder: 'Please enter your mobile phone number',
-      policyPlaceholder: 'Tick to register',
-      diffPwd: 'Two passwords are not the same',
-      userName: 'Account Number',
+
+      // placeholder
+      accountPlaceholder: 'Please input username',
+      passwordPlaceholder: 'Please input password',
+      smsPlaceholder: 'Please input sms code',
+      mobilePlaceholder: 'Please input mobile',
+      policyPlaceholder: 'Register after checking',
+      diffPwd: 'The two passwords are inconsistent',
+
+      userName: 'Username',
       password: 'Password',
       confirmPassword: 'Confirm Password',
       email: 'Email',
-      smsCode: 'SMS verification code',
-      mobile: 'Mobile phone number'
+      smsCode: 'SMS code',
+      mobile: 'Mobile'
     }
   },
   profile: {
@@ -488,17 +437,8 @@ export default {
       oldPwdMsg: 'Please Enter Old Password',
       newPwdMsg: 'Please Enter New Password',
       cfPwdMsg: 'Please Enter Confirm Password',
-      pwdRules: '6 to 20 characters in length',
       diffPwd: 'The Passwords Entered Twice No Match'
-    },
-    serialNumber: 'Serial number',
-    socialPlatform: 'Social Platform',
-    bound: 'Bound',
-    unbound: 'Unbound',
-    unbound1: '(Unbound)',
-    bound1: '(Bind)',
-    boundSuccessfully: 'Bound Successfully',
-    unboundSuccessfully: 'Unbind Successfully'
+    }
   },
   cropper: {
     selectImage: 'Select Image',
@@ -513,1891 +453,5 @@ export default {
     btn_zoom_in: 'Zoom in',
     btn_zoom_out: 'Zoom out',
     preview: 'Preivew'
-  },
-  work: {
-    selectStore: 'Select shop',
-    orderReminderOn: 'Order reminder on',
-    orderReminderOff: 'Order Reminder Off',
-    recentOrders: 'Recent Orders',
-    orderId: 'Order Number',
-    takeout: 'Takeaway',
-    contactNumber: 'Contact Number',
-    pickUp: 'Pickup',
-    pickUpNumber: 'Pickup Number',
-    dineIn: 'Dine-in',
-    tableNumber: 'Table number',
-    numberPeople: 'Number of people',
-    multipleDishesPleaseCheckDetails: 'Multiple dishes, please check details',
-    order: 'Order Placement',
-    orderTime: 'Order Time',
-    noOrderData: 'No order data available',
-    newOrderNotification: 'New Order Notification',
-    youHaveNewOrderPleaseCheckOut: 'You have a new order, please check!'
-  },
-  home: {
-    totalMembers: 'Total number of members',
-    allStores: 'All Stores',
-    todayOrderCount: "Today's orders",
-    orders: 'Single',
-    totalOrderCount: 'Total number of orders',
-    yesterdaysOrderCount: "Yesterday's orders",
-    totalAmount: 'Total amount',
-    last7DaysOrderCount: 'Orders in the last seven days',
-    totalProductCount: 'Total number of products',
-    thisMonthOrderCount: 'Orders this month',
-    productSalesRanking: 'Product Sales Ranking',
-    userSpendingRankingAllStores: 'User Spending Ranking (All Stores)',
-    currentStore: 'Current Store',
-    productName: 'Product Name',
-    salesVolume: 'Sales volume',
-    consumptionAmount: 'Consumption amount',
-    productManagement: 'Product Management',
-    memberManagement: 'Member Management',
-    orderManagement: 'Order Management',
-    couponManagement: 'Coupon Management',
-    printerManagement: 'Printer Management',
-    storeManagement: 'Shop Management',
-    paymentManagement: 'Payment Management',
-    messageManagement: 'Message Management'
-  },
-  product: {
-    cost: 'Cost price',
-    barCode: 'Item No.',
-    weight: 'Weight(KG)',
-    volume: 'Volume(m³)',
-    productName: 'Commodity Name',
-    enterProductName: 'Please enter the commodity name',
-    shopName: 'Shop Name',
-    enterShopName: 'Please enter the shop name',
-    productImage: 'Picture',
-    productPrice: 'Price',
-    sales: 'Sales',
-    stock: 'Inventory',
-    status: 'Status',
-    onSale: 'Already on the shelves',
-    offSale: 'Dropped',
-    addTime: 'Add Time',
-    actions: 'Actions',
-    edit: 'Edit',
-    delete: 'Delete',
-    onSaleProducts: 'Products on sale',
-    pendingProducts: 'Products to be shelved',
-    soldOutProducts: 'Sold Out Products',
-    confirmSale: 'Are you sure you want to add or remove products?',
-    operationSuccess: 'Successful',
-    displayShop: 'Show Store',
-    productCategory: 'Product Category',
-    keyword: 'Keyword',
-    unitName: 'Unit Name',
-    marketPrice: 'Market Price',
-    coverImage: 'Cover picture',
-    sliderImage: 'Rotating Chart',
-    productStatus: 'Product Status',
-    productDescription: 'Product Description',
-    productSpec: 'Specification',
-    singleSpec: 'Single Size',
-    multipleSpec: 'Multi-Size',
-    selectSpec: 'Select',
-    productAttributes: 'Properties',
-    productDetails: 'Product Details',
-    marketingSettings: 'Marketing Settings',
-    getPoints: 'Get Points',
-    basicInfo: 'Basic Information',
-    specSettings: 'Specification Setting',
-    logisticsSettings: 'Logistics Settings',
-    freightSettings: 'Freight Settings',
-    postage: 'Postage',
-    freightTemplate: 'Shipping Template',
-    newProduct: 'New product or not',
-    yes: 'Yes',
-    no: 'No'
-  },
-  express: {
-    courierCompanyNumber: 'Courier Company Number',
-    pleaseEnterTheCourierCompanyNumber: 'Please enter the courier company number',
-    fullNameOfCourierCompany: 'Full name of courier company',
-    pleaseEnterTheFullNameOfCourierCompany: 'Please enter the full name of the courier company',
-    sort: 'Sort',
-    pleaseEnterTheSort: 'Please input the order',
-    theAbbreviationCourierCompanyEmpty: 'The short name of the courier company cannot be empty',
-    fullNameCourierCompanyEmpty: 'Full name of courier company cannot be empty',
-    sortCannotEmpty: 'Sort cannot be empty',
-    pleaseEnterTheCourierBirdAppId: 'Please input the appId',
-    pleaseEnterTheCourierBirdAppKey: 'Please input appKey',
-    isPaidPackage: 'Whether to charge the package',
-    theThirdPartyTips: 'yshop-pro system uses the third-party courier bird api to achieve the courier query, registration address please click.',
-    iRegister: 'I register!',
-    courierBirdAppIdCannotBeEmpty: 'ExpressBird appId can not be empty',
-    courierBirdAppKeyCannotBeEmpty: 'CourierBird appKey cannot be empty',
-    ompanyCode: 'Company Code',
-    pleaseEnterTheCourierCompanyCode: 'Please enter the code of the courier company',
-    companyFullName: 'Company Name',
-    pleaseEnterTheCourierCompanyFullName: 'Please enter the full name of the courier company',
-    courierCompanyCode: 'Courier Company Code',
-    courierCompanyFullName: 'Full name of courier company',
-    addTime: 'Add Time',
-    courierCompanyXls: 'Courier Company.xls'
-  },
-  infra: {
-    logPrimaryKey: 'Log Primary Key',
-    linkTrace: 'Link Trace',
-    applicationName: 'Application Name',
-    userInformation: 'User Information',
-    userIp: 'User IP',
-    userUa: 'User UA',
-    requestInformation: 'Request Information',
-    requestParameters: 'Request Parameters',
-    requestResult: 'Request Result',
-    requestTime: 'Request time',
-    requestTimeConsumption: 'Request Time',
-    operationResult: 'Operation Result',
-    normal: 'Normal',
-    failed: 'Failed',
-    operationModule: 'Operation Module',
-    operationName: 'Operation Name',
-    userId: 'User ID',
-    pleaseEnterTheUserNumber: 'Please enter the user number',
-    userType: 'User Type',
-    pleaseSelectUserType: 'Please select user type',
-    pleaseEnterTheApplicationName: 'Please input the application name',
-    pleaseEnterTheExecutionTime: 'Please input the execution time',
-    resultCode: 'Result Code',
-    pleaseEnterTheResultCode: 'Please enter the result code',
-    logNumber: 'Log Number',
-    requestMethod: 'Request method',
-    requestAddress: 'Request Address',
-    successful: 'Successful',
-    failure: 'Failed',
-    operationType: 'Operation Type',
-    detailed: 'Details',
-    operate: 'Operation',
-    aPIAccessLogs_xls: 'API Access Log.xls',
-    exceptionTime: 'Exception Time',
-    exceptionName: 'Exception Name',
-    exceptionStack: 'Exception stack',
-    handlingStatus: 'Handling Status',
-    handler: 'Handler',
-    handlingTime: 'Handling time',
-    pleaseSelectTheProcessingStatus: 'Please select the processing status',
-    timeOfException: 'Exception occurrence time',
-    handled: 'Handled',
-    ignored: 'Ignored',
-    confirmationFlaggedAs: 'Confirmation flagged as',
-    exceptionLogXls: 'Exception Log.xls',
-    generateJSON: 'Generate JSON',
-    generateOptions: 'Generate Options',
-    generateComponents: 'Generate Component',
-    numberOfExecutions: 'How many times it was executed',
-    executionTime: 'Execution time',
-    executionDuration: 'Execution Duration',
-    executionResult: 'Execution Result',
-    successfulExecution: 'Successful execution',
-    confirmThatYouWantToExecuteOnceImmediately: 'Confirm that you want to execute once immediately',
-    open: 'Open',
-    close: 'Close',
-    pause: 'Pause',
-    confirmTo: 'Confirm to',
-    timingTaskNumber: 'Timing task number',
-    ofTheDataItem: 'of the data item',
-    timedTaskExecutionLogXls: 'Timed Task Execution Log.xls',
-    firstExecution: 'The first execution',
-    startExecutionTime: 'Start execution time',
-    endExecutionTime: 'End execution time',
-    selectTheStartExecutionTime: 'Select start execution time',
-    selectTheEndExecutionTime: 'Select end execution time',
-    executeOnce: 'Execute once',
-    taskDetails: 'Task details',
-    schedulingLog: 'Scheduling Log',
-    modify: 'Modify',
-    taskNumber: 'Task number',
-    taskName: 'Task name',
-    taskStatus: 'Task Status',
-    processorName: 'Processor name',
-    parametersOfTheProcessor: 'Parameters of the processor',
-    executionLog: 'Execution log',
-    pleaseEnterTheNameOfTheProcessor: 'Please enter the name of the processor',
-    pleaseSelectTheTaskStatus: 'Please select the task status',
-    pleaseEnterTheTaskName: 'Please enter the task name',
-    milliseconds: 'Milliseconds',
-    notOpened: 'Not turned on',
-    cron: 'Cron expression',
-    numberOfRetries: 'Retries',
-    retryInterval: 'Retry Interval',
-    monitorTimeout: 'Monitor Timeout',
-    subsequentExecutionTime: 'Subsequent execution time',
-    pleaseEnterATaskName: 'Please enter a task name',
-    pleaseEnterTheParametersOfTheProcessor: 'Please enter the processor parameters',
-    pleaseEnterTheNumberOfRetriesWhenSetTo0NoRetriesArePerformed: 'Please enter the number of retries. When set to 0, no retries are performed',
-    pleaseEnterTheRetryIntervalInMillisecondsWhenSetTo0NoIntervalIsRequired: 'Please enter the retry interval in milliseconds. When set to 0, no interval is required',
-    pleaseEnterTheMonitoringTimeoutInMilliseconds: 'Please enter the monitoring timeout in milliseconds',
-    cronExpression: 'CRON expression',
-    taskNameCannotBeNull: 'Task name cannot be empty',
-    processorNameCannotBeNull: 'Processor name cannot be null',
-    cronExpressionCannotBeNull: 'CRON expression cannot be null',
-    retryCountCannotBeNull: 'The retry count cannot be null',
-    retryIntervalCannotBeNull: 'Retry interval cannot be null',
-    basicInformation: 'Basic Information',
-    modeOfOperation: 'Mode of operation',
-    standalone: 'Standalone',
-    cluster: 'Cluster',
-    redisVersion: 'Redis version : Redis',
-    runtimeMode: 'Runtime Mode :',
-    ports: 'Ports :',
-    numberOfClients: 'Number of Clients :',
-    runtimeDays: 'Runtime (days) :',
-    memoryUsed: 'Memory Used :',
-    cpuUsed: 'CPU Used',
-    memoryConfiguration: 'Memory Configuration :',
-    whetherAOFIsEnabledOrNot: 'Whether AOF is enabled or not :',
-    whetherRDBSuccessfulOrNot: 'RDB Successful or not :',
-    numberOfKeys: 'Number of Keys',
-    networkIngressEgress: 'Network Ingress/Egress :',
-    memoryUsage: 'Memory Usage',
-    peak: 'Peak',
-    commandStatistics: 'Command Statistics',
-    commands: 'Command',
-    memoryConsumption: 'Memory Consumption',
-    anExceptionOccurredInProcessingTheMessage: 'An exception occurred for processing messages:',
-    messageNotProcessed: 'Message not processed:',
-    systemNotification: '[System notification]:',
-    groupSendingUserNumber: '[Group notification] User number',
-    groupNoticUserCode: '[Group Notification] User number',
-    unknownMessageType: 'Unknown message type:',
-    messageReceived: 'Message received',
-    messageRecord: 'Message Record',
-    sent: 'Sent',
-    allPeople: 'Everyone',
-    pleaseSelectSender: 'Please select sender',
-    closeConnection: 'Close connection',
-    openConnection: 'Open connection',
-    serviceAddress: 'Service address',
-    connectionStatus: 'Connection status',
-    connection: 'Connection',
-    messageInputBox: 'Message input box',
-    pleaseEnterMessageSend: 'Please enter the message you want to send',
-    theTestPassedAndTheFileWasUploadedSuccessfullyAccessAddress: 'The test passed and the file was uploaded successfully! Access address:',
-    isItConfirmedToModifyTheConfigurationNumberOfTheDataItemIsTheMainConfiguration: 'Is it confirmed to modify the data item with the configuration number',
-    theDataItemsInTheMainConfigurationOfThe: 'of the data item is the main configuration?',
-    test: 'Test',
-    masterConfiguration: 'Master Configuration',
-    no: 'No.',
-    remarks: 'Remarks',
-    configurationName: 'Configuration name',
-    memory: 'Memory',
-    pleaseEnterTheConfigurationName: 'Please enter the configuration name',
-    pleaseSelectMemory: 'Please select memory',
-    configurationNameCannotBeEmpty: 'Configuration name cannot be empty',
-    memoryCannotBeEmpty: 'Memory cannot be empty',
-    basePathCannotBeEmpty: 'Base path cannot be empty',
-    hostAddressCannotBeEmpty: 'Host address cannot be empty',
-    hostPortCannotBeEmpty: 'Host Port cannot be empty',
-    userNameCannotBeEmpty: 'User name cannot be empty',
-    passwordCannotBeEmpty: 'Password cannot be empty',
-    connectionModeCannotBeEmpty: 'Connection Mode cannot be empty',
-    nodeAddressCannotBeEmpty: 'Node address cannot be empty',
-    storageBucketCannotBeEmpty: 'Storage bucket cannot be empty',
-    accessKeyCannotBeEmpty: 'accessKey cannot be null',
-    accessSecretCannotBeNull: 'accessSecret cannot be null',
-    storage: 'Storage',
-    customizedDomainNameCannotBeEmpty: 'Custom domain name cannot be null',
-    basePath: 'Base Path',
-    hostAddress: 'Host Address',
-    hostPort: 'Host Port',
-    userName: 'Username',
-    password: 'Password',
-    connectionMode: 'Connection Mode',
-    nodeAddress: 'Node Address',
-    storageBucket: 'Storage bucket',
-    customizedDomainName: 'Custom domain name',
-    pleaseEnterAConfigurationName: 'Please enter a configuration name',
-    pleaseEnterNotes: 'Please enter notes',
-    pleaseSelectStorage: 'Please select storage',
-    pleaseEnterTheBasePath: 'Please enter the base path',
-    pleaseEnterTheHostAddress: 'Please enter the host address',
-    pleaseEnterTheHostPort: 'Please enter the host port',
-    pleaseEnterAPassword: 'Please enter the password',
-    pleaseEnterTheNodeAddress: 'Please enter the node address',
-    pleaseEnterBucket: 'Please enter bucket',
-    pleaseEnterACustomizedDomainName: 'Please enter a custom domain name',
-    pleaseEnterACustomDomainName: 'Please enter a custom domain name',
-    activeMode: 'Active mode',
-    passiveMode: 'Passive mode',
-    pleaseEnterAccessKey: 'Please enter accessKey',
-    pleaseEnterAccessSecret: 'Please enter accessSecret',
-    pleaseEnterTheFilePath: 'Please enter the file path',
-    pleaseEnterTheFileType: 'Please enter the file type',
-    fileName: 'File name',
-    filePath: 'File Path',
-    fileSize: 'File Size',
-    fileType: 'File Type',
-    fileContent: 'File Content',
-    preview: 'Preview',
-    download: 'Download',
-    uploadTime: 'Upload time',
-    uploadFile: 'Upload file',
-    dragTheFileHereOr: 'Drag the file here, or',
-    clickUpload: 'Click Upload',
-    tipOnlyJpgPngGifFormatsAreAllowedToBeImported: 'Tip: Only jpg, png, gif formats are allowed to be imported!',
-    pleaseUploadTheFile: 'Please upload the file!',
-    uploadFailedPleaseReUpload: 'Upload failed, please re-upload!',
-    youCanOnlyUploadAMaximumOfOneFile: 'Only one file can be uploaded at most!',
-    dataSourceName: 'Data source name',
-    dataSourceConnection: 'Data source connection',
-    pleaseEnterAParameterName: 'Please enter a parameter name',
-    pleaseEnterTheDataSourceConnection: 'Please enter the data source connection',
-    pleaseEnterAUserName: 'Please enter a user name',
-    dataSourceNameCannotBeEmpty: 'Data source name cannot be empty',
-    dataSourceConnectionCannotBeEmpty: 'Data source connection cannot be null',
-    primaryKeyNumber: 'Primary key number',
-    parameterConfigurationXls: 'Parameter Configuration.xls',
-    parameterPrimaryKey: 'Parameter Key',
-    parameterCategory: 'Parameter Category',
-    parameterKeyName: 'Parameter key name',
-    parameterKeyValue: 'Parameter key value',
-    visibleOrNot: 'Visible or not',
-    parameterName: 'Parameter name',
-    builtInSystem: 'System built-in',
-    pleaseEnterTheParameterName: 'Please enter a parameter name',
-    pleaseEnterTheParameterKeyName: 'Please input the parameter key name',
-    pleaseSelectSystemBuiltIn: 'Please select the system built-in',
-    pleaseEnterAParameterCategory: 'Please input the parameter category',
-    pleaseInputParameterName: 'Please input parameter name',
-    pleaseInputParameterKeyName: 'Please input parameter key name',
-    pleaseEnterTheParameterKeyValue: 'Please input parameter key value',
-    pleaseEnterTheContent: 'Please input the content',
-    parameterCategoryCannotBeEmpty: 'Parameter category cannot be empty',
-    parameterNameCannotBeEmpty: 'Parameter name cannot be empty',
-    parameterKeyNameCannotBeNull: 'Parameter key name cannot be null',
-    parameterKeyValueCannotBeNull: 'Parameter key value cannot be null',
-    visibleOrInvisibleCannotBeNull: 'Visible or invisible cannot be null',
-    tableName: 'Table name',
-    tableDescription: 'Table Description',
-    pleaseEnterAWarehouseName: 'Please enter a warehouse name',
-    pleaseEnter: 'Please enter',
-    entityClassName: 'Entity class name',
-    infraTips: 'The prefix of the table name is removed by default. If there are duplicates, you need to add the prefix manually to avoid MyBatis reporting Alias duplicates.',
-    author: 'Author',
-    fieldColumnName: 'Field Column Name',
-    fieldDescription: 'Field Description',
-    physicalType: 'Physical Type',
-    javaType: 'Java Type',
-    javaAttributes: 'java attribute',
-    insert: 'Insert',
-    edit: 'Edit',
-    list: 'List',
-    query: 'Query',
-    queryMethod: 'Query Method',
-    allowNull: 'Allow Null',
-    displayType: 'Display Type',
-    textBox: 'Text Box',
-    textField: 'Text Field',
-    dropdownBox: 'Drop-down box',
-    radioBox: 'Radio box',
-    checkbox: 'Checkbox',
-    dateControl: 'Date control',
-    imageUpload: 'Image Upload',
-    fileUpload: 'File Upload',
-    richTextControls: 'Rich Text Controls',
-    dictionaryTypes: 'Dictionary Types',
-    examples: 'Examples',
-    generatedTemplates: 'Generate Template',
-    frontEndTypes: 'Front-end Types',
-    generatedScenarios: 'Generated Scenarios',
-    parentMenu: 'Parent Menu',
-    assignToASpecificMenuEgSystemManagement: 'Assign to a specific menu, e.g. System Management',
-    pleaseSelectTheSystemMenu: 'Please select the System menu',
-    moduleName: 'Module name',
-    moduleNameIeFirstLevelDirectoryEgSystemInfraToolEtc: 'Module name, i.e. first-level directory, e.g. system, infra, tool, etc.',
-    businessName: 'Business name',
-    businessNameIeSecondLevelDirectoryEgUserPermissionDictEtc: 'Business name, i.e. second level directory, e.g. user, permission, dict, etc.',
-    className: 'Class name',
-    classNameInitialCapitalizedEgSysUserSysMenuSysDictDataEtc: 'Class name (first letter uppercase), e.g. SysUser, SysMenu, SysDictData, etc.',
-    classDescription: 'Class Description',
-    usedAsAClassDescriptionEgUser: 'Used as a class description, e.g. user',
-    customPath: 'Custom path',
-    fillInTheAbsolutePathToTheDiskIfNotItWillBeGeneratedUnderTheCurrentWebProject: 'Fill in the absolute path to the disk, if not, it will be generated under the current web project.',
-    quickSelectionOfTheNearestPath: 'Quick selection of the nearest path',
-    restoreTheDefaultGeneratedBasePath: 'Restore the default generated base path',
-    treeTableInformation: 'Tree table information',
-    parentNumberField: 'Parent number field',
-    theNameOfTheParentCodeFieldOfTheTreeDisplaySuchAsParentId: 'The name of the parent code field of the tree display, such as: parent_Id',
-    treeNameField: 'Tree Name Field',
-    nameOfTheDisplayNameFieldOfTheTreeNodeEgDeptName: 'Name of the display name field of the tree node, e.g. dept_name',
-    masterTableInformation: 'Master Table Information',
-    associatedMasterTable: 'Associated master table',
-    theNameOfTheAssociatedMasterParentTableEgSystemUser: 'The name of the associated master (parent) table, e.g., system_user',
-    fieldsAssociatedWithChildTables: 'Fields associated with child tables',
-    fieldsAssociatedWithTheChildTableSuchAsUserId: 'Fields associated with the child table, such as: user_id',
-    relationship: 'Relationships',
-    theRelationshipBetweenTheMasterTableAndTheChildTable: 'The relationship between the master table and the child table',
-    oneToMany: 'One-to-many',
-    oneToOne: 'One-to-one',
-    fieldInformation: 'Field information',
-    generatedInformation: 'Generated Information',
-    importTable: 'Import Table',
-    importSuccessful: 'Import Success',
-    dataSource: 'Data Source',
-    pleaseSelectADataSource: 'Please select a data source',
-    pleaseEnterATableName: 'Please enter a table name',
-    pleaseEnterATableDescription: 'Please enter table description',
-    generateCode: 'Generate Code',
-    entity: 'Entity',
-    updateTime: 'Update Time',
-    areYouSureYouWantToForceSynchronizationOfTableStructure: 'Are you sure you want to force synchronisation of',
-    tableStructure: 'table structure?',
-    synchronizationSuccessful: 'Synchronisation successful',
-    codePreview: 'Code Preview',
-    generateFileInDirectory: 'Generating file directory...',
-    loadingCode: 'Loading code....',
-    timedTaskXls: 'Timed Tasks.xls',
-  },
-  mall: {
-    paymentResult: 'Payment results',
-    orderNo: 'Order No',
-    creditCard: 'Credit Card',
-    rakutenPay: 'Rakuten Pay',
-    scanningTheCodeForReceivingPayment: 'Sweep the code to collect money in...',
-    paymentSettlement: 'Payment Settlement',
-    placeAnOrder: 'Order',
-    neverPlacedAnOrder: 'Never placed an order',
-    advertisementPictureManagementXls: 'Advertisement Map Management.xls',
-    newAddCashWithdrawal: 'New withdrawals',
-    orderNumber: 'Order Number',
-    totalOrderPrice: 'Total Order Price',
-    specification: 'Specification',
-    orderPickup: 'Order Pickup',
-    numberOfDiners: 'Number of diners',
-    pleaseEnterTheNumberOfPeople: 'Please enter the number of people',
-    totalAmount: 'Total Amount',
-    goToOrder: 'Go to order',
-    noProducts: 'No products...',
-    tableTop: 'Table Top',
-    pleaseSelectTheSpecification: 'Please select the specification!',
-    pleaseSelectTheStore: 'Please select the shop!',
-    quantityCannotBeLessThan1: 'Quantity cannot be less than 1.',
-    noProductsListed: 'No products listed',
-    pleaseAddTheProductFirst: 'Please add products first!',
-    theNumberOfDinersMustBeGreaterThan0: 'The number of diners must be greater than 0!',
-    pleaseEnterTheProductKeywordProductName: 'Please enter the product keyword: product name',
-    checkProducts: 'Search for product',
-    cashier: 'Cashier',
-    noItemsAvailableAtThisTime: 'There are no products available at this time.',
-    totalNumberOfItems: 'Total number of items',
-    pendingOrders: 'Pending Order',
-    selectProductSpecification: 'Select Product Specification',
-    pleaseAddAStoreOrSelectAStore: 'Please add a shop or select a shop',
-    pleaseUseTheScannerBoxOrScannerGunToScanTheMemberPaymentCode: "Please use the scanner box or scanner gun to scan the member's payment code!",
-    scanTheCodeAndPrintTheTicket: 'Scan the code and print the ticket',
-    successfulPayment: 'Payment successful',
-    printTicket: 'Print Ticket',
-    settleMattersAdding: 'Add to checkout',
-    settleMattersSubmit: 'Submit Settlement',
-    pleaseChooseThePaymentMethod: 'Please select payment method',
-    cash: 'Cash',
-    balancePayment: 'Balance Payment',
-    weChatPayment: 'WeChat Payment',
-    alipayPayment: 'Alipay Payment',
-    settlementInformation: 'Settlement Information',
-    remarkInformation: 'Remarks',
-    pleaseEnterNoteInformation: 'Please enter note information',
-    discountDiscount: 'Discount:(Discount)',
-    pleaseEnterDiscount: 'Please enter discount',
-    reduction$: 'Reduction:($)',
-    pleaseEnterTheDiscountAmount: 'Please enter the discount amount',
-    discountAmount: 'Discount Amount',
-    amountDue: 'Amount payable',
-    name: 'Name',
-    cellPhoneNumber: 'Mobile phone number',
-    availableBalance: 'Available Balance',
-    availablePoints: 'Available Points',
-    confirmReceipt: 'Confirm Receipt',
-    memberInformation: 'Member Information',
-    unbound: 'Unbound',
-    _$: '(Yuan)',
-    storeName: 'Shop Name',
-    couponName: 'Coupon Name',
-    spendHowMuchAvailable: 'Consumption of how much available',
-    couponAmount: 'Coupon Amount',
-    availableType: 'Available Type',
-    pickup: 'Pick-up',
-    takeOut: 'Takeaway',
-    generalPurpose: 'General Purpose',
-    used: 'Used',
-    unused: 'Unused',
-    userNickname: 'Nickname',
-    usedNot: 'Used or not',
-    pickupTime: 'Collection time',
-    showStores: 'Show Stores',
-    selectStore: 'Select shop',
-    redeemCode: 'Redemption Code',
-    picture: 'Picture',
-    howMuchToSpend: 'How much you spend',
-    startTime: 'Start time',
-    closingTime: 'End time',
-    numberOfIssues: 'Number of Issues',
-    pointsRequired: 'Points required',
-    limit: 'Limit',
-    instructionsForUse: 'Instructions for use',
-    whetherItIsOnTheShelfOrNot: 'Whether it is on the shelves',
-    pleaseEnterTheRedemptionCode: 'Please enter the redemption code',
-    pleaseEnterTheNameOfTheCoupon: 'Please enter the name of the coupon',
-    pleaseEnterTheAmountOfMoneySpent: 'Please enter the amount of money spent',
-    pleaseEnterTheAmountOfTheCoupon: 'Please enter the amount of the coupon',
-    selectStartTime: 'Select start time',
-    selectTheEndTime: 'Select end time',
-    pleaseEnterTheNumberOfIssues: 'Please enter the number of issues',
-    pleaseEnterTheNumberOfPointsRequired: 'Please enter the number of points required',
-    pleaseEnterTheQuantityLimit: 'Please enter the number of points required',
-    pleaseEnterTheInstructionsForUse: 'Please enter the instructions',
-    storeId0MeansGenericCantBeEmpty: "Shop id,0 means generic can't be empty.",
-    couponNameCannotBeEmpty: 'Coupon name cannot be empty',
-    consumptionOfHowMuchIsAvailableCanNotBeEmpty: 'The amount of consumption can be used can not be empty',
-    couponAmountCannotBeEmpty: 'Coupon amount cannot be empty',
-    startTimeCannotBeEmpty: 'Start time cannot be empty',
-    endTimeCannotBeEmpty: 'End time cannot be empty',
-    availableTypeCannotBeEmpty: 'Available type cannot be empty',
-    theNumberOfCouponsIssuedCannotBeEmpty: 'Quantity issued cannot be empty',
-    limitOnNumberOfCouponsCannotBeEmpty: 'Limit on number of coupons cannot be empty',
-    descriptionOfUseCannotBeEmpty: 'Description cannot be empty',
-    availableStores: 'Available shops',
-    whetherTheCouponIsOnTheShelfOrNot: 'Whether or not the product is on the shelves',
-    howMuchDoYouWantToSpend: 'How much you spend',
-    redemptionCode: 'Redemption Code',
-    received: 'Already received',
-    endTime: 'End time',
-    pleaseEnterAStoreName: 'Please enter shop name',
-    pleaseEnterTheCouponName: 'Please enter the name of the coupon',
-    collectionRecord: 'Collection Record',
-    couponXls: 'Coupon.xls',
-    tableNumber: 'Table number',
-    id: 'id',
-    classification: 'Classification',
-    tableName: 'Table Name',
-    numberOfOrders: 'Number of Orders',
-    consumptionAmount: 'Consumption amount',
-    lastOrderTime: 'Last order time',
-    pleaseEnterStoreName: 'Please enter shop name',
-    pleaseEnterTheNumber: 'Please enter the number',
-    batchAdd: 'Batch Add',
-    batchDownloadOrderCode: 'Batch download order code',
-    import: 'Import',
-    downloadAndImportTemplate: 'Download and import template',
-    qrCode: 'QR Code',
-    relatedOrders: 'Related Orders',
-    storesTableNumberXls: 'Shops - Table Number.xls',
-    batchImportTableNumberTemplateXls: 'Batch import table number template.xls',
-    smallProgramQrCodeCanOnlyDownloadTheOfficialOh: 'Applet QR code can only download the official Oh',
-    allOrders: 'All Orders',
-    orderStatus: 'Order Status',
-    all: 'All',
-    unpaid: 'Unpaid',
-    inProgress: 'In progress',
-    toBeReceived: 'To be received',
-    receivedPickedUp: 'Received/picked up',
-    refundOrder: 'Refund Order',
-    deleted: 'Deleted',
-    alipay: 'Alipay Payment',
-    cashPayment: 'Cash',
-    userName: 'User Name',
-    phoneNumber: 'Phone number',
-    userType: 'User Type',
-    level: 'Level',
-    pleaseEnterTheOrderNumber: 'Please enter the order number',
-    pleaseEnterYourName: 'Please enter your name',
-    pleaseEnterYourPhoneNumber: 'Please enter your phone number',
-    store: 'Shop',
-    userIdNickname: 'User id|Nickname',
-    userNamePhoneNumber: 'User name | Phone',
-    productInformation: 'Product Information',
-    actualPayment: 'Actual payment',
-    paymentMethod: 'Payment method',
-    purchaseType: 'Purchase type',
-    paymentTime: 'Payment Time',
-    notShipped: 'Undelivered',
-    paymentConfirmed: 'Payment Confirmed',
-    orderDetails: 'Order Details',
-    modifyToPaymentStatus: 'Modify to Payment Status',
-    dineIn: 'Dine-in',
-    order: 'Order',
-    selectTableCategory: 'Select Tabletop Category',
-    tabletopPicture: 'Picture',
-    remarks: 'Remarks',
-    desktopPicture: 'Tabletop Picture',
-    pleaseEnterTableName: 'Please enter table name',
-    pleaseEnterTableNumber: 'Please enter the table number',
-    storeCannotBeEmpty: 'Shop cannot be empty',
-    tableNumberCannotBeEmpty: 'Table number cannot be empty',
-    tableNameCannotBeEmpty: 'Table name cannot be empty',
-    status1Enabled2DisabledCannotBeEmpty: 'Status: 1=Enabled, 2=Disabled cannot be empty.',
-    tableNumberPrefix: 'Table number prefix',
-    tableNumberRange: 'Table number range',
-    remark: 'Remarks',
-    tableNumberPrefixCannotBeEmpty: 'Table number prefix cannot be empty',
-    tableNumberStartCannotBeEmpty: 'Beginning of table number cannot be empty',
-    tableNumberEndCannotBeEmpty: 'End of table number cannot be empty',
-    status1EqualsEnable2EqualsDisableCannotBeEmpty: 'Status: 1=Enable, 2=Disable cannot be empty.',
-    likeY: 'For example:Y',
-    miniProgramVersion: 'Applet Version',
-    miniProgramQrCode: 'Applet QR Code',
-    h5QrCode: 'H5 QR code',
-    miniProgramNotConfigured: 'Applet not configured',
-    statusOneEqualsEnableTwoEqualsDisableCannotBeEmpty: "Status: 1=Enabled, 2=Disabled can't be empty",
-    releaseVersion: 'Official Version',
-    experienceVersion: 'Experience Version',
-    developmentVersion: 'Development Version',
-    miniProgramQrCodeCanOnlyBeDownloadedForReleaseVersion: 'Applet QR code can only download the official version',
-    dragFileHereOr: 'Drag the file here, or',
-    clickToUpload: 'Click Upload',
-    onlyAllowImportXlsXlsxFiles: 'Only xls, xlsx format files can be imported.',
-    downloadTemplate: 'Download template',
-    pleaseUploadFile: 'Please upload the file',
-    uploadSuccessCount: 'Number of successful uploads:',
-    updateSuccessCount: 'Number of successful updates:',
-    updateFailureCount: 'Update failed quantity:',
-    uploadFailedPleaseReupload: 'Upload failed, please re-upload!',
-    maxOneFileCanBeUploaded: 'Only one file can be uploaded at most!',
-    categoryName: 'Category Name',
-    pleaseEnterCategoryName: 'Please enter a category name',
-    categoryNumber: 'Category number',
-    personCount: 'Number of people',
-    categorySort: 'Category Sort',
-    openStatus: 'Open Status',
-    storeTableNumberCategoryXls: 'Shop Table Number Classification.xls',
-    pleaseEnterPersonCount: 'Please enter the number of people',
-    pleaseSelectStore: 'Please select shop',
-    categoryNameCannotBeEmpty: 'Category name cannot be empty',
-    personCountCannotBeEmpty: 'Number of people cannot be empty',
-    categorySortCannotBeEmpty: 'Sort by category cannot be empty',
-    wechatMiniProgram: 'WeChat Applet',
-    officialAccount: 'Public',
-    h5: 'H5',
-    pleaseEnterUserNickname: 'Please enter your nickname',
-    pleaseEnterPhoneNumber: 'Please enter your mobile phone number',
-    userAvatar: 'User avatar',
-    userBalance: 'User Balance',
-    userLoginType: 'User Login Type',
-    detail: 'Details',
-    pointsBalance: 'Points Balance',
-    userXls: 'User.xls',
-    userInfo: 'User Information',
-    basicInfo: 'Basic Information',
-    balance: 'Balance',
-    birthday: 'Birthday',
-    idCardNumber: 'Identity Card Number',
-    boundMembershipCard: 'Bound membership card',
-    points: 'Points',
-    commissionAmount: 'Commission Amount',
-    consecutiveSignInDays: 'Consecutive Sign-in Days',
-    loginIp: 'Login ip',
-    userLevel: 'Level',
-    promotionId: 'Promotion id',
-    purchaseCount: 'Purchase',
-    subordinateCount: 'Number of subordinates',
-    loginType: 'Login Type',
-    registrationTime: 'Registration Time',
-    userOverview: 'User Profile',
-    consumptionRecord: 'Consumption Record',
-    expenseOrGain: 'Spend/Acquire',
-    expense: 'Expenditure',
-    gain: 'Acquisition',
-    unknown: 'Unknown',
-    billTitle: 'Bill Title',
-    detailCategory: 'Detail Type',
-    detailType: 'Detail Type',
-    recharge: 'Recharge',
-    rebate: 'Rebate',
-    consumption: 'Spend',
-    withdrawal: 'Withdrawal',
-    refund: 'Refund',
-    systemAdd: 'System Add',
-    systemReduce: 'System Reduce',
-    subtract: 'Subtract',
-    reward: 'Rewards',
-    signIn: 'Sign-in',
-    membershipCard: 'Membership Card',
-    detailAmountYuan: 'Detailed Figures ($)',
-    remainingYuan: 'Remaining($)',
-    userAccount: 'User Account',
-    realName: 'Real Name',
-    userRemark: 'Remarks',
-    userPoints: 'User Points',
-    detailedAddress: 'Detailed address',
-    pleaseEnterUserAccount: 'Please enter the user account',
-    pleaseEnterRealName: 'Please enter your real name',
-    pleaseEnterBirthday: 'Please enter your birthday',
-    pleaseEnterUserRemark: 'Please enter user notes',
-    pleaseEnterUserBalance: 'Please enter your balance',
-    pleaseEnterCommissionAmount: 'Please enter the commission amount',
-    pleaseEnterUserRemainingPoints: "Please enter the user's remaining points",
-    pleaseEnterDetailedAddress: 'Please enter your address details',
-    userAccountCannotBeEmpty: 'User account cannot be empty',
-    userNicknameCannotBeEmpty: 'Nickname cannot be empty',
-    phoneNumberCannotBeEmpty: "User's mobile phone number cannot be empty",
-    userTypeCannotBeEmpty: "User's user type cannot be empty",
-    phoneNumber1: 'Mobile phone number',
-    selectMember: 'Select Member',
-    select: 'Select',
-    modifyBalance: 'Modify Balance',
-    increase: 'Increase',
-    decrease: 'Decrease',
-    pleaseEnterBalance: 'Please enter the balance',
-    modifyPoints: 'Modify Points',
-    pleaseEnterPoints: 'Please enter points',
-    amountCannotBeEmpty: 'Amount cannot be empty',
-    pointsCannotBeEmpty: 'Points cannot be empty',
-    name1: 'Name and surname',
-    phone: 'Phone number',
-    consigneeName: "Consignee's name",
-    consigneePhone: "Consignee's phone number",
-    consigneeAddress: "Consignee's Address",
-    consigneeDetailedAddress: "Consignee's Address",
-    isDefault: 'Default',
-    pleaseEnterConsigneeName: 'Please enter the name of the consignee',
-    pleaseEnterConsigneePhone: "Please enter the consignee's phone number",
-    consigneeNameCannotBeEmpty: "Consignee's name cannot be empty",
-    consigneePhoneCannotBeEmpty: "Consignee's phone number cannot be empty",
-    consigneeAddressCannotBeEmpty: "Consignee's address cannot be empty",
-    consigneeDetailedAddressCannotBeEmpty: "Consignee's address cannot be empty",
-    isDefaultCannotBeEmpty: 'Default or not cannot be empty',
-    pleaseEnterConsigneeProvince: "Please enter the consignee's province",
-    desktopStatus: 'Desktop status:',
-    idle: 'Idle',
-    dining: 'Dining',
-    noTableData: 'No table data available',
-    dineInOrders: 'Dine-in order',
-    takeoutOrders: 'Takeaway',
-    selfPickupOrders: 'Pick-up',
-    reservationOrders: 'Reservation',
-    pendingOrder: 'Pending orders',
-    pendingReceipt: 'Pending Receipt',
-    receivedOrPickedUp: 'Received / Picked Up',
-    refundOrders: 'Refund Order',
-    reserving: 'Reservation in progress',
-    cancelled: 'Cancelled',
-    completed: 'Completed',
-    wechatPayment: 'WeChat Payment',
-    userPhone: 'User Phone',
-    pleaseEnterOrderNumber: 'Please enter the order number',
-    pleaseEnterUserName: 'Please enter your name',
-    pleaseEnterUserPhone: 'Please enter your phone number',
-    pickupNumber: 'Pickup Number',
-    orderNumber1: 'Order Number',
-    userNamePhone: 'User Name|Tel',
-    productInfo: 'Product Information',
-    reservation: 'Reservation',
-    reservationPickupTime: 'Reservation Time',
-    issueOrder: 'Order',
-    confirmRefund: 'Confirm Refund',
-    cancelReservation: 'Cancellation',
-    confirmPayment: 'Payment Confirmation',
-    orderRecords: 'Order History',
-    deleteOrder: 'Delete Order',
-    orderRemark: 'Order Remarks',
-    backendReceipt: 'Receive goods in the background',
-    modifyToPaidStatus: 'Modify to payment status',
-    modifyReceiptStatus: 'Modify receipt status',
-    confirmCancelReservation: 'Determine the cancellation of the appointment',
-    orderXls: 'Order.xls',
-    receivingInfoOne: 'Receiving Information1',
-    consignee: 'Consignee',
-    contactPhone: 'Contact phone number',
-    receivingAddress: 'Address',
-    dishDetails: 'Details of the dish',
-    mealNotServed: 'No meal',
-    mealServed: 'Dispensed',
-    userOrdering: 'User Order',
-    staffOrderingOnBehalf: "Employee's order",
-    productDetails: 'Product Details',
-    reserveTable: 'Reservation',
-    price: 'Price',
-    quantity: 'Quantity',
-    orderInfo: 'Order Information',
-    diningPersonCount: 'Number of diners',
-    reservationTime: 'Reservation Time',
-    arrivalTime: 'Arrival time',
-    reservationPerson: 'Reservations',
-    reservationPhone: 'Reservation phone number',
-    reservationStatus: 'Reservation Status',
-    totalProductQuantity: 'Total number of products',
-    totalProductPrice: 'Total Price',
-    shippingFee: 'Shipping Fee',
-    pointsDeduction: 'Points Credit',
-    orderTotalPriceCannotBeEmpty: 'The total price of the order cannot be empty',
-    actualPaymentAmountCannotBeEmpty: 'Actual payment amount cannot be empty',
-    consumptionEarnedPointsCannotBeEmpty: 'Spending to earn points can not be empty',
-    bonusPoints: 'Bonus Points',
-    orderIssued: 'Order has been placed',
-    pleasePlaceAnOrderFirst: 'Please order first!',
-    confirmOfflineCollection: 'Determine the next line of collection',
-    assistWithOrdering: 'Assist in ordering',
-    confirmCollection: 'Confirm payment',
-    issueOrderAndPrintReceipt: 'Print the ticket',
-    print: 'Printing',
-    receiptPrint: 'Ticket Printing',
-    displayStore: 'Shop Display',
-    categoryImage: 'Category Pictures',
-    categoryDescription: 'Category Description',
-    pleaseEnterCategoryDescription: 'Please enter a category description',
-    openStatusCannotBeEmpty: 'Open status cannot be empty',
-    belongingStore: 'Shops',
-    productName: 'Product Name',
-    commentId: 'Comment ID',
-    productScore: 'Product Score',
-    serviceScore: 'Service Score',
-    commentContent: 'Comment content',
-    commentTime: 'Comment time',
-    adminReplyContent: 'Administrator reply content',
-    adminReplyTime: 'Administrator reply time',
-    pleaseEnterNickname: 'Please enter a nickname',
-    reply: 'Reply',
-    weight: 'Weight',
-    pleaseEnterWeight: 'Please enter a weight',
-    imageCannotBeEmpty: 'Image cannot be empty',
-    weightCannotBeEmpty: 'Weight cannot be empty',
-    image: 'Image',
-    isAvailable: 'Availability',
-    salesVolume: 'Sales volume',
-    value: 'Value',
-    sellingPrice: 'Selling price',
-    pleaseEnterTitle: 'Please enter a title',
-    title: 'Title',
-    pleaseEnterValue: 'Please enter a value',
-    pleaseEnterSellingPrice: 'Please enter a sales price',
-    display: 'Show',
-    hide: 'Hide',
-    titleCannotBeEmpty: 'Title cannot be empty',
-    valueCannotBeEmpty: 'Value cannot be empty',
-    sellingPriceCannotBeEmpty: 'Selling price cannot be empty',
-    icon: 'Icon',
-    type: 'Type',
-    pagePath: 'Page Path',
-    page: 'Page',
-    jumpToMiniProgram: 'Jump Applet',
-    content: 'Content',
-    myServiceXls: 'My Services.xls',
-    selectType: 'Select type',
-    miniProgramAppId: 'Applet app_id',
-    pleaseSelectType: 'Please select type',
-    pleaseEnterMiniProgramAppId: 'Please enter applet app_id',
-    pleaseEnterPagePath: 'Please enter the page path',
-    pleaseEnterPhone: 'Please enter a phone number',
-    typeCannotBeEmpty: 'Type cannot be empty',
-    iconCannotBeEmpty: 'Icon cannot be empty',
-    specificationName: 'Specification name',
-    specificationValue: 'Specification Value',
-    pleaseEnterSpecificationName: 'Please enter a specification name',
-    pleaseEnterAttributeName: 'Please enter a property name',
-    pleaseEnterSpecificationValue: 'Please input specification value',
-    addNewSpecification: 'Add new specification',
-    specificationNameCannotBeEmpty: 'Specification name cannot be empty',
-    specificationValueCannotBeEmpty: 'Specification value cannot be empty',
-    rechargeAmountManagementXls: 'Charge Amount Management.xls',
-    productRuleValueSpecificationXls: 'Commodity Rule Value(Specification).xls',
-    withdrawalAmountCannotBeEmpty: 'Withdrawal Amount cannot be empty.',
-    bankCardCannotBeEmpty: 'Bank card cannot be empty.',
-    withdrawalAmount: 'Withdrawal Amount',
-    withdrawToBankCard: 'Withdraw cash to bank card',
-    pleaseEnterWithdrawalAmount: 'Please enter the withdrawal amount',
-    selectBankCard: 'Select bank card',
-    pleaseSelectStatus: 'Please select the status',
-    unreviewed: 'Not audited',
-    pendingArrival: 'Pending',
-    reviewRejected: 'Rejected',
-    arrived: 'Deposited',
-    withdrawalBankCard: 'Withdrawal Bank Card',
-    bankName: 'Bank Name',
-    bankCardNumber: 'Card Number',
-    reviewRejectionReason: 'Reason for Audit Rejection',
-    review: 'Audit',
-    bankNameColon: 'Bank Name:',
-    bankCardNumberColon: 'Bank card no:',
-    realNameColon: 'Real Name:',
-    phoneNumberColon: 'Mobile phone number:',
-    pleaseEnterReviewRejectionReason: 'Please enter the reason for audit rejection',
-    printerName: 'Printer Name',
-    terminalNumber: 'Terminal Number',
-    terminalKey: 'Terminal Key',
-    pleaseEnterPrinterName: 'Please enter the printer name',
-    configurePrinter: 'Configure printer',
-    printerClientId: 'Printer clientId',
-    printerClientSecret: 'Printer clientSecret',
-    printerClientIdCannotBeEmpty: 'Printer clientId cannot be null',
-    printerClientSecretCannotBeEmpty: 'Printer clientSecret cannot be empty.',
-    pleaseEnterTerminalNumber: 'Please enter the terminal number.',
-    pleaseEnterTerminalKey: 'Please enter the terminal key.',
-    pleaseEnterBankName: 'Please enter your bank name.',
-    pleaseEnterBankCardNumber: 'Please enter your bank card number.',
-    pleaseEnterName: 'Please enter your name',
-    bankNameCannotBeEmpty: 'Bank name cannot be empty',
-    bankCardNumberCannotBeEmpty: 'Card number cannot be empty',
-    nameCannotBeEmpty: 'Name cannot be blank',
-    ID: 'ID',
-    pleaseEnterUserId: 'Please enter a user id',
-    pleaseSelectUser: 'Please select user',
-    income: 'Income',
-    amount: 'Amount',
-    storeId: 'Shop ID',
-    typeTips: 'Type:1=Income,2=Expense',
-    pleaseSelectDictionaryGeneration: 'Please select the dictionary to generate',
-    user: 'User',
-    pleaseEnterStoreId: 'Please enter the shop ID',
-    pleaseSelectTypeTips: 'Please select type:1=Income,2=Expense',
-    pleaseEnterAmount: 'Please enter the amount',
-    pleaseEnterUser: 'Please input user',
-    storeNameCannotBeEmpty: 'Shop name cannot be empty',
-    associatedTags: 'Label',
-    selectTag: 'Select Tag',
-    intervalTimeUnitHours: 'Interval time (in hours)',
-    pleaseEnterIntervalTimeUnitHours: 'Please enter the interval time in hours',
-    selectEndTime: 'Select end time',
-    pleaseSelectTag: 'Please select the label',
-    intervalTimeCannotBeEmpty: 'Interval time cannot be empty',
-    tagName: 'Label name',
-    pleaseEnterTagName: 'Please enter a tag name',
-    tagNameCannotBeEmpty: 'Label name cannot be empty',
-    storePhone: 'Shop phone number',
-    storeImage: 'Shop picture',
-    longitude: 'Longitude',
-    latitude: 'Latitude',
-    minimumOrderPrice: 'Starting Price',
-    deliveryPrice: 'Delivery Price',
-    isOpen: 'Open or not',
-    pleaseEnterStorePhone: 'Please enter the shop phone number',
-    pleaseEnterPlaceKeyword: 'Please enter the keyword of the place name',
-    selectOnMap: 'Map Selection',
-    pleaseSelectLocationAddress: 'Please select the location address',
-    storeAvatar: 'Shop Avatar',
-    storeGroupImages: 'Shops',
-    businessStartTime: 'Opening time',
-    businessEndTime: 'Closing time',
-    selectMapLocation: 'Select map location',
-    mapLocationAddress: 'Map Address',
-    takeoutDeliveryDistance: 'Delivery Distance/Kilometre',
-    announcement: 'Announcement',
-    bindAdministrator: 'Bind administrator',
-    selectBusinessStartTime: 'Select start time',
-    selectBusinessEndTime: 'Select end time',
-    pleaseEnterMapLocationAddress: 'Please enter a map to locate the address',
-    pleaseEnterLongitude: 'Please enter the longitude',
-    pleaseEnterLatitude: 'Please input the latitude',
-    pleaseEnterTakeoutDeliveryDistance: 'Please enter the delivery distance in kilometres, 0 means no delivery',
-    pleaseEnterMinimumOrderPrice: 'Please enter the starting price',
-    pleaseEnterDeliveryPrice: 'Please enter the delivery price',
-    pleaseEnterAnnouncement: 'Please enter the announcement',
-    clickToSelectAddressToGetLongitudeAndLatitude: 'Click on the address to get the latitude and longitude',
-    selectUser: 'Select User',
-    bindAdministratorForBranchManagement: 'Bind administrator for shop management',
-    isStoreReceiptPrintingEnabled: 'Whether to enable shop ticket printing',
-    bindPrinter: 'Bind printer',
-    selectPrinter: 'Select Printer',
-    isCustomerReceiptPrintingEnabled: 'Enable or disable customer ticket printing',
-    isKitchenReceiptPrintingEnabled: 'Enable or disable kitchen ticket printing',
-    storePhoneCannotBeEmpty: 'Shop phone number cannot be empty',
-    multipleImagesCannotBeEmpty: 'Multiple pictures cannot be empty',
-    detailedAddressCannotBeEmpty: 'Address details cannot be empty',
-    mapLocationAddressCannotBeEmpty: 'Map address cannot be empty',
-    longitudeCannotBeEmpty: 'Longitude cannot be empty',
-    latitudeCannotBeEmpty: 'Latitude cannot be empty',
-    takeoutDeliveryDistanceTips: 'Delivery distance in kilometres, 0 means no delivery, cannot be empty',
-    minimumOrderPriceCannotBeEmpty: 'Starting price cannot be empty',
-    deliveryPriceCannotBeEmpty: 'Delivery price cannot be empty',
-    announcementCannotBeEmpty: 'Announcement cannot be empty',
-    isOpenTips: 'Whether open:0=no,1=yes cannot be empty.',
-    administratorIdCannotBeEmpty: 'Administrator id cannot be empty',
-    printerIdCannotBeEmpty: 'Printer id cannot be empty',
-    businessStartTimeCannotBeEmpty: 'Business start time can not be empty',
-    businessEndTimeCannotBeEmpty: 'Business end time can not be empty',
-    pleaseBindStorePrinter: 'Please bind the shop printer',
-    pleaseBindCustomerPrinter: 'Please bind the customer printer',
-    pleaseBindKitchenPrinter: 'Please bind the kitchen printer',
-    storeManagementXls: 'Shop Management.xls',
-    inStoreConsumption: 'Visiting Stores',
-    appointmentLabelXls: 'Reservation Label.xls',
-    appointmentRuleXls: 'Reservation Rules.xls',
-    storeMobileMerchantUserAssociationXls: 'Shop Mobile Merchant User Association.xls'
-  },
-  market: {
-    orderNumber: 'Order number',
-    userIdAndNickname: 'User id|Nickname',
-    billTitle: 'Bill Title',
-    detailedFigureYuan: 'Detailed figure(yuan)',
-    paid: 'Paid',
-    unpaid: 'Unpaid',
-    addTime: 'Add Time',
-    cardName: 'Card Name',
-    pleaseEnterTheNameOfTheMembershipCard: 'Please enter the name of the membership card',
-    discountRatio: 'Discount Ratio',
-    break: 'Discount',
-    validPeriod: 'Valid Period',
-    permanent: 'Permanent',
-    month: 'Monthly',
-    purchasePrice: 'Price of Purchase',
-    bonusPoints: 'Bonus Points',
-    bonusAmount: 'Bonus amount',
-    delete: 'Delete',
-    purchaseRecord: 'Purchase Record',
-    membershipCardXls: 'Membership Card.xls',
-    basicInformation: 'Basic Information',
-    cardStyle: 'Membership Card Style',
-    pleaseEnterTheOrder: 'Please enter the sort',
-    discount: 'Discount',
-    pleaseEnterThePercentageOfDiscount: 'Please enter the percentage of discount',
-    freeGiftWhenYouOpenTheCard: 'Complimentary',
-    balance: 'Balance',
-    NumberBonusPoints: 'Number of bonus points',
-    pleaseEnterTheNumberOfBonusPoints: 'Please enter the number of bonus points',
-    bonusBalance: 'Bonus Balance',
-    pleaseEnterTheBalanceOfTheGift: 'Please enter the bonus balance',
-    receiveConfiguration: 'Receive Configuration',
-    validityPeriod: 'Expiry date',
-    pleaseEnterTheValidityPeriod: 'Please enter the validity period',
-    theValidityPeriodIsInMonths0MeansPermanent: 'The validity period is in months, 0- means permanent',
-    pleaseEnterThePurchasedPrice: 'Please enter the purchase price',
-    rulesForUse: 'Rules of use',
-    cardNameCannotBeEmpty: 'The name of the membership card cannot be empty',
-    cardStyleCannotBeEmpty: 'Card style cannot be empty',
-    expiryDateCannotBeEmpty: 'Expiry date cannot be empty',
-    purchasePriceCannotBeEmpty1: 'Purchase price cannot be empty',
-    orderTotalPriceCannotBeEmpty: 'The total price of the order cannot be empty',
-    refundAmountCannotBeEmpty: 'Refund amount cannot be empty',
-    orderTotalPrice: 'Total Order Price',
-    refundAmount: 'Refund amount',
-    pleaseEnterOrderNumber: 'Please enter the order number',
-    pleaseEnterOrderTotalPrice: 'Please enter the total price of the order',
-    actualPaymentAmountCannotBeEmpty: 'Actual payment amount cannot be empty',
-    consumptionEarnedPointsCannotBeEmpty: 'Spending and earning points cannot be empty',
-    actualPaymentAmount: 'Actual Payment Amount',
-    pleaseEnterActualPaymentAmount: 'Please enter the actual payment amount',
-    pleaseEnterBonusPoints: 'Please enter the bonus points',
-    expressCompanyCannotBeEmpty: 'Courier company cannot be empty',
-    expressTrackingNumberCannotBeEmpty: 'Courier number can not be empty',
-    expressCompany: 'Courier Company',
-    selectExpressCompany: 'Select courier company',
-    pleaseEnterExpressTrackingNumber: 'Please enter the courier order number',
-    courierNumber: 'Express Order Number',
-    tableNumber: 'Table number',
-    pickupNumber: 'Pick-up number',
-    address: 'Address',
-    orderId: 'Order id',
-    operationRecord: 'Operation record',
-    operationTime: 'Operation time'
-  },
-  message: {
-    templateName: 'Template Name',
-    pleaseEnterTheTemplateName: 'Please enter the template name',
-    templateNumber: 'Template number',
-    templateId: 'Template ID',
-    type: 'Type',
-    templateMessage: 'Template Message',
-    subscribeMessage: 'Subscribe Message',
-    addTime: 'Add Time',
-    weChatTemplateXls: 'WeChat Template.xls',
-    messageType: 'Message Type',
-    pleaseSelectType: 'Please select type',
-    pleaseSelectMessageType: 'Please select message type',
-    pleaseEnterTheTemplateNumber: 'Please enter template number',
-    pleaseEnterTheTemplateId: 'Please enter the template ID',
-    templateNumberCannotBeEmpty: 'Template ID cannot be empty',
-    templateNameCannotBeEmpty: 'Template name cannot be empty',
-    messageTypeCannotBeEmpty: 'Template ID cannot be empty',
-    templateIdCannotBeEmpty: 'Message Type cannot be empty',
-    open: 'Enable'
-  },
-  mp: {
-    pleaseSelectTheWeChatOfficialAccount: 'Please select public number',
-    clickToLoadMore: 'Click to load more',
-    thereIsNoMore: 'No more',
-    sends: 'Send(S)',
-    theNumberofGraphicMessagesIsLimitedto1: 'The number of graphic messages is limited to 1, the first one has been sent by default.',
-    pleaseEnterTheMusicLink: 'Please enter a music link',
-    pleaseEnterTheHighQualityMusicLink: 'Please enter a high quality music link',
-    selectThePublishedGraphic: 'Select a published message',
-    selectTheGraphicintheDraftBox: 'Select draft message',
-    selectTheVoice: 'Select Voice',
-    text: 'Text',
-    graphic: 'Graphic',
-    music: 'Music',
-    clickToPlayTheVideo: 'Click to play video',
-    videoPlayback: 'Video Playback',
-    voiceRecognition: 'Speech Recognition',
-    abstract: 'Abstract',
-    name: 'Name',
-    wechatAccount: 'Micro Signal',
-    messageEncryptionKey: 'Message encryption and decryption key',
-    pleaseEnterName: 'Please enter your name',
-    pleaseEnterWechatAccount: 'Please enter your micro-signal',
-    pleaseEnterTheAppIdOfTheWeChatOfficialAccount: 'Please enter the public number appId',
-    pleaseEnterOfficialAccount: 'Please input public number appSecret',
-    pleaseEnterOfficialAccountToken: 'Please enter the public token',
-    pleaseEnterMessageEncryptionKey: 'Please enter the message encryption and decryption key',
-    pleaseEnterMiniProgramAppId: 'Please enter applet appId',
-    pleaseEnterMiniProgramAppSecret: 'Please enter the applet appSecret',
-    tip11: 'You can find "Micro Signal" in the menu [Settings & Development - Public Number Settings - Account Details] of WeChat Public Platform (mp.weixin.qq.com).',
-    tip12: 'You can find "Developer ID (AppID)" in the menu [Settings & Development - Public Number Settings - Basic Settings] of WeChat Public Platform (mp.weixin.qq.com).',
-    tip13: 'You can find "Developer Password (AppSecret)" in [Settings & Development - Public Number Settings - Basic Settings] on the menu of WeChat Public Platform (mp.weixin.qq.com).',
-    nameCannotBeEmpty: 'Name cannot be empty',
-    officialAccountCannotBeEmpty: 'Public number account cannot be empty.',
-    officialAccountAppIdCannotBeEmpty: 'Public appId cannot be empty.',
-    officialAccountSecretCannotBeEmpty: 'Public Key cannot be empty.',
-    officialAccountTokenCannotBeEmpty: 'Public token cannot be empty',
-    appId: 'appId',
-    serverAddressUrl: 'Server address (URL)',
-    qrCode: 'QR Code',
-    generateQRCode: 'Generate QR code',
-    isMainAccount: 'Whether it is the main account',
-    search: 'Search',
-    reset: 'Reset',
-    clearApiQuota: 'Clear API Quota',
-    setAsMainAccount: 'Set as Master Account',
-    settingSucceeded: 'Setup Successful',
-    messageType: 'Message Type',
-    matchingType: 'Match Type',
-    pleaseSelectMatchingType: 'Please select match type',
-    pleaseEnterContent: 'Please enter content',
-    keyword: 'Keyword',
-    replyMessage: 'Reply Message',
-    requestedKeywordCannotBeEmpty: 'The requested keyword cannot be null',
-    requestedKeywordMatchingCannotBeEmpty: 'The match for the requested keyword cannot be null',
-    requestMessageType: 'Request message type',
-    cover: 'Cover',
-    tip3: 'You are publishing content by publishing. Publishing does not take up the number of group posts and can be done multiple times a day.',
-    tip4: 'Published content is not pushed to users and is not displayed on the public home page.',
-    tip5: 'After posting, you can go to the posting history to get the link, or you can add the posted content to custom menus, autoresponders, topics, and page templates.',
-    replyMessageType: 'Reply message types',
-    replyContent: 'Reply Content',
-    officialAccount: 'Public',
-    addNew: 'New',
-    replyOnFollow: 'Reply on Follow',
-    messageReply: 'Message Reply',
-    keywordReply: 'Keyword Reply',
-    addNewAutoReply: 'Add Auto-Reply',
-    modifyAutoReply: 'Modify auto-reply',
-    areYouSureToDeleteThisData: 'Confirm deletion of this data',
-    deletionSucceeded: 'Delete Success',
-    modificationSucceeded: 'Modify Success',
-    additionSucceeded: 'Add Success',
-    updateitionSucceeded: 'Update Success',
-    uploadLocally: 'Local Upload',
-    supportsBmpPngJpegJpgGifFormatsSizeNotExceeding2M: 'Support bmp/png/jpeg/jpg/gif format, size not more than 2M.',
-    uploadError: 'Upload error:',
-    uploadFailed: 'Upload failed:',
-    pleaseEnterTitleRequired: 'Please enter a title (required)',
-    pleaseEnterAuthor: 'Please enter author',
-    pleaseEnterOriginalArticleAddress: 'Please enter the address of the original article',
-    pleaseEnterAbstract: 'Please enter a summary',
-    areYouSureToDeleteThisGraphic: 'Sure you want to delete this graphic?',
-    createNewGraphic: 'Create new image',
-    modifyGraphic: 'Modify image',
-    modifiedContentMayNotBeSavedAreYouSureToClose: 'Changes may not have been saved, are you sure you want to close it?',
-    publishingSucceeded: 'Post Successful',
-    thisOperationWillPermanentlyDeleteTheDraftAreYouSureToContinue: 'This action will permanently delete the draft, do you want to continue?',
-    afterDeletionUsersCannotAccessThisPageAreYouSureToDelete: 'Users will not be able to access this page after deletion, are you sure you want to delete it?',
-    image: 'Picture',
-    voice: 'Voice',
-    video: 'Video',
-    clickToUpload: 'Click to upload',
-    uploadSucceeded: 'Uploaded successfully',
-    createNewVideo: 'New Video',
-    selectVideo: 'Select Video',
-    tip0: 'Format support MP4, file size not more than 10MB.',
-    tips1: 'The title will be displayed on the relevant playback page, it is recommended to fill in a clear, accurate and vivid title.',
-    tips2: 'The introduction will be displayed on the relevant playback page, it is recommended to fill in a concise, clear and informative content.',
-    pleaseEnterTitle: 'Please enter a title',
-    pleaseEnterDescription: 'Please enter a description',
-    number: 'No.',
-    fileName: 'File name',
-    introduction: 'Introduction',
-    uploadTime: 'Upload time',
-    download: 'Download',
-    delete: 'Delete',
-    description: 'Descripción',
-    formatSupportsMp3WmaWavAmrFileSizeNotExceeding2MPlaybackLengthNotExceeding60s: 'Support mp3/wma/wav/amr, file size not more than 2M, playback length not more than 60s.',
-    thisOperationWillPermanentlyDeleteTheFileAreYouSureToContinue: 'This operation will delete the file permanently, do you want to continue?',
-    deleteCurrentMenu: 'Delete current menu',
-    menuName: 'Menu name(CN)',
-    menuNameEn: 'Menu name',
-    menuNameJp: 'Menu name(JP)',
-    pleaseEnterMenuName: 'Please enter a menu name.',
-    menuIdentifier: 'Menu ID',
-    pleaseEnterMenuKey: 'Please input menu KEY',
-    menuContent: 'Menu content',
-    jumpLink: 'Jump link',
-    pleaseEnterLink: 'Please enter a link',
-    miniProgramAppId: 'Appid of the applet ',
-    miniProgramPagePath: 'Page path of the applet',
-    pleaseEnterMiniProgramPagePathEgPagesIndex: "Please enter the applet's page path, e.g. pages/index",
-    miniProgramBackupWebpage: 'Alternate page for the applet:',
-    OlderVersionsOfTheClientThatDoNotSupportMiniProgramsWillOpenThisWebpage: "Older versions of clients that don't support applets will open this page.",
-    tipsYouNeedToAssociateWithTheOfficialAccountToBindTheMiniProgramToTheWeChatMenu: 'Tips:You need to associate with your public number to bind the applet to your WeChat menu!',
-    selectFromMaterialLibrary: 'Material library selection',
-    selectGraphic: 'Select Graphic',
-    YouHaveSelectedAMultiGraphicItWillDefaultToJumpToTheFirstOne: 'If you select more than one article, it will jump to the first one by default.',
-    jumpToWebpage: 'Jump page',
-    jumpToMiniProgram: 'Jump to small programme',
-    clickToReply: 'Click reply',
-    jumpToGraphicMessage: 'Jump to graphic message',
-    scanCodeToReturnResultDirectly: 'Scan the code to return directly to the result',
-    scanCodeToReply: 'Scan code reply',
-    systemTakePhotoAndSendImage: 'System photo sending picture',
-    takePhotoOrSelectFromAlbum: 'Take a picture or photo album',
-    wechatAlbum: 'WeChat Photo Album',
-    selectLocation: 'Select geographic location',
-    subMenuName: 'Submenu name',
-    saveAndPublishMenu: 'Save and publish the menu',
-    clearMenu: 'Empty menu',
-    pleaseSelectMenuConfiguration: 'Please select menu configuration',
-    areYouSureToDelete: 'Sure you want to delete?',
-    areYouSureToSave: 'Sure you want to save?',
-    clearingSucceeded: 'Empty successfully',
-    userIdentifier: 'User identification',
-    pleaseSelectMessageType: 'Please select the message type',
-    pleaseEnterUserIdentifier: 'Please enter a user ID',
-    fanMessageList: 'Fan message list',
-    sendTime: 'Sending time',
-    sender: 'Sender',
-    fan: 'Fans',
-    follow: 'Follow',
-    unfollow: 'Unfollow',
-    clickMenu: 'Click on the menu',
-    clickMenuLink: 'Click on the menu link',
-    scanCodeResult: 'Scanning results',
-    unknownEventType: 'Unknown event type',
-    link: 'Link',
-    unknownMessageType: 'Unknown Message Type',
-    message: 'message',
-    timeRange: 'Time Range',
-    userIncreaseDecreaseData: 'User increase/decrease data',
-    cumulativeUserData: 'Cumulative user data',
-    messageOverviewData: 'Message Profile Data',
-    interfaceAnalysisData: 'Interface Analysis Data',
-    newUsers: 'New Users',
-    unfollowedUsers: 'Unfollowed Users',
-    cumulativeUserCount: 'Accumulated Users',
-    numberOfUsersSendingMessages: 'Number of users sent',
-    numberOfMessagesSentByUsers: 'Number of messages sent by users',
-    numberOfPassiveRepliesToUserMessages: 'Number of passive replies to user messages',
-    numberOfFailures: 'Number of failures',
-    maximumTimeConsumed: 'Maximum time spent',
-    totalTimeConsumed: 'Total time spent',
-    noOfficialAccountSelectedCannotStatisticData: 'No public number is selected, no statistics are available',
-    timeIntervalShouldBeWithin7DaysPleaseReSelect: 'Time interval within 7 days, please re-select',
-    synchronize: 'Synchronisation',
-    numberOfFans: 'Fans',
-    areYouSureToSynchronizeTags: 'Are you sure to sync tags?',
-    tagSynchronizationSucceeded: 'Tag synchronisation is successful',
-    pleaseEnterTagName: 'Please enter the tag name',
-    nickname: 'Nickname',
-    tag: 'Tag',
-    subscriptionStatus: 'Subscription Status',
-    subscriptionTime: 'Subscription time',
-    areYouSureToSynchronizeFans: 'Are you sure you want to sync your followers?',
-    startingToSynchronizeFanInfoFromWechatOfficialAccountItTakesTimePleaseQueryLater: "It will take some time to synchronise the followers' information from WeChat, we suggest you to check it later.",
-    pleaseSelectTag: 'Please select a tag',
-    subscribed: 'Subscribed',
-    unsubscribed: 'Unsubscribed'
-  },
-  pay: {
-    idTenantId: 'id(+Tenant ID)',
-    paymentType: 'Payment type (payment channel)',
-    applicationId: 'Application id',
-    merchantId: 'Merchant id',
-    asynchronousCallbackAddress: 'Asynchronous callback address',
-    synchronousCallbackAddress: 'Synchronous callback address',
-    signature: 'Signature method',
-    testEnvironment: 'Test environment',
-    alipay: 'Alipay',
-    weChatPayment: 'WeChat Payment',
-    payId: 'Payment id',
-    weChatPaySmallProgram: 'WeChat Payment Applet',
-    weChatPayPublic: 'WeChat Pay Public',
-    weChatPayH5: 'WeChat Pay H5',
-    alipayH5: 'Alipay H5',
-    pleaseEnterTheAppId: 'Please enter the app id',
-    weChatMerchantId: 'WeChat Merchant id',
-    pleaseEnterWeChatMerchantId: 'Please enter WeChat merchant id',
-    alipayMerchantId: 'Alipay merchant id',
-    pleaseEnterTheAlipayMerchantId: 'Please enter the Alipay merchant id',
-    certificateStorageType: 'Certificate Storage Type',
-    pleaseSelectTheType: 'Please select the type',
-    noteNeedCertificateOfChoiceDoNotNeedNotChoose: 'Note: need certificate of choice do not need not choose',
-    privateKeyOrPrivateKeyCertificate: 'Private key or private key certificate',
-    pleaseEnterThePrivateKeyOrPrivateKeyCertificate: 'Please enter the private key or private key certificate',
-    publicKeyOrPublicKeyCertificate: 'Public key or public key certificate',
-    pleaseEnterThePublicKeyOrPublicKeyCertificate: 'Please enter the public key or public key certificate',
-    keyCertificate: 'key certificate',
-    pleaseEnterTheKeyCertificateAdditionalCertificatesToUseSuchAsSslCertificateOrUnionPayRootLevelCertificates: 'Please enter the key certificate, additional certificates to use, such as SSL certificate, or UnionPay root-level certificate aspects',
-    passwordOfTheCertificate: 'Password of the certificate',
-    pleaseEnterThePasswordOfThePrivateKeyCertificateOrKeyCertificate: 'Please enter the password of the private key certificate or key certificate.',
-    pleaseEnterTheAsynchronousCallback: 'Please enter the asynchronous callback',
-    pleaseEnterTheSynchronousCallbackAddressWhichIsMostlyUsedForPageJumpAfterSuccessfulPayment: 'Please enter the address of synchronous callback, which is mostly used for page jump after successful payment.',
-    pleaseSelectSignatureMethodMd5: 'Please select the signature method MD5',
-    subappid: 'Subappid',
-    pleaseEnterTheSubAppid: 'Please enter the sub-appid',
-    subMerchantId: 'Sub-merchant id',
-    pleaseEnterTheSubMerchantId: 'Please input the sub-merchant id',
-    paymentTypeCannotBeEmpty: 'Payment type (payment channel) cannot be empty.',
-    paymentIdCannotBeEmpty: 'Payment id cannot be empty',
-    applicationIdCannotBeEmpty: 'App id cannot be empty',
-    signatureMethodCannotBeEmpty: 'Signature method cannot be empty',
-    asynchronousCallbackAddressCannotBeEmpty: 'Asynchronous callback address cannot be empty'
-  },
-  Redirect: {},
-  score: {
-    all: 'All',
-    toBePaid: 'To be paid',
-    toBeShipped: 'To be shipped',
-    toBeReceived: 'To be received',
-    completed: 'Completed',
-    allOrders: 'All Orders',
-    orderStatus: 'Order Status',
-    userName: 'User Name',
-    pleaseEnterYourPhoneNumber: 'Please enter your phone number',
-    pleaseEnterTheOrderNumber: 'Please enter the order number',
-    userIdNickname: 'User id|Nickname',
-    productInformation: 'Product Information',
-    totalPointsConsumed: 'Total Points Consumed',
-    totalConsumptionAmount: 'Total Consumption',
-    paymentMethod: 'Payment Method',
-    balancePayment: 'Balance Payment',
-    weChatPayment: 'WeChat Payment',
-    alipayPayment: 'Alipay Payment',
-    cashPayment: 'Cash Payment',
-    shipping: 'Shipping',
-    more: 'More',
-    orderDetails: 'Order Details',
-    deleteOrder: 'Delete Order',
-    backstageReceiving: 'Backstage Receiving',
-    pointsMallOrdersXls: 'Shop-to-Earn Orders.xls',
-    modifyReceivingStatus: 'Modify Receiving Status',
-    receivingInformation: 'Receiving Information',
-    nickname: 'User Nickname',
-    consignee: 'Consignee',
-    contactPhoneNumber: 'Contact phone number',
-    address: 'Address',
-    productDetails: 'Product details',
-    goodsPicture: 'Picture',
-    productName: 'Product Name',
-    orderInformation: 'Order Information',
-    logisticsInformation: 'Logistics Information',
-    orderNo: 'Order No.',
-    quantity: 'Quantity',
-    spendingPoints: 'Spending Points',
-    payment: 'Payment or not',
-    whetherToShipOrNot: 'Whether shipment',
-    receiveOrNot: 'Receive or not',
-    expressCompany: 'Express company',
-    courierNumber: 'Courier Number',
-    selectType: 'Select type',
-    fillInManually: 'Fill in manually',
-    shippingType: 'Shipment type',
-    selectCourierCompany: 'Select courier company',
-    pleaseEnterTheCourierSingleNumber: 'Please enter the courier single number',
-    pleaseSelectTheCourierCompany: 'Please select the courier company',
-    courierSingleNumberCanNotBeEmpty: 'Courier single number can not be empty',
-    productTitle: 'Product Title',
-    pleaseEnterTheProductTitle: 'Please enter the product title',
-    selectCategory: 'Select Product Category',
-    productCategory: 'Product Category',
-    mainPicture: 'Main picture',
-    picture: 'Picture',
-    pointsConsumption: 'Points Consumption',
-    price: 'Price',
-    originalPrice: 'Original Price',
-    weight: 'Weight',
-    inventory: 'Inventory',
-    salesVolume: 'Sales Volume',
-    whetherItIsOnTheShelfOrNot: 'Whether it is on the shelf or not',
-    up: 'Up',
-    down: 'Down',
-    pointsProductsXls: 'Points Products.xls',
-    category: 'Product Category',
-    groupPicture: 'Group picture',
-    detail: 'Details',
-    purchaseAmount: 'Purchase Amount',
-    pleaseEnterThePointsConsumed: 'Please enter the points consumed',
-    pleaseEnterTheAmount: 'Please enter the amount',
-    tips: 'When both points and amount are greater than 0, it means that this product needs points + price to buy.',
-    pleaseEnterStock: 'Please enter stock',
-    pleaseEnterAWeight: 'Please enter the weight',
-    productTitleCannotBeEmpty: 'Product title cannot be empty',
-    pleaseSelectProductCategory: 'Please select product category',
-    mainPictureCannotBeEmpty: 'Main picture cannot be empty',
-    groupPictureCannotBeEmpty: 'Group picture cannot be empty',
-    detailsCannotBeEmpty: 'Details cannot be empty',
-    pointsConsumedCannotBeEmpty: 'Points consumed cannot be empty',
-    originalPriceCannotBeEmpty: 'Original price cannot be empty',
-    inventoryCannotBeEmpty: 'Inventory cannot be empty',
-    uploadImage: 'Upload image',
-    availability: 'Availability',
-    imageCannotBeEmpty: 'Image cannot be empty',
-    showOrNotCannotBeEmpty: 'Show or not cannot be empty',
-    weightCannotBeEmpty: 'Weight cannot be empty',
-    pointsMallAdvertisementMapManagementXls: 'Points mall advertisement map management.xls',
-    categoryName: 'Category Name',
-    sortByCategory: 'Category Sort',
-    enableStatus: 'Enable Status',
-    pleaseInputCategoryName: 'Please input category name',
-    pleaseInputCategorySorting: 'Please input category sort',
-    categoryNameCannotBeEmpty: 'Category name cannot be empty',
-    openStatusCannotBeEmpty: 'Open status cannot be empty',
-    categoryNumber: 'Category number',
-    pointsProductClassificationXls: 'Points Product Classification.xlss'
-  },
-  system: {
-    ipQuery: 'IP Query',
-    pleaseEnterIpAddress: 'Please enter an IP address',
-    showIpQueryResults: 'Show IP query results',
-    ipAddressCannotBeEmpty: 'IP address cannot be empty',
-    querySuccess: 'Query Successful',
-    no: 'Number',
-    placeName: 'Place Name',
-    superiorDepartment: 'Superior Department',
-    pleaseSelectTheParentDepartment: 'Please select the superior department',
-    departmentName: 'Department Name',
-    pleaseEnterADepartmentName: 'Please enter the name of the department',
-    departmentStatus: 'Department Status',
-    pleaseSelectDepartmentStatus: 'Please select department status',
-    displaySort: 'Display Sort',
-    personInCharge: 'Person in Charge',
-    pleaseEnterThePersonInCharge: 'Please enter the person in charge',
-    contactPhoneNumber: 'Contact phone number',
-    pleaseInputTheContactPhoneNumber: 'Please input contact phone number',
-    mailbox: 'Mailbox',
-    pleaseInputMailbox: 'Please input mailbox',
-    status: 'Status',
-    pleaseSelectStatus: 'Please select status',
-    parentDepartmentCannotBeEmpty: 'Parent department cannot be empty',
-    departmentNameCannotBeEmpty: 'Department name cannot be empty',
-    displayOrderCannotBeEmpty: 'Display order cannot be empty',
-    statusCannotBeEmpty: 'Status cannot be empty',
-    pleaseEnterTheCorrectEmailAddress: 'Please enter the correct email address',
-    pleaseEnterTheCorrectCellPhoneNumber: 'Please enter the correct mobile phone number',
-    topDepartment: 'Top Departments',
-    expandCollapse: 'Expand/Collapse',
-    dictionaryType: 'Dictionary Type',
-    dataLabel: 'Data Label',
-    dataKeyValue: 'Data Key Value',
-    colorType: 'Colour Type',
-    pleaseEnterParameterName: 'Please enter a parameter name',
-    pleaseEnterDataLabel: 'Please enter a data label',
-    pleaseEnterDataKeyValue: 'Please enter a data key value',
-    pleaseEnterCSSClass: 'Please enter CSS Class',
-    pleaseEnterContent: 'Please enter the content',
-    dataLabelCannotBeEmpty: 'Data tag cannot be empty',
-    dataKeyValueCannotBeEmpty: 'Data key value cannot be null',
-    dataOrderCannotBeEmpty: 'Data order cannot be null',
-    default: 'Default',
-    primary: 'Main',
-    success: 'Successful',
-    information: 'Message',
-    warning: 'Warning',
-    danger: 'Danger',
-    dictionaryName: 'Dictionary name',
-    dictionaryLabel: 'Dictionary label',
-    pleaseEnterDictionaryLabel: 'Please enter a dictionary label',
-    dataStatus: 'Data status',
-    dictionaryCode: 'Dictionary Code',
-    dictionaryKeyValue: 'Dictionary Key',
-    dictionarySort: 'Dictionary Sort',
-    dictionaryDataXls: 'Dictionary Data.xls',
-    pleaseEnterDictionaryName: 'Please enter a dictionary name',
-    dictionaryNameCannotBeEmpty: 'Dictionary name cannot be empty',
-    dictionaryTypeCannotBeEmpty: 'Dictionary Type cannot be empty',
-    dictionaryNumber: 'Dictionary Number',
-    pleaseEnterDictionaryType: 'Please enter the dictionary type',
-    pleaseSelectDictionaryStatus: 'Please select dictionary status',
-    newAdd: 'Add',
-    export: 'Export',
-    data: 'Data',
-    dictionaryTypeXls: 'DictionaryType.xls',
-    userName: 'User Name',
-    loginAddress: 'Login Address',
-    loginDate: 'Login Date',
-    pleaseEnterUserName: 'Please enter user name',
-    pleaseEnterLoginAddress: 'Please enter login address',
-    logNumber: 'Log number',
-    operationType: 'Operation type',
-    browser: 'Browser',
-    loginResult: 'Login Result',
-    details: 'Details',
-    loginLogxls: 'Login Log.xls',
-    email: 'Mailbox',
-    password: 'Password',
-    SMTPserverDomainName: 'SMTP server domain name',
-    SMTPserverPort: 'SMTP server port',
-    whetherToEnableSSL: 'Enable SSL',
-    whetherToEnableSTARTTLS: 'Enable or disable STARTTLS',
-    creationTime: 'Creation Time',
-    operation: 'Operation',
-    number: 'Number',
-    cache: 'Cache',
-    noCache: 'Not Cached',
-    cacheStatus: 'Cache Status',
-    always: 'Always',
-    no1: 'Not',
-    cache1: 'If you choose caching, it will be cached by `keep-alive`, you must fill in the `component name` field.',
-    cache2: 'When selecting not, when this menu has only one submenu, it will not show itself, but will show the submenu directly',
-    cache3: 'When hidden, the route will not appear in the sidebar, but will still be accessible.',
-    cache4: 'Permission character on Controller method, e.g. @PreAuthorize(`@ss.hasPermission(‘system:user:list’)`)',
-    cache5: 'The routing address of the access, e.g. `user`. If an extranet address is required, it starts with `http(s)://`.',
-    cache6: 'For example, say SystemUser',
-    pushSucceeded: 'Push Success',
-    isItNecessaryToPushTheSelectedNotification: 'Is the selected notification pushed?',
-    sendingTime: 'Send time',
-    receivingEmail: 'Received mailbox',
-    userId: 'User ID',
-    userType: 'User Type',
-    emailTitle: 'Title',
-    emailContent: 'Mail Content',
-    emailParameters: 'Parameters',
-    sendingStatus: 'Send Status',
-    emailAccount: 'Email account',
-    sendingEmailAddress: 'Send Email Address',
-    templateNumber: 'Template number',
-    templateCode: 'Template Code',
-    templateSenderName: 'Template sender name',
-    sendingReturnedMessageNumber: 'Send Return Message Number',
-    sendingException: 'Send Exception',
-    test: 'Test',
-    templateContent: 'Template content',
-    recipientEmail: 'Incoming Email',
-    enterRecipientEmail: 'Enter your email address',
-    pleaseEnter: 'Please enter',
-    emailCannotBeEmpty: 'Mailbox can not be empty',
-    templateNumberCannotBeEmpty: 'Template number can not be empty',
-    templateName: 'Template Name',
-    templateTitle: 'Title of the template',
-    senderName: "Sender's name",
-    enableStatus: 'Open Status',
-    remarks: 'Remarks',
-    menuName: 'Menu Name(CN)',
-    menuNameEn: 'Menu Name',
-    menuNameJp: 'Menu Name(JP)',
-    pleaseEnterMenuName: 'Please input the menu name',
-    pleaseSelectMenuStatus: 'Please select menu status',
-    refreshMenuCache: 'Refresh menu cache',
-    permissionIdentity: 'Permission ID',
-    componentPath: 'Component Path',
-    componentName: 'Component name',
-    browserShow: 'The cache will be updated soon to refresh the browser!',
-    parentMenu: 'Parent Menu',
-    menuType: 'Menu Type',
-    menuIcon: 'Menu Icon',
-    routeAddress: 'Routing Address',
-    componentAddress: 'Component Address',
-    menuStatus: 'Menu Status',
-    displayStatus: 'Display status',
-    alwaysDisplay: 'Always displayed',
-    pleaseEnterRouteAddress: 'Please enter a route address',
-    pleaseEnterPermissionIdentity: 'Please enter a permission code',
-    menuNameCannotBeEmpty: 'Menu name cannot be empty',
-    menuOrderCannotBeEmpty: 'Menu order cannot be empty',
-    routeAddressCannotBeEmpty: 'Route address cannot be empty',
-    thePathMustStartWith: 'Route must start with /.',
-    thePathCannotStartWith: 'Path must not begin with /.',
-    mainCategory: 'Main Category',
-    announcementTitle: 'Announcement title',
-    announcementStatus: 'Announcement Status',
-    announcementNumber: 'Bulletin Number',
-    coverImage: 'Cover Image',
-    announcementType: 'Bulletin Type',
-    pleaseEnterAnnouncementTitle: 'Please enter the title of the announcement',
-    pleaseSelectAnnouncementStatus: 'Please select the announcement status',
-    push: 'Push',
-    announcementContent: 'Announcement content',
-    pleaseSelectAnnouncementType: 'Please select the type of announcement',
-    pleaseEnterRemarks: 'Please enter a note',
-    announcementTitleCannotBeEmpty: 'Title cannot be empty',
-    coverImageCannotBeEmpty: 'Cover picture cannot be empty',
-    announcementTypeCannotBeEmpty: 'Announcement type cannot be empty',
-    announcementContentCannotBeEmpty: 'Announcement content cannot be empty',
-    templateType: 'Template type',
-    templateParameters: 'Template Parameters',
-    isRead: 'Whether it has been read',
-    readingTime: 'Read time',
-    pleaseEnterUserId: 'Please enter the user number',
-    pleaseSelectUserType: 'Please select user type',
-    pleaseEnterTemplateCode: 'Please enter the template code',
-    pleaseSelectTemplateType: 'Please select template type',
-    markAsRead: 'Mark as read',
-    markAllAsRead: 'Read All',
-    sender: 'Sender',
-    messageContent: 'Message content',
-    read: 'Read',
-    messageDetails: 'Message details',
-    pleaseEnterTemplateName: 'Please enter a template name',
-    pleaseSelectEnableStatus: 'Please select the on state',
-    pleaseEnterSenderName: 'Please enter the sender name',
-    pleaseEnterTemplateContent: 'Please enter template content',
-    messageTypeCannotBeEmpty: 'Message type cannot be empty',
-    enableStatusCannotBeEmpty: 'Open status cannot be empty',
-    templateCodeCannotBeEmpty: 'Template code cannot be empty',
-    templateNameCannotBeEmpty: 'Template name cannot be empty',
-    senderNameCannotBeEmpty: 'Sender name cannot be empty',
-    templateContentCannotBeEmpty: 'Template content cannot be empty',
-    additionSuccessful: 'Add Success',
-    ModificationSuccessful: 'Modify Succeed',
-    recipientID: 'Recipient ID',
-    recipient: 'Recipient',
-    redirectableURIAddress: 'Redirectable URI Address',
-    pleaseEnterRedirectableURIAddress: 'Please enter a redirectable URI address.',
-    pleaseSelectRecipient: 'Please select the recipient',
-    userIdCannotBeEmpty: 'User ID cannot be empty',
-    submissionAndSendingWereSuccessfulTheSendingResultPleaseReferToTheSendingLogNumber: 'The commit was sent successfully! The result of the send, see the send log number:',
-    clientNumber: 'Client number',
-    clientSecretKey: 'Client key',
-    appName: 'Application name',
-    appIcon: 'Application icon',
-    appDescription: 'Application description',
-    validityPeriodOfAccessToken: 'Access Token Expiry Date',
-    validityPeriodOfRefreshToken: 'Refresh Token Validity Period',
-    authorizationType: 'Authorisation type',
-    authorizationScope: 'Authorisation range',
-    automaticAuthorizationScope: 'Automatic authorisation range',
-    redirectable: 'Redirectable',
-    permissions: 'Authorisation',
-    resources: 'Resources',
-    additionalInformation: 'Additional Information',
-    pleaseEnterClientNumber: 'Please enter a client number',
-    pleaseEnterClientSecretKey: 'Please enter the client key',
-    pleaseEnterAppName: 'Please enter the application name',
-    unitSeconds: 'Unit: seconds',
-    pleaseEnterAuthorizationType: 'Please enter the authorisation type',
-    pleaseEnterAuthorizationScope: 'Please enter the authorisation range',
-    pleaseEnterRedirectable: 'Please enter the redirectable',
-    pleaseEnterPermissions: 'Please enter the permissions',
-    pleaseEnterResources: 'Please enter resources',
-    pleaseEnterAdditionalInformationJSON: 'Please enter additional information, JSON format data.',
-    clientNumberCannotBeEmpty: 'Client number cannot be empty',
-    clientSecretKeyCannotBeEmpty: 'Client key cannot be null',
-    appNameCannotBeEmpty: 'Application name cannot be empty',
-    appIconCannotBeEmpty: 'Application icon cannot be null',
-    validityPeriodOfAccessTokenCannotBeEmpty: 'Access token expiration date cannot be null',
-    validityPeriodOfRefreshTokenCannotBeEmpty: 'The expiration date of the refresh token cannot be null.',
-    redirectableURIAddressCannotBeEmpty: 'Redirectable URI address cannot be null.',
-    authorizationTypeCannotBeEmpty: 'Authorisation type cannot be null',
-    whetherToForceTheUserToLogOut: 'Whether to force logout the user',
-    forceLogout: 'Force logout',
-    clientId: 'Client Number',
-    accessToken: 'Access Token',
-    refreshToken: 'Refresh Token',
-    expirationTime: 'Expiration Time',
-    pleaseEnterClientId: 'Please enter client number',
-    operator: 'Operator',
-    operationModule: 'Operation Module',
-    operationContent: 'Operation content',
-    operationTime: 'Operation Time',
-    businessNumber: 'Operation number',
-    operatorLogXls: 'Operator',
-    operationName: 'Operation Name',
-    IP: 'IP',
-    pleaseEnterOperator: 'Please input operator',
-    pleaseEnterOperationModule: 'Please input operation module',
-    pleaseEnterOperationName: 'Please input operation name',
-    pleaseEnterBusinessNumber: 'Please input operation number',
-    logPrimaryKey: 'Log key',
-    linkTracing: 'Link Trace',
-    operatorId: 'Operator number',
-    operatorName: 'Operator Name',
-    operatorIP: 'Operator IP',
-    operatorUA: 'Operator UA',
-    operationExtendedParameters: 'Operation Expansion Parameters',
-    requestURL: 'Request URL',
-    positionName: 'Job Name',
-    positionCode: 'Job Code',
-    positionNumber: 'Position number',
-    positionOrder: 'Position Order',
-    positionRemarks: 'Position Remarks',
-    pleaseEnterPositionName: 'Please enter the post name',
-    pleaseEnterPositionCode: 'Please enter the post code',
-    positionListXls: 'Position List.xls',
-    positionTitle: 'Position Title',
-    pleaseEnterPositionTitle: 'Please enter the post title',
-    pleaseEnterPositionOrder: 'Please input job order',
-    positionTitleCannotBeEmpty: 'Job title cannot be empty',
-    positionCodeCannotBeEmpty: 'Job Code cannot be empty',
-    positionStatusCannotBeEmpty: 'Job Status cannot be empty',
-    positionContentCannotBeEmpty: 'Job content cannot be empty',
-    roleName: 'Role Name',
-    roleIdentity: 'Role Identifier',
-    roleNumber: 'Role Number',
-    roleType: 'Role Type',
-    displayOrder: 'Display order',
-    pleaseEnterRoleName: 'Please enter role name',
-    pleaseEnterRoleIdentity: 'Please enter role identification',
-    menuPermissions: 'Menu Rights',
-    dataPermissions: 'Data permissions',
-    selectAllDeselectAll: 'Select all/unselect all.',
-    expandAllCollapseAll: 'Expand/Collapse All.',
-    permissionScope: 'Permission range',
-    pleaseEnterDisplayOrder: 'Please enter the display order',
-    roleNameCannotBeEmpty: 'Role name cannot be empty',
-    roleIdentityCannotBeEmpty: 'Role Identifier cannot be empty',
-    remarksCannotBeEmpty: 'Remarks cannot be empty',
-    roleListXls: 'Role List.xls',
-    parentChildLinkage: 'Parent-child linkage (select parent node, automatically select child node).',
-    loadingPleaseWaitAMoment: 'Loading, please wait',
-    pleaseSelectChannelCode: 'Please select channel code',
-    smsSignatureCannotBeEmpty: 'SMS Signature cannot be empty',
-    channelCodeCannotBeEmpty: 'Channel Code cannot be empty',
-    theAccountOfSmsAPICannotBeEmpty: 'The account number of SMS API cannot be empty',
-    theAccountOfSmsAPI: 'Account number of SMS API',
-    theSecretKeyOfSmsAPI: 'SMS API key',
-    smsSendingCallbackURL: 'SMS send callback URL',
-    pleaseEntertheAccountOfSmsAPI: 'Please enter the account number of the SMS API',
-    pleaseEntertheSecretKeyOfSmsAPI: 'Please enter the key of the SMS API',
-    pleaseEnterSmsSendingCallbackURL: 'Please enter the SMS send callback URL',
-    smsLogXls: 'SMS Log.xls',
-    smsSignature: 'SMS Signature',
-    channelCode: 'Channel Code',
-    sms: 'SMS',
-    smsSendingCallback: 'SMS Send Callback',
-    pleaseEnterSmsSignature: 'Please enter the SMS signature',
-    phoneNumber: 'Mobile phone number',
-    smsChannel: 'SMS Channel',
-    receivingStatus: 'Receive Status',
-    receivingTime: 'Receive Time',
-    smsContent: 'SMS Content',
-    templateNumberOfSmsAPI: 'Template number of the SMS API',
-    pleaseEnterTemplateNumberOfSmsAPI: 'Please enter the template number of the SMS API',
-    smsTemplateXls: 'SMS Template.xls',
-    smsType: 'SMS Type',
-    pleaseEnterPhoneNumber: 'Please enter your mobile phone number',
-    pleaseSelectSmsChannel: 'Please select the SMS channel',
-    pleaseEnterTemplateNumber: 'Please enter the template number',
-    pleaseSelectSendingStatus: 'Please select send status',
-    pleaseSelectReceivingStatus: 'Please select the receiving status',
-    smsTemplate: 'SMS Template',
-    templateNumberOfAPI: 'Template number of the API',
-    userInformation: 'User Information',
-    smsParameters: 'SMS Parameters',
-    APIsmsResult: 'API Send Result',
-    APIsmsNumber: 'API SMS Number',
-    APIrequestNumber: 'API Request Number',
-    APIreceivingStatus: 'API Receive Status',
-    APIreceivingResult: 'API Receive Result',
-    smsChannelNumber: 'SMS Channel Number',
-    smsAPITemplateNumber: 'SMS API Template Number',
-    pleaseSelectSmsChannelNumber: 'Please select the SMS channel number',
-    pleaseSelectSmsType: 'Please select the SMS type',
-    pleaseEnterSms: 'Please enter the SMS API template number',
-    pleaseEnterTheTemplateNumberOfTheSmsAPI: 'Please enter the SMS API template number',
-    phoneNumberCannotBeEmpty: 'Mobile phone cannot be empty',
-    smsTypeCannotBeEmpty: 'SMS Type cannot be empty',
-    theTemplateNumberOfTheSmsAPICannotBeEmpty: 'The template number of the SMS API cannot be empty',
-    smsChannelNumberCannotBeEmpty: 'The SMS channel number cannot be empty',
-    submitTips: 'The submission was successful! See the delivery log number for delivery results:',
-    pleaseSelectSocialPlatform: 'Please select social platform',
-    pleaseEnterClientNumberTips: 'Please enter the client number, which corresponds to the appKey of each platform.',
-    pleaseEnterClientSecretKeyTips: 'Please enter the client key, corresponding to the appSecret of each platform.',
-    authorizedPartyWebApplicationTips: "Authorised party's web application ID, fill in if you have one.",
-    socialPlatformCannotBeEmpty: 'Social platform cannot be empty',
-    userTypeCannotBeEmpty: 'User type cannot be empty',
-    socialOpenid: 'Social openid',
-    pleaseEnterSocialOpenid: 'Please enter the social openid',
-    social: 'Social',
-    updateTime: 'Update time',
-    socialPlatform: 'Social platform',
-    userAvatar: 'User avatar',
-    socialToken: 'Social Token',
-    originalTokenData: 'Raw Token Data',
-    originalUserData: 'Raw User data',
-    lastAuthenticationCode: 'Last authentication code',
-    lastAuthenticationState: 'Last authentication state',
-    tenantName: 'Tenant Name',
-    contactPerson: 'Contact person',
-    tenantStatus: 'Tenant state',
-    tenantId: 'Tenant number',
-    tenantPackage: 'Tenant package',
-    accountQuota: 'Account Limit',
-    boundDomainName: 'Bound Domain Name',
-    pleaseEnterTenantName: 'Please enter tenant name',
-    pleaseEnterContactPerson: 'Please input contact person',
-    pleaseEnterContactPhoneNumber: 'Please enter your mobile phone',
-    pleaseSelectTenantStatus: 'Please select tenant status',
-    systemTenant: 'System Tenant',
-    tenantListXls: 'Tenant List.xls',
-    tenantNameCannotBeEmpty: 'Tenant name cannot be empty',
-    tenantPackageCannotBeEmpty: 'Tenant Package cannot be empty',
-    contactPersonCannotBeEmpty: 'Contact person cannot be empty',
-    tenantStatusCannotBeEmpty: 'Tenant Status cannot be empty',
-    accountQuotaCannotBeEmpty: 'Account Limit cannot be empty',
-    expirationTimeCannotBeEmpty: 'Expired time cannot be empty',
-    boundDomainNameCannotBeEmpty: 'Bound domain name cannot be empty',
-    userNameCannotBeEmpty: 'User name cannot be empty',
-    userPasswordCannotBeEmpty: 'User password cannot be empty',
-    userPassword: 'User password',
-    pleaseSelectTenantPackage: 'Please select tenant package',
-    loadingPleaseWaitAWhile: 'Loading, please wait',
-    packageNameCannotBeEmpty: 'Package name cannot be empty',
-    associatedMenuNumberCannotBeEmpty: 'Associated menu number cannot be empty',
-    pleaseEnterUserPassword: 'Please enter your password',
-    pleaseEnterAccountQuota: 'Please enter the account limit',
-    pleaseSelectExpirationTime: 'Please select the expiry time',
-    pleaseEnterBoundDomainName: 'Please enter the binding domain name',
-    packageName: 'Package Name',
-    packageNumber: 'Package Number',
-    pleaseEnterPackageName: 'Please enter the package name',
-    menuPermission: 'Menu Permission',
-    department: 'Department',
-    userStatus: 'User Status',
-    userDataXls: 'User Data.xls',
-    assignRole: 'Assign Roles',
-    role: 'Role',
-    pleaseSelectRole: 'Please select a role',
-    affiliatedDepartment: 'Department',
-    userGender: 'User Gender',
-    position: 'Position',
-    pleaseSelectAffiliatedDepartment: 'Please select the department',
-    pleaseEnterEmail: 'Please enter your email address',
-    userNicknameCannotBeEmpty: 'Nickname cannot be empty',
-    pleaseEnterTheCorrectPhoneNumber: 'Please enter the correct mobile phone number',
-    modificationSucceededTheNewPasswordIs: 'Modified successfully, the new password is:',
-    userImport: 'User import',
-    dragTheFileHereOr: 'Drag the file here, or',
-    clickToUpload: 'Click Upload',
-    whetherToUpdateExistingUserData: 'Whether to update existing user data',
-    onlyFilesInXlsAndXlsxFormatsAreAllowedForImport: 'Only xls, xlsx format files are allowed to be imported.',
-    downloadTemplate: 'Download template',
-    uploadFailedPleaseUploadAgain: 'The upload failed, please re-upload!',
-    atMostOnlyOneFileCanBeUploaded: 'Only a maximum of one file can be uploaded!',
-    userImportTemplateXls: 'User import template.xls',
-    numberOfSuccessfulUploads: 'Number of successful uploads:',
-    numberOfFailedUploads: 'Number of successful uploads:',
-    numberOfFailedUpdates: 'Update Failed Quantity:',
-    pleaseUploadTheFile: 'Please upload a file',
-    allHaveBeenMarkedAsReadSuccessfully: 'All read successfully!',
-    batchMarkingAsReadWasSuccessful: 'Batch read successfully!',
-    testSending: 'Test Send',
-  },
-  public: {
-    all: 'All',
-    sort: 'Sort',
-    operate: 'Operation',
-    status: 'Status',
-    startDate: 'Start Date',
-    endDate: 'End Date',
-    delete: 'Delete',
-    createTime: 'Created',
-    update: 'Modified',
-    none: 'None',
-    close: 'Close',
-    normal: 'Normal',
-    addTime: 'Add Time',
-    no: 'No',
-    yes: 'Yes',
-    more: 'More',
-    startTime: 'Start time',
-    endTime: 'End time',
-    up: 'Up',
-    down: 'Down',
-    enable: 'Enable',
-    disable: 'Disable',
-    remark: 'Remarks',
-    pleaseEnterNotes: 'Please enter a comment',
-    expand: 'Expand',
-    collapse: 'Collapse',
-    scord: 'Seconds'
-  },
-  'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
+  }
 }

+ 0 - 2410
src/locales/ja.ts

@@ -1,2410 +0,0 @@
-export default {
-  common: {
-    inputText: '入力してください',
-    selectText: '選択してください',
-    startTimeText: '開始時間',
-    endTimeText: '終了時間',
-    login: 'ログイン',
-    required: '必須項目です',
-    loginOut: 'ログアウト',
-    document: 'ドキュメント',
-    profile: 'マイページ',
-    reminder: 'お知らせ',
-    loginOutMessage: '本システムからログアウトしますか?',
-    back: '戻る',
-    ok: '確認',
-    save: '保存',
-    cancel: 'キャンセル',
-    close: '閉じる',
-    reload: '再読み込み',
-    success: '成功',
-    closeTab: 'タブを閉じる',
-    closeTheLeftTab: '左側のタブを閉じる',
-    closeTheRightTab: '右側のタブを閉じる',
-    closeOther: '他のタブを閉じる',
-    closeAll: 'すべてのタブを閉じる',
-    prevLabel: '前へ',
-    nextLabel: '次へ',
-    skipLabel: 'スキップ',
-    doneLabel: '完了',
-    menu: 'メニュー',
-    menuDes: 'ルーティング構造に基づくメニュー',
-    collapse: '展開/折りたたみ',
-    collapseDes: 'メニューの展開と折りたたみ',
-    tagsView: 'タブ履歴',
-    tagsViewDes: 'ナビゲーション履歴の管理',
-    tool: 'ツール',
-    toolDes: 'カスタマイズ設定',
-    query: '検索',
-    reset: 'リセット',
-    shrink: '閉じる',
-    expand: '展開',
-    confirmTitle: 'システム通知',
-    exportMessage: 'データをエクスポートしますか?',
-    importMessage: 'データをインポートしますか?',
-    createSuccess: '追加成功',
-    updateSuccess: '更新成功',
-    delMessage: '選択したデータを削除しますか?',
-    delDataMessage: 'データを削除しますか?',
-    delNoData: '削除するデータを選択してください',
-    delSuccess: '削除成功',
-    index: '番号',
-    status: 'ステータス',
-    createTime: '作成日時',
-    updateTime: '更新日時',
-    copy: 'コピー',
-    copySuccess: 'コピー成功',
-    copyError: 'コピー失敗',
-    search: '検索',
-    detail: '詳細',
-    add: '追加',
-    yes: 'はい',
-    no: 'いいえ',
-    selectShop: '店舗を選択',
-    enterProductName: '商品名を入力してください',
-    selectCategory: 'カテゴリを選択',
-    enterKeyword: 'キーワードを入力してください',
-    enterUnitName: '単位名を入力してください',
-    enterPrice: '販売価格を入力してください',
-    enterMarketPrice: '市場価格を入力してください',
-    enterStock: '在庫数を入力してください',
-    enterProductDescription: '商品説明を入力してください',
-    enterPoints: '獲得ポイントを入力してください',
-    addBasicInfo: '基本情報を追加してください',
-    selectAttribute: '属性を選択してください',
-    addCompleteSpec: 'すべての仕様を追加してください',
-    addAttribute: '属性を追加してください',
-    addSpec: '仕様を追加してください',
-    confirm: '確認',
-    delete: '削除',
-    nextStep: '次へ',
-    previousStep: '前へ',
-    uploadImage: '画像をアップロード',
-    addNewSpec: '新しい仕様を追加',
-    generateNow: 'すぐに生成',
-    selectShopFirst: '先に店舗を選択してください',
-    selectCategoryFirst: '先にカテゴリを選択してください',
-    selectSpec: '仕様を選択',
-    enterSpecName: '仕様名を入力してください',
-    enterSpecValue: '仕様の値を入力してください',
-    selectFreightTemplate: '配送テンプレートを選択',
-    enterFreight: '送料を入力してください'
-  },
-  lock: {
-    lockScreen: '画面ロック',
-    lock: 'ロック',
-    lockPassword: 'ロックパスワード',
-    unlock: 'クリックして解除',
-    backToLogin: 'ログインに戻る',
-    entrySystem: 'システムに入る',
-    placeholder: 'ロックパスワードを入力',
-    message: 'パスワードが間違っています'
-  },
-  error: {
-    noPermission: 'アクセス権限がありません',
-    pageError: 'ページが存在しません',
-    networkError: 'サーバーエラーが発生しました',
-    returnToHome: 'ホームに戻る'
-  },
-  permission: {
-    hasPermission: '操作権限を設定してください',
-    hasRole: 'ロール権限を設定してください'
-  },
-  setting: {
-    projectSetting: 'プロジェクト設定',
-    theme: 'テーマ',
-    layout: 'レイアウト',
-    systemTheme: 'システムテーマ',
-    menuTheme: 'メニューテーマ',
-    interfaceDisplay: 'インターフェース表示',
-    breadcrumb: 'パンくずリスト',
-    breadcrumbIcon: 'パンくずアイコン',
-    collapseMenu: 'メニュー折りたたみ',
-    hamburgerIcon: 'ハンバーガーアイコン',
-    screenfullIcon: '全画面表示アイコン',
-    sizeIcon: 'サイズ変更アイコン',
-    localeIcon: '言語切替アイコン',
-    messageIcon: '通知アイコン',
-    tagsView: 'タグ表示',
-    logo: 'ロゴ',
-    greyMode: 'グレーモード',
-    fixedHeader: 'ヘッダー固定',
-    headerTheme: 'ヘッダーテーマ',
-    cutMenu: 'メニュー切り替え',
-    copy: 'コピー',
-    clearAndReset: 'キャッシュクリア&リセット',
-    copySuccess: 'コピー成功',
-    copyFailed: 'コピー失敗',
-    footer: 'フッター',
-    uniqueOpened: 'アコーディオンメニュー',
-    tagsViewIcon: 'タグ表示アイコン',
-    reExperienced: '再ログインが必要です',
-    fixedMenu: 'メニュー固定'
-  },
-  size: {
-    default: 'デフォルト',
-    large: '大',
-    small: '小'
-  },
-  login: {
-    welcome: 'Tabemate Pro  オーダーシステムへようこそ',
-    message: 'Tabemate Pro  オーダーシステム',
-    tenantname: 'テナント名',
-    username: 'ユーザー名',
-    password: 'パスワード',
-    userType: 'ユーザータイプ',
-    code: '確認コード',
-    login: 'ログイン',
-    relogin: '再ログイン',
-    otherLogin: '他のログイン方法',
-    register: '新規登録',
-    checkPassword: 'パスワード確認',
-    remember: 'ログイン状態を保持',
-    hasUser: '既にアカウントをお持ちですか?',
-    forgetPassword: 'パスワードをお忘れですか?',
-    tenantNamePlaceholder: 'テナント名を入力',
-    usernamePlaceholder: 'ユーザー名を入力',
-    passwordPlaceholder: 'パスワードを入力',
-    codePlaceholder: '確認コードを入力',
-    mobileTitle: 'SMSログイン',
-    mobileNumber: '電話番号',
-    mobileNumberPlaceholder: '電話番号を入力',
-    backLogin: '戻る',
-    getSmsCode: '確認コードを取得',
-    btnMobile: 'SMSログイン',
-    btnQRCode: 'QRコードログイン',
-    qrcode: 'QRコードをスキャン',
-    btnRegister: '登録',
-    SmsSendMsg: '確認コードを送信しました',
-    loadingSystem: 'システムを読み込み中...',
-    YSHOPSourceCode: 'YSHOPソースコード',
-    retrievableAfterSeconds: '秒後に再取得可能',
-    thisThirdPartyApplicationRequestsTheFollowingPermissions: '以下の権限をリクエストしています',
-    agreeToAuthorization: '承認する',
-    authorizationIn: '承認中...',
-    rejection: '拒否',
-    accessYourPersonalInformation: '個人情報へのアクセス',
-    modifyYourPersonalInformation: '個人情報の変更'
-  },
-  captcha: {
-    verification: 'セキュリティ認証を完了してください',
-    slide: '右にスライドして認証を完了してください',
-    point: '指定された順番でクリックしてください',
-    success: '認証成功',
-    fail: '認証失敗'
-  },
-  router: {
-    login: 'ログイン',
-    socialLogin: 'ソーシャルログイン',
-    home: 'ホーム',
-    analysis: '売上分析',
-    workplace: '管理画面'
-  },
-  analysis: {
-    newUser: '新規ユーザー',
-    unreadInformation: '未読メッセージ',
-    transactionAmount: '取引金額',
-    totalShopping: '注文総数',
-    monthlySales: '月間売上',
-    userAccessSource: 'ユーザー流入元',
-    january: '1月',
-    february: '2月',
-    march: '3月',
-    april: '4月',
-    may: '5月',
-    june: '6月',
-    july: '7月',
-    august: '8月',
-    september: '9月',
-    october: '10月',
-    november: '11月',
-    december: '12月',
-    estimate: '予測',
-    actual: '実績',
-    directAccess: '直接アクセス',
-    mailMarketing: 'メールマーケティング',
-    allianceAdvertising: 'アフィリエイト広告',
-    videoAdvertising: '動画広告',
-    searchEngines: '検索エンジン',
-    weeklyUserActivity: '週間アクティブユーザー数',
-    activeQuantity: 'アクティブユーザー数',
-    monday: '月曜日',
-    tuesday: '火曜日',
-    wednesday: '水曜日',
-    thursday: '木曜日',
-    friday: '金曜日',
-    saturday: '土曜日',
-    sunday: '日曜日'
-  },
-  workplace: {
-    welcome: 'こんにちは!',
-    happyDay: '素晴らしい一日をお過ごしください!',
-    toady: '今日の天気は晴れ',
-    notice: 'お知らせ',
-    project: '運営中の店舗',
-    access: 'アクセス数',
-    toDo: '対応すべき項目',
-    introduction: '簡単な紹介',
-    shortcutOperation: 'ショートカット操作',
-    operation: '操作',
-    index: 'インデックス',
-    personal: '個人',
-    team: 'チーム',
-    quote: '引用',
-    contribution: '貢献',
-    hot: '人気',
-    yield: '生産量',
-    dynamic: '最新情報',
-    push: '通知送信',
-    follow: 'フォロー'
-  },
-  form: {
-    input: '入力欄',
-    inputNumber: '数値入力欄',
-    default: 'デフォルト',
-    icon: 'アイコン',
-    mixed: '複合型',
-    textarea: 'テキストエリア',
-    slot: 'スロット',
-    position: '位置',
-    autocomplete: 'オートコンプリート',
-    select: '選択',
-    selectGroup: '選択グループ',
-    selectV2: '仮想リスト選択',
-    cascader: 'カスケード選択',
-    switch: 'スイッチ',
-    rate: '評価',
-    colorPicker: 'カラーピッカー',
-    transfer: 'データ移動',
-    render: 'レンダー',
-    radio: 'ラジオボタン',
-    button: 'ボタン',
-    checkbox: 'チェックボックス',
-    slider: 'スライダー',
-    datePicker: '日付選択',
-    shortcuts: 'ショートカット',
-    today: '今日',
-    yesterday: '昨日',
-    aWeekAgo: '1週間前',
-    week: '週',
-    year: '年',
-    month: '月',
-    dates: '日付',
-    daterange: '日付範囲',
-    monthrange: '月範囲',
-    dateTimePicker: '日付時間選択',
-    dateTimerange: '日付時間範囲',
-    timePicker: '時間選択',
-    timeSelect: '時間選択',
-    inputPassword: 'パスワード入力',
-    passwordStrength: 'パスワード強度',
-    operate: '操作',
-    change: '変更',
-    restore: 'リセット',
-    disabled: '無効',
-    disablement: '無効解除',
-    delete: '削除',
-    add: '追加',
-    setValue: '値を設定',
-    resetValue: '値をリセット',
-    set: '設定',
-    subitem: 'サブアイテム',
-    formValidation: 'フォーム検証',
-    verifyReset: '検証リセット',
-    remark: '備考'
-  },
-  watermark: {
-    watermark: '透かし'
-  },
-  table: {
-    table: 'テーブル',
-    index: 'インデックス',
-    title: 'タイトル',
-    author: '作成者',
-    createTime: '作成日時',
-    action: '操作',
-    pagination: 'ページネーション',
-    reserveIndex: '連番保持',
-    restoreIndex: '連番リセット',
-    showSelections: '選択表示',
-    hiddenSelections: '選択非表示',
-    showExpandedRows: '詳細表示',
-    hiddenExpandedRows: '詳細非表示',
-    header: 'ヘッダー'
-  },
-  action: {
-    setPrint: 'プリンタ設定',
-    check: '確認',
-    buyDetail: '購入履歴',
-    order: '注文',
-    qrcode: 'QRコード',
-    couponRecord: 'クーポン履歴',
-    yue: 'ポイント残高',
-    userDetail: 'ユーザー情報',
-    refundOrder: '返金処理',
-    orderRecord: '注文履歴',
-    orderDetail: '注文詳細',
-    updateOrder: '注文修正',
-    orderSend: '注文配送',
-    remark: '備考',
-    sendInfo: '配送情報',
-    batchCreate: '一括登録',
-    create: '登録',
-    add: '追加',
-    del: '削除',
-    delete: '削除',
-    edit: '編集',
-    preview: 'プレビュー',
-    more: 'もっと見る',
-    sync: '同期',
-    save: '保存',
-    detail: '詳細',
-    export: 'エクスポート',
-    import: 'インポート',
-    generate: '生成',
-    logout: '強制ログアウト',
-    test: 'テスト',
-    typeCreate: 'カテゴリ追加',
-    typeUpdate: 'カテゴリ編集',
-    dataCreate: 'データ追加',
-    dataUpdate: 'データ編集',
-    update: '更新'
-  },
-  dialog: {
-    dialog: 'ダイアログ',
-    open: '開く',
-    close: '閉じる'
-  },
-  sys: {
-    api: {
-      operationFailed: '操作に失敗しました',
-      errorTip: 'エラーメッセージ',
-      errorMessage: '操作失敗、システム異常!',
-      timeoutMessage: 'ログインのタイムアウト、再度ログインしてください!',
-      apiTimeoutMessage: 'APIのリクエストがタイムアウトしました、ページを更新してください!',
-      apiRequestFailed: 'リクエストに失敗しました。しばらくしてから再試行してください。',
-      networkException: 'ネットワーク異常',
-      networkExceptionMsg: 'ネットワークが異常です。接続を確認してください。',
-      errMsg401: '権限がありません(トークン、ユーザー名、パスワードが間違っています)!',
-      errMsg403: '認証されましたが、アクセスは禁止されています。',
-      errMsg404: 'ネットワークリクエストエラー、リソースが見つかりません!',
-      errMsg405: 'ネットワークリクエストエラー、リクエスト方法が許可されていません!',
-      errMsg408: 'ネットワークリクエストのタイムアウト!',
-      errMsg500: 'サーバーエラー、管理者に連絡してください!',
-      errMsg501: 'ネットワークが実装されていません!',
-      errMsg502: 'ネットワークエラー!',
-      errMsg503: 'サービス利用不可、サーバーが過負荷またはメンテナンス中です!',
-      errMsg504: 'ネットワークタイムアウト!',
-      errMsg505: 'HTTPバージョンがサポートされていませんyouCanOnlyUploadAMaximumOfOneFile!',
-      errMsg901: 'デモモードでは、編集操作はできません!'
-    },
-    app: {
-      logoutTip: 'お知らせ',
-      logoutMessage: 'システムからログアウトしますか?',
-      menuLoading: 'メニューを読み込み中...'
-    },
-    exception: {
-      backLogin: 'ログインページへ戻る',
-      backHome: 'ホームへ戻る',
-      subTitle403: '申し訳ありませんが、このページへのアクセス権限がありません。',
-      subTitle404: '申し訳ありませんが、アクセスしたページは存在しません。',
-      subTitle500: '申し訳ありませんが、サーバーでエラーが発生しました。',
-      noDataTitle: 'データがありません',
-      networkErrorTitle: 'ネットワークエラー',
-      networkErrorSubTitle: '申し訳ありません、ネットワークが切断されました。接続を確認してください!'
-    },
-    lock: {
-      unlock: 'タップしてロック解除',
-      alert: 'ロック解除パスワードが間違っています',
-      backToLogin: 'ログインページへ戻る',
-      entry: 'システムへ入る',
-      placeholder: 'ロック解除パスワードまたはユーザーパスワードを入力してください'
-    },
-    login: {
-      backSignIn: '戻る',
-      signInFormTitle: 'ログイン',
-      ssoFormTitle: '外部ログイン',
-      mobileSignInFormTitle: '電話番号でログイン',
-      qrSignInFormTitle: 'QRコードでログイン',
-      signUpFormTitle: '新規登録',
-      forgetFormTitle: 'パスワードリセット',
-      signInTitle: 'すぐに使える飲食管理システム',
-      signInDesc: '個人情報を入力して、ログインを開始しましょう!',
-      policy: '利用規約に同意します',
-      scanSign: `QRコードをスキャンし、"確認"を押してログイン完了`,
-      loginButton: 'ログイン',
-      registerButton: '新規登録',
-      rememberMe: 'ログイン情報を保存',
-      forgetPassword: 'パスワードをお忘れですか?',
-      otherSignIn: 'その他のログイン方法',
-      loginSuccessTitle: 'ログイン成功',
-      loginSuccessDesc: 'ようこそ!',
-      accountPlaceholder: 'ユーザー名を入力してください',
-      passwordPlaceholder: 'パスワードを入力してください',
-      smsPlaceholder: '確認コードを入力してください',
-      mobilePlaceholder: '電話番号を入力してください',
-      policyPlaceholder: 'チェックを入れると登録できます',
-      diffPwd: 'パスワードが一致しません',
-      userName: 'ユーザー名',
-      password: 'パスワード',
-      confirmPassword: 'パスワード確認',
-      email: 'メールアドレス',
-      smsCode: 'SMS認証コード',
-      mobile: '電話番号'
-    }
-  },
-  profile: {
-    user: {
-      title: '個人情報',
-      username: 'ユーザー名',
-      nickname: 'ニックネーム',
-      mobile: '携帯番号',
-      email: 'メールアドレス',
-      dept: '所属部署',
-      posts: '役職',
-      roles: 'ユーザー権限',
-      sex: '性別',
-      man: '男性',
-      woman: '女性',
-      createTime: '登録日'
-    },
-    info: {
-      title: '基本情報',
-      basicInfo: '基本プロフィール',
-      resetPwd: 'パスワード変更',
-      userSocial: 'ソーシャルアカウント'
-    },
-    rules: {
-      nickname: 'ニックネームを入力してください',
-      mail: 'メールアドレスを入力してください',
-      truemail: '正しいメールアドレスを入力してください',
-      phone: '正しい携帯番号を入力してください',
-      truephone: '正しい携帯番号を入力してください'
-    },
-    password: {
-      oldPassword: '現在のパスワード',
-      newPassword: '新しいパスワード',
-      confirmPassword: 'パスワード確認',
-      oldPwdMsg: '現在のパスワードを入力してください',
-      newPwdMsg: '新しいパスワードを入力してください',
-      cfPwdMsg: '確認用のパスワードを入力してください',
-      pwdRules: '6〜20文字のパスワードを入力してください',
-      diffPwd: 'パスワードが一致しません'
-    },
-    serialNumber: '番号',
-    socialPlatform: 'ソーシャルプラットフォーム',
-    bound: '連携済み',
-    unbound: '未連携',
-    unbound1: '(解除)',
-    bound1: '(連携)',
-    boundSuccessfully: '連携成功',
-    unboundSuccessfully: '連携解除成功'
-  },
-  cropper: {
-    selectImage: '画像を選択',
-    uploadSuccess: 'アップロード成功',
-    modalTitle: 'プロフィール画像をアップロード',
-    okText: '確認してアップロード',
-    btn_reset: 'リセット',
-    btn_rotate_left: '反時計回りに回転',
-    btn_rotate_right: '時計回りに回転',
-    btn_scale_x: '水平方向に反転',
-    btn_scale_y: '垂直方向に反転',
-    btn_zoom_in: '拡大',
-    btn_zoom_out: '縮小',
-    preview: 'プレビュー'
-  },
-  work: {
-    selectStore: '店舗を選択',
-    orderReminderOn: '注文通知ON',
-    orderReminderOff: '注文通知OFF',
-    recentOrders: '最近の注文',
-    orderId: '注文番号',
-    takeout: 'テイクアウト',
-    contactNumber: '連絡先',
-    pickUp: '店頭受取',
-    pickUpNumber: '受取番号',
-    dineIn: '店内飲食',
-    tableNumber: 'テーブル番号',
-    numberPeople: '人数',
-    multipleDishesPleaseCheckDetails: '複数の商品があります、詳細を確認してください',
-    order: '注文確定',
-    orderTime: '注文時間',
-    noOrderData: '注文データなし',
-    newOrderNotification: '新規注文の通知',
-    youHaveNewOrderPleaseCheckOut: '新しい注文が入りました。確認してください!'
-  },
-  home: {
-    totalMembers: '会員総数',
-    allStores: '全店舗',
-    todayOrderCount: '本日の注文数',
-    orders: '件',
-    totalOrderCount: '注文総数',
-    yesterdaysOrderCount: '昨日の注文数',
-    totalAmount: '総売上',
-    last7DaysOrderCount: '過去7日間の注文数',
-    totalProductCount: '商品総数',
-    thisMonthOrderCount: '今月の注文数',
-    productSalesRanking: '売れ筋ランキング',
-    userSpendingRankingAllStores: 'ユーザー消費ランキング(全店舗)',
-    currentStore: '現在の店舗',
-    productName: '商品名',
-    salesVolume: '販売数',
-    consumptionAmount: '消費金額',
-    productManagement: '商品管理',
-    memberManagement: '会員管理',
-    orderManagement: '注文管理',
-    couponManagement: 'クーポン管理',
-    printerManagement: 'プリンター管理',
-    storeManagement: '店舗管理',
-    paymentManagement: '支払い管理',
-    messageManagement: 'メッセージ管理'
-  },
-  product: {
-    cost: '原価',
-    barCode: '商品コード',
-    weight: '重量(KG)',
-    volume: '体積(m³)',
-    productName: '商品名',
-    enterProductName: '商品名を入力してください',
-    shopName: '店舗名',
-    enterShopName: '店舗名を入力してください',
-    productImage: '商品画像',
-    productPrice: '販売価格',
-    sales: '売上数',
-    stock: '在庫',
-    status: 'ステータス',
-    onSale: '販売中',
-    offSale: '販売停止',
-    addTime: '追加時間',
-    actions: '操作',
-    edit: '編集',
-    delete: '削除',
-    onSaleProducts: '販売中の商品',
-    pendingProducts: '販売待ちの商品',
-    soldOutProducts: '売り切れ商品',
-    confirmSale: '本当に販売状況を変更しますか?',
-    operationSuccess: '操作成功',
-    displayShop: '店舗表示',
-    productCategory: '商品カテゴリ',
-    keyword: 'キーワード',
-    unitName: '単位名',
-    marketPrice: '市場価格',
-    coverImage: 'カバー画像',
-    sliderImage: 'スライド画像',
-    productStatus: '商品状態',
-    productDescription: '商品説明',
-    productSpec: '商品仕様',
-    singleSpec: '単一仕様',
-    multipleSpec: '複数仕様',
-    selectSpec: '仕様を選択',
-    productAttributes: '商品属性',
-    productDetails: '商品詳細',
-    marketingSettings: 'マーケティング設定',
-    getPoints: '獲得ポイント',
-    basicInfo: '基本情報',
-    specSettings: '仕様設定',
-    logisticsSettings: '配送設定',
-    freightSettings: '送料設定',
-    postage: '送料',
-    freightTemplate: '送料テンプレート',
-    newProduct: '新商品ですか?',
-    yes: 'はい',
-    no: 'いいえ'
-  },
-  express: {
-    courierCompanyNumber: '宅配会社番号',
-    pleaseEnterTheCourierCompanyNumber: '宅配会社番号を入力してください',
-    fullNameOfCourierCompany: '宅配会社名(正式名称)',
-    pleaseEnterTheFullNameOfCourierCompany: '宅配会社名を入力してください',
-    sort: '並び順',
-    pleaseEnterTheSort: '並び順を入力してください',
-    theAbbreviationCourierCompanyEmpty: '宅配会社の略称を入力してください',
-    fullNameCourierCompanyEmpty: '宅配会社の正式名称を入力してください',
-    sortCannotEmpty: '並び順は必須です',
-    pleaseEnterTheCourierBirdAppId: '「快递鸟」APIの App ID を入力してください',
-    pleaseEnterTheCourierBirdAppKey: '「快递鸟」APIの App Key を入力してください',
-    isPaidPackage: '有料プランですか?',
-    theThirdPartyTips: 'yshop-proシステムは「快递鸟API」を利用して配送情報を取得します。登録はこちら:',
-    iRegister: '登録する!',
-    courierBirdAppIdCannotBeEmpty: '快递鸟の App ID は必須です',
-    courierBirdAppKeyCannotBeEmpty: '快递鸟の App Key は必須です',
-    companyCode: '会社コード',
-    pleaseEnterTheCourierCompanyCode: '宅配会社コードを入力してください',
-    companyFullName: '会社名',
-    pleaseEnterTheCourierCompanyFullName: '宅配会社の正式名称を入力してください',
-    courierCompanyCode: '宅配会社コード',
-    courierCompanyFullName: '宅配会社名',
-    addTime: '追加日',
-    courierCompanyXls: '宅配会社一覧.xls'
-  },
-  infra: {
-    logPrimaryKey: '日志主键',
-    linkTrace: '链路追踪',
-    applicationName: '应用名',
-    userInformation: '用户信息',
-    userIp: '用户 IP',
-    userUa: '用户 UA',
-    requestInformation: '请求信息',
-    requestParameters: '请求参数',
-    requestResult: '请求结果',
-    requestTime: '请求时间',
-    requestTimeConsumption: '请求耗时',
-    operationResult: '操作结果',
-    normal: '正常',
-    failed: '失败',
-    operationModule: '操作模块',
-    operationName: '操作名',
-    userId: '用户编号',
-    pleaseEnterTheUserNumber: '请输入用户编号',
-    userType: '用户类型',
-    pleaseSelectUserType: '请选择用户类型',
-    pleaseEnterTheApplicationName: '请输入应用名',
-    pleaseEnterTheExecutionTime: '请输入执行时长',
-    resultCode: '结果码',
-    pleaseEnterTheResultCode: '请输入结果码',
-    logNumber: '日志编号',
-    requestMethod: '请求方法',
-    requestAddress: '请求地址',
-    successful: '成功',
-    failure: '失败',
-    operationType: '操作类型',
-    detailed: '详细',
-    operate: '操作',
-    aPIAccessLogs_xls: 'API 访问日志.xls',
-    exceptionTime: '异常时间',
-    exceptionName: '异常名',
-    exceptionStack: '异常堆栈',
-    handlingStatus: '处理状态',
-    handler: '处理人',
-    handlingTime: '处理时间',
-    pleaseSelectTheProcessingStatus: '请选择处理状态',
-    timeOfException: '异常发生时间',
-    handled: '已处理',
-    ignored: '已忽略',
-    confirmationFlaggedAs: '确认标记为',
-    exceptionLogXls: '异常日志.xls',
-    generateJSON: '生成 JSON',
-    generateOptions: '生成 Options',
-    generateComponents: '生成组件',
-    numberOfExecutions: '第几次执行',
-    executionTime: '执行时间',
-    executionDuration: '执行时长',
-    executionResult: '执行结果',
-    successfulExecution: '执行成功',
-    confirmThatYouWantToExecuteOnceImmediately: '确认要立即执行一次',
-    open: '开启',
-    close: '关闭',
-    pause: '暂停',
-    confirmTo: '确认要',
-    timingTaskNumber: '定时任务编号为',
-    ofTheDataItem: '的数据项',
-    timedTaskExecutionLogXls: '定时任务执行日志.xls',
-    firstExecution: '第几次执行',
-    startExecutionTime: '开始执行时间',
-    endExecutionTime: '结束执行时间',
-    selectTheStartExecutionTime: '选择开始执行时间',
-    selectTheEndExecutionTime: '选择结束执行时间',
-    executeOnce: '执行一次',
-    taskDetails: '任务详细',
-    schedulingLog: '调度日志',
-    modify: '修改',
-    taskNumber: '任务编号',
-    taskName: '任务名称',
-    taskStatus: '任务状态',
-    processorName: '处理器的名字',
-    parametersOfTheProcessor: '处理器的参数',
-    executionLog: '执行日志',
-    pleaseEnterTheNameOfTheProcessor: '请输入处理器的名字',
-    pleaseSelectTheTaskStatus: '请选择任务状态',
-    pleaseEnterTheTaskName: '请输入任务名称',
-    milliseconds: '毫秒',
-    notOpened: '未开启',
-    cron: 'Cron 表达式',
-    numberOfRetries: '重试次数',
-    retryInterval: '重试间隔',
-    monitorTimeout: '监控超时时间',
-    subsequentExecutionTime: '后续执行时间',
-    pleaseEnterATaskName: '请输入任务名称',
-    pleaseEnterTheParametersOfTheProcessor: '请输入处理器的参数',
-    pleaseEnterTheNumberOfRetriesWhenSetTo0NoRetriesArePerformed: '请输入重试次数。设置为 0 时,不进行重试',
-    pleaseEnterTheRetryIntervalInMillisecondsWhenSetTo0NoIntervalIsRequired: '请输入重试间隔,单位:毫秒。设置为 0 时,无需间隔',
-    pleaseEnterTheMonitoringTimeoutInMilliseconds: '请输入监控超时时间,单位:毫秒',
-    cronExpression: 'CRON 表达式',
-    taskNameCannotBeNull: '任务名称不能为空',
-    processorNameCannotBeNull: '处理器的名字不能为空',
-    cronExpressionCannotBeNull: 'CRON 表达式不能为空',
-    retryCountCannotBeNull: '重试次数不能为空',
-    retryIntervalCannotBeNull: '重试间隔不能为空',
-    basicInformation: '基本信息',
-    modeOfOperation: '运行模式',
-    standalone: '单机',
-    cluster: '集群',
-    redisVersion: 'Redis版本 :',
-    runtimeMode: '运行模式 :',
-    ports: '端口 :',
-    numberOfClients: '客户端数 :',
-    runtimeDays: '运行时间(天) :',
-    memoryUsed: '使用内存 :',
-    cpuUsed: '使用CPU :',
-    memoryConfiguration: '内存配置 :',
-    whetherAOFIsEnabledOrNot: 'AOF是否开启 :',
-    whetherRDBSuccessfulOrNot: 'RDB是否成功 :',
-    numberOfKeys: 'Key数量 :',
-    networkIngressEgress: '网络入口/出口 :',
-    memoryUsage: '内存使用情况',
-    peak: '峰值',
-    commandStatistics: '命令统计',
-    commands: '命令',
-    memoryConsumption: '内存消耗',
-    anExceptionOccurredInProcessingTheMessage: '处理消息发生异常:',
-    messageNotProcessed: '未处理消息:',
-    systemNotification: '【系统通知】:',
-    groupSendingUserNumber: '【群发】用户编号',
-    groupNoticUserCode: '【群发】用户编号',
-    unknownMessageType: '未知的消息类型:',
-    messageReceived: '收到消息',
-    messageRecord: '消息记录',
-    sent: '发送',
-    allPeople: '所有人',
-    pleaseSelectSender: '请选择发送人',
-    closeConnection: '关闭连接',
-    openConnection: '开启连接',
-    serviceAddress: '服务地址',
-    connectionStatus: '连接状态',
-    connection: '连接',
-    messageInputBox: '消息输入框',
-    pleaseEnterMessageSend: '请输入你要发送的消息',
-    theTestPassedAndTheFileWasUploadedSuccessfullyAccessAddress: '测试通过,上传文件成功!访问地址:',
-    isItConfirmedToModifyTheConfigurationNumberOfTheDataItemIsTheMainConfiguration: '是否确认修改配置编号为',
-    theDataItemsInTheMainConfigurationOfThe: '的数据项为主配置?',
-    test: '测试',
-    masterConfiguration: '主配置',
-    no: '编号',
-    remarks: '备注',
-    configurationName: '配置名',
-    memory: '存储器',
-    pleaseEnterTheConfigurationName: '请输入配置名',
-    pleaseSelectMemory: '请选择存储器',
-    configurationNameCannotBeEmpty: '配置名不能为空',
-    memoryCannotBeEmpty: '存储器不能为空',
-    basePathCannotBeEmpty: '基础路径不能为空',
-    hostAddressCannotBeEmpty: '主机地址不能为空',
-    hostPortCannotBeEmpty: '主机端口不能为空',
-    userNameCannotBeEmpty: '用户名不能为空',
-    passwordCannotBeEmpty: '密码不能为空',
-    connectionModeCannotBeEmpty: '连接模式不能为空',
-    nodeAddressCannotBeEmpty: '节点地址不能为空',
-    storageBucketCannotBeEmpty: '存储 bucket 不能为空',
-    accessKeyCannotBeEmpty: 'accessKey 不能为空',
-    accessSecretCannotBeNull: 'accessSecret 不能为空',
-    storage: '存储',
-    customizedDomainNameCannotBeEmpty: '自定义域名不能为空',
-    basePath: '基础路径',
-    hostAddress: '主机地址',
-    hostPort: '主机端口',
-    userName: '用户名',
-    password: '密码',
-    connectionMode: '连接模式',
-    nodeAddress: '节点地址',
-    storageBucket: '存储 bucket',
-    customizedDomainName: '自定义域名',
-    pleaseEnterAConfigurationName: '请输入配置名',
-    pleaseEnterNotes: '请输入备注',
-    pleaseSelectStorage: '请选择存储器',
-    pleaseEnterTheBasePath: '请输入基础路径',
-    pleaseEnterTheHostAddress: '请输入主机地址',
-    pleaseEnterTheHostPort: '请输入主机端口',
-    pleaseEnterAPassword: '请输入密码',
-    pleaseEnterTheNodeAddress: '请输入节点地址',
-    pleaseEnterBucket: '请输入 bucket',
-    pleaseEnterACustomizedDomainName: '请输入自定义域名',
-    pleaseEnterACustomDomainName: '请输入自定义域名',
-    activeMode: '主动模式',
-    passiveMode: '被动模式',
-    pleaseEnterAccessKey: '请输入 accessKey',
-    pleaseEnterAccessSecret: '请输入 accessSecret',
-    pleaseEnterTheFilePath: '请输入文件路径',
-    pleaseEnterTheFileType: '请输入文件类型',
-    fileName: '文件名',
-    filePath: '文件路径',
-    fileSize: '文件大小',
-    fileType: '文件类型',
-    fileContent: '文件内容',
-    preview: '预览',
-    download: '下载',
-    uploadTime: '上传时间',
-    uploadFile: '上传文件',
-    dragTheFileHereOr: '将文件拖到此处,或',
-    clickUpload: '点击上传',
-    tipOnlyJpgPngGifFormatsAreAllowedToBeImported: '提示:仅允许导入 jpg、png、gif 格式文件!',
-    pleaseUploadTheFile: '请上传文件',
-    uploadFailedPleaseReUpload: '上传失败,请您重新上传!',
-    youCanOnlyUploadAMaximumOfOneFile: '最多只能上传一个文件!',
-    dataSourceName: '数据源名称',
-    dataSourceConnection: '数据源连接',
-    pleaseEnterAParameterName: '请输入参数名称',
-    pleaseEnterTheDataSourceConnection: '请输入数据源连接',
-    pleaseEnterAUserName: '请输入用户名',
-    dataSourceNameCannotBeEmpty: '数据源名称不能为空',
-    dataSourceConnectionCannotBeEmpty: '数据源连接不能为空',
-    primaryKeyNumber: '主键编号',
-    parameterConfigurationXls: '参数配置.xls',
-    parameterPrimaryKey: '参数主键',
-    parameterCategory: '参数分类',
-    parameterKeyName: '参数键名',
-    parameterKeyValue: '参数键值',
-    visibleOrNot: '是否可见',
-    parameterName: '参数名称',
-    builtInSystem: '系统内置',
-    pleaseEnterTheParameterName: '请输入参数名称',
-    pleaseEnterTheParameterKeyName: '请输入参数键名',
-    pleaseSelectSystemBuiltIn: '请选择系统内置',
-    pleaseEnterAParameterCategory: '请输入参数分类',
-    pleaseInputParameterName: '请输入参数名称',
-    pleaseInputParameterKeyName: '请输入参数键名',
-    pleaseEnterTheParameterKeyValue: '请输入参数键值',
-    pleaseEnterTheContent: '请输入内容',
-    parameterCategoryCannotBeEmpty: '参数分类不能为空',
-    parameterNameCannotBeEmpty: '参数名称不能为空',
-    parameterKeyNameCannotBeNull: '参数键名不能为空',
-    parameterKeyValueCannotBeNull: '参数键值不能为空',
-    visibleOrInvisibleCannotBeNull: '是否可见不能为空',
-    tableName: '表名称',
-    tableDescription: '表描述',
-    pleaseEnterAWarehouseName: '请输入仓库名称',
-    pleaseEnter: '请输入',
-    entityClassName: '实体类名称',
-    infraTips: '默认去除表名的前缀。如果存在重复,则需要手动添加前缀,避免 MyBatis 报 Alias 重复的问题。',
-    author: '作者',
-    fieldColumnName: '字段列名',
-    fieldDescription: '字段描述',
-    physicalType: '物理类型',
-    javaType: 'Java类型',
-    javaAttributes: 'java属性',
-    insert: '插入',
-    edit: '编辑',
-    list: '列表',
-    query: '查询',
-    queryMethod: '查询方式',
-    allowNull: '允许空',
-    displayType: '显示类型',
-    textBox: '文本框',
-    textField: '文本域',
-    dropdownBox: '下拉框',
-    radioBox: '单选框',
-    checkbox: '复选框',
-    dateControl: '日期控件',
-    imageUpload: '图片上传',
-    fileUpload: '文件上传',
-    richTextControls: '富文本控件',
-    dictionaryTypes: '字典类型',
-    examples: '示例',
-    generatedTemplates: '生成模板',
-    frontEndTypes: '前端类型',
-    generatedScenarios: '生成场景',
-    parentMenu: '上级菜单',
-    assignToASpecificMenuEgSystemManagement: '分配到指定菜单下,例如 系统管理',
-    pleaseSelectTheSystemMenu: '请选择系统菜单',
-    moduleName: '模块名',
-    moduleNameIeFirstLevelDirectoryEgSystemInfraToolEtc: '模块名,即一级目录,例如 system、infra、tool 等等',
-    businessName: '业务名',
-    businessNameIeSecondLevelDirectoryEgUserPermissionDictEtc: '业务名,即二级目录,例如 user、permission、dict 等等',
-    className: '类名称',
-    classNameInitialCapitalizedEgSysUserSysMenuSysDictDataEtc: '类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等',
-    classDescription: '类描述',
-    usedAsAClassDescriptionEgUser: '用作类描述,例如 用户',
-    customPath: '自定义路径',
-    fillInTheAbsolutePathToTheDiskIfNotItWillBeGeneratedUnderTheCurrentWebProject: '填写磁盘绝对路径,若不填写,则生成到当前Web项目下',
-    quickSelectionOfTheNearestPath: '最近路径快速选择',
-    restoreTheDefaultGeneratedBasePath: '恢复默认的生成基础路径',
-    treeTableInformation: '树表信息',
-    parentNumberField: '父编号字段',
-    theNameOfTheParentCodeFieldOfTheTreeDisplaySuchAsParentId: '树显示的父编码字段名, 如:parent_Id',
-    treeNameField: '树名称字段',
-    nameOfTheDisplayNameFieldOfTheTreeNodeEgDeptName: '树节点的显示名称字段名, 如:dept_name',
-    masterTableInformation: '主表信息',
-    associatedMasterTable: '关联的主表',
-    theNameOfTheAssociatedMasterParentTableEgSystemUser: '关联主表(父表)的表名, 如:system_user',
-    fieldsAssociatedWithChildTables: '子表关联的字段',
-    fieldsAssociatedWithTheChildTableSuchAsUserId: '子表关联的字段, 如:user_id',
-    relationship: '关联关系',
-    theRelationshipBetweenTheMasterTableAndTheChildTable: '主表与子表的关联关系',
-    oneToMany: '一对多',
-    oneToOne: '一对一',
-    fieldInformation: '字段信息',
-    generatedInformation: '生成信息',
-    importTable: '导入表',
-    importSuccessful: '导入成功',
-    dataSource: '数据源',
-    pleaseSelectADataSource: '请选择数据源',
-    pleaseEnterATableName: '请输入表名称',
-    pleaseEnterATableDescription: '请输入表描述',
-    generateCode: '生成代码',
-    entity: '实体',
-    updateTime: '更新时间',
-    areYouSureYouWantToForceSynchronizationOfTableStructure: '确认要强制同步',
-    tableStructure: '表结构吗?',
-    synchronizationSuccessful: '同步成功',
-    codePreview: '代码预览',
-    generateFileInDirectory: '生成文件目录中...',
-    loadingCode: '加载代码中...',
-    timedTaskXls: '定时任务.xls'
-  },
-  mall: {
-    orderTotalPrice: '注文合計金額',
-    userLevel: '等級',
-    orderNo: '注文番号',
-    creditCard: 'クレジットカード',
-    rakutenPay: '楽天ペイ',
-    actualPaymentAmount: '実際の支払金額',
-    paymentResult: '支払い結果',
-    scanningTheCodeForReceivingPayment: '支払い用QRコードをスキャン中...',
-    paymentSettlement: '決済処理',
-    placeAnOrder: '注文する',
-    neverPlacedAnOrder: '注文履歴がありません',
-    advertisementPictureManagementXls: '広告画像管理.xls',
-    newAddCashWithdrawal: '新規出金申請',
-    orderNumber: '注文番号',
-    totalOrderPrice: '注文合計金額',
-    specification: '仕様',
-    orderPickup: '注文受け取り',
-    numberOfDiners: '来店人数',
-    pleaseEnterTheNumberOfPeople: '人数を入力してください',
-    totalAmount: '合計金額',
-    goToOrder: '注文へ進む',
-    noProducts: '商品がありません...',
-    tableTop: 'テーブル番号',
-    pleaseSelectTheSpecification: '仕様を選択してください',
-    pleaseSelectTheStore: '店舗を選択してください',
-    quantityCannotBeLessThan1: '数量は1以上で入力してください',
-    noProductsListed: '保留中の注文がありません',
-    pleaseAddTheProductFirst: '先に商品を追加してください',
-    theNumberOfDinersMustBeGreaterThan0: '来店人数は0より大きい必要があります',
-    pleaseEnterTheProductKeywordProductName: '商品名で検索',
-    checkProducts: '商品検索',
-    cashier: 'レジ担当',
-    noItemsAvailableAtThisTime: '現在決済可能な商品がありません',
-    totalNumberOfItems: '総点数',
-    pendingOrders: '保留中注文',
-    selectProductSpecification: '商品仕様を選択',
-    pleaseAddAStoreOrSelectAStore: '店舗を追加または選択してください',
-    pleaseUseTheScannerBoxOrScannerGunToScanTheMemberPaymentCode: '会員支払いコードをスキャンしてください',
-    scanTheCodeAndPrintTheTicket: 'スキャン完了&レシート印刷',
-    successfulPayment: '支払い成功',
-    printTicket: 'レシートを印刷',
-    settleMattersAdding: '決済リストに追加',
-    settleMattersSubmit: '決済を確定',
-    pleaseChooseThePaymentMethod: '支払い方法を選択してください',
-    cash: '現金払い',
-    balancePayment: '残高払い',
-    weChatPayment: 'WeChat Pay',
-    alipayPayment: 'Alipay',
-    settlementInformation: '決済情報',
-    remarkInformation: '備考',
-    pleaseEnterNoteInformation: '備考を入力してください',
-    discountDiscount: '割引率(%)',
-    pleaseEnterDiscount: '割引率を入力',
-    reduction$: '値引額(円)',
-    pleaseEnterTheDiscountAmount: '値引額を入力',
-    discountAmount: '割引額',
-    amountDue: '支払い金額',
-    name: '氏名',
-    cellPhoneNumber: '電話番号',
-    availableBalance: '利用可能残高',
-    availablePoints: '利用可能ポイント',
-    confirmReceipt: '入金確認',
-    memberInformation: '会員情報',
-    unbound: '未連携',
-    _$: '(円)',
-    storeName: '店舗名',
-    couponName: 'クーポン名',
-    spendHowMuchAvailable: '利用可能金額',
-    couponAmount: 'クーポン金額',
-    availableType: '利用タイプ',
-    pickup: '店頭受取',
-    takeOut: 'テイクアウト',
-    generalPurpose: '一般',
-    used: '使用済み',
-    unused: '未使用',
-    userNickname: 'ユーザー表示名',
-    usedNot: '使用状況',
-    pickupTime: '受取時間',
-    showStores: '店舗表示',
-    selectStore: '店舗選択',
-    redeemCode: '引き換えコード',
-    picture: '画像',
-    howMuchToSpend: '利用可能金額',
-    startTime: '開始時間',
-    closingTime: '終了時間',
-    numberOfIssues: '発行数',
-    pointsRequired: '必要ポイント',
-    limit: '取得制限数',
-    instructionsForUse: '利用規約',
-    whetherItIsOnTheShelfOrNot: '掲載状況',
-    pleaseEnterTheRedemptionCode: '引き換えコードを入力',
-    pleaseEnterTheNameOfTheCoupon: 'クーポン名を入力',
-    pleaseEnterTheAmountOfMoneySpent: '利用可能金額を入力',
-    pleaseEnterTheAmountOfTheCoupon: 'クーポン金額を入力',
-    selectStartTime: '開始時間を選択',
-    selectTheEndTime: '終了時間を選択',
-    pleaseEnterTheNumberOfIssues: '発行数を入力',
-    pleaseEnterTheNumberOfPointsRequired: '必要ポイントを入力',
-    pleaseEnterTheQuantityLimit: '取得制限数を入力',
-    pleaseEnterTheInstructionsForUse: '利用規約を入力',
-    storeId0MeansGenericCantBeEmpty: '店舗ID(0は共通)',
-    couponNameCannotBeEmpty: 'クーポン名は必須です',
-    consumptionOfHowMuchIsAvailableCanNotBeEmpty: '利用可能金額は必須です',
-    couponAmountCannotBeEmpty: 'クーポン金額は必須です',
-    startTimeCannotBeEmpty: '開始時間は必須です',
-    endTimeCannotBeEmpty: '終了時間は必須です',
-    availableTypeCannotBeEmpty: '利用タイプは必須です',
-    theNumberOfCouponsIssuedCannotBeEmpty: '発行数は必須です',
-    limitOnNumberOfCouponsCannotBeEmpty: '取得制限数は必須です',
-    descriptionOfUseCannotBeEmpty: '利用規約は必須です',
-    availableStores: '利用可能店舗',
-    whetherTheCouponIsOnTheShelfOrNot: '掲載状況',
-    howMuchDoYouWantToSpend: '利用可能金額',
-    redemptionCode: '引き換えコード',
-    received: '受取済み',
-    endTime: '終了時間',
-    pleaseEnterAStoreName: '店舗名を入力',
-    pleaseEnterTheCouponName: 'クーポン名を入力',
-    collectionRecord: '受取記録',
-    couponXls: 'クーポン管理.xls',
-    tableNumber: 'テーブル番号',
-    id: 'ID',
-    classification: 'テーブル分類',
-    tableName: 'テーブル名',
-    numberOfOrders: '注文数',
-    consumptionAmount: '消費金額',
-    lastOrderTime: '最終注文時間',
-    pleaseEnterStoreName: '店舗名を入力してください',
-    pleaseEnterTheNumber: '番号を入力してください',
-    batchAdd: '一括追加',
-    batchDownloadOrderCode: '注文コードの一括ダウンロード',
-    import: 'インポート',
-    downloadAndImportTemplate: 'インポートテンプレートをダウンロード',
-    qrCode: 'QRコード',
-    relatedOrders: '関連注文',
-    storesTableNumberXls: '店舗 - テーブル番号.xls',
-    batchImportTableNumberTemplateXls: 'テーブル番号一括インポートテンプレート.xls',
-    smallProgramQrCodeCanOnlyDownloadTheOfficialOh: 'ミニプログラムのQRコードは正式版のみダウンロード可能です',
-    allOrders: '全ての注文',
-    orderStatus: '注文ステータス',
-    all: '全て',
-    unpaid: '未支払い',
-    inProgress: '製作中',
-    toBeReceived: '受け取り待ち',
-    receivedPickedUp: '受け取り済み/取り出し済み',
-    refundOrder: '返金注文',
-    deleted: '削除済み',
-    alipay: '支付宝支払い',
-    cashPayment: '現金支払い',
-    userName: 'ユーザー名',
-    phoneNumber: 'ユーザー電話番号',
-    userType: 'ユーザータイプ',
-    level: 'レベル',
-    pleaseEnterTheOrderNumber: '注文番号を入力してください',
-    pleaseEnterYourName: 'ユーザー名を入力してください',
-    pleaseEnterYourPhoneNumber: 'ユーザー電話番号を入力してください',
-    store: '店舗',
-    userIdNickname: 'ユーザーID|ニックネーム',
-    userNamePhoneNumber: 'ユーザー名|電話番号',
-    productInformation: '商品情報',
-    actualPayment: '実際の支払い',
-    paymentMethod: '支払い方法',
-    purchaseType: '購入タイプ',
-    paymentTime: '支払い時間',
-    notShipped: '未発送',
-    paymentConfirmed: '支払い確認',
-    orderDetails: '注文詳細',
-    modifyToPaymentStatus: '支払いステータスに変更',
-    dineIn: '店内',
-    order: '注文',
-    selectTableCategory: 'テーブル分類を選択',
-    tabletopPicture: 'テーブル画像',
-    remarks: '備考',
-    desktopPicture: 'デスクトップ画像',
-    pleaseEnterTableName: 'テーブル名を入力してください',
-    pleaseEnterTableNumber: 'テーブル番号を入力してください',
-    storeCannotBeEmpty: '店舗は空にできません',
-    tableNumberCannotBeEmpty: 'テーブル番号は空にできません',
-    tableNameCannotBeEmpty: 'テーブル名は空にできません',
-    status1Enabled2DisabledCannotBeEmpty: 'ステータス:1=有効、2=無効は空にできません',
-    tableNumberPrefix: 'テーブル番号プレフィックス',
-    tableNumberRange: 'テーブル番号範囲',
-    remark: '備考',
-    tableNumberPrefixCannotBeEmpty: 'テーブル番号プレフィックスは空にできません',
-    tableNumberStartCannotBeEmpty: 'テーブル番号の開始は空にできません',
-    tableNumberEndCannotBeEmpty: 'テーブル番号の終了は空にできません',
-    status1EqualsEnable2EqualsDisableCannotBeEmpty: 'ステータス:1=有効、2=無効は空にできません',
-    likeY: '例:Y',
-    miniProgramVersion: 'ミニプログラムバージョン',
-    miniProgramQrCode: 'ミニプログラムQRコード',
-    h5QrCode: 'H5 QRコード',
-    miniProgramNotConfigured: 'ミニプログラムが設定されていません',
-    statusOneEqualsEnableTwoEqualsDisableCannotBeEmpty: 'ステータス:1=有効、2=無効は空にできません',
-    releaseVersion: '正式版',
-    experienceVersion: '体験版',
-    developmentVersion: '開発版',
-    miniProgramQrCodeCanOnlyBeDownloadedForReleaseVersion: 'ミニプログラムのQRコードは正式版のみダウンロード可能です',
-    dragFileHereOr: 'ファイルをここにドラッグするか、',
-    clickToUpload: 'クリックしてアップロード',
-    onlyAllowImportXlsXlsxFiles: 'インポートできるのは xls、xlsx ファイルのみです。',
-    downloadTemplate: 'テンプレートをダウンロード',
-    pleaseUploadFile: 'ファイルをアップロードしてください',
-    uploadSuccessCount: 'アップロード成功数:',
-    updateSuccessCount: '更新成功数:',
-    updateFailureCount: '更新失敗数:',
-    uploadFailedPleaseReupload: 'アップロードに失敗しました。再度アップロードしてください!',
-    maxOneFileCanBeUploaded: '最大1ファイルのみアップロード可能です!',
-    categoryName: '分類名',
-    pleaseEnterCategoryName: '分類名を入力してください',
-    categoryNumber: '分類番号',
-    personCount: '人数',
-    categorySort: '分類順序',
-    openStatus: '開始ステータス',
-    storeTableNumberCategoryXls: '店舗テーブル分類.xls',
-    pleaseEnterPersonCount: '人数を入力してください',
-    pleaseSelectStore: '店舗を選択してください',
-    categoryNameCannotBeEmpty: '分類名は空にできません',
-    personCountCannotBeEmpty: '人数は空にできません',
-    categorySortCannotBeEmpty: '分類順序は空にできません',
-    userTypeCannotBeEmpty: "ユーザーのユーザータイプは空にすることはできません",
-    wechatMiniProgram: '微信ミニプログラム',
-    officialAccount: '公式アカウント',
-    h5: 'H5',
-    pleaseEnterUserNickname: 'ユーザーニックネームを入力してください',
-    pleaseEnterPhoneNumber: '電話番号を入力してください',
-    userAvatar: 'ユーザーアバター',
-    userBalance: 'ユーザー残高',
-    userLoginType: 'ユーザーログインタイプ',
-    detail: '詳細',
-    pointsBalance: 'ポイント残高',
-    userXls: 'ユーザー.xls',
-    userInfo: 'ユーザー情報',
-    basicInfo: '基本情報',
-    balance: '残高',
-    birthday: '誕生日',
-    idCardNumber: '身分証明書番号',
-    boundMembershipCard: 'バインドされた会員カード',
-    points: 'ポイント',
-    commissionAmount: '手数料金額',
-    consecutiveSignInDays: '連続サインイン日数',
-    loginIp: 'ログインIP',
-    promotionId: 'プロモーションID',
-    purchaseCount: '購入回数',
-    subordinateCount: '下位者数',
-    loginType: 'ログインタイプ',
-    registrationTime: '登録時間',
-    userOverview: 'ユーザー概要',
-    consumptionRecord: '消費記録',
-    expenseOrGain: '支出/獲得',
-    expense: '支出',
-    gain: '獲得',
-    unknown: '不明',
-    billTitle: '請求書タイトル',
-    detailCategory: '詳細カテゴリ',
-    detailType: '詳細タイプ',
-    recharge: 'チャージ',
-    rebate: 'リベート',
-    consumption: '消費',
-    withdrawal: '引き出し',
-    refund: '返金',
-    systemAdd: 'システム追加',
-    systemReduce: 'システム削減',
-    subtract: '引く',
-    reward: '報酬',
-    signIn: 'サインイン',
-    membershipCard: '会員カード',
-    detailAmountYuan: '詳細金額(円)',
-    remainingYuan: '残高(円)',
-    userAccount: 'ユーザーアカウント',
-    realName: '本名',
-    userRemark: 'ユーザー備考',
-    userPoints: 'ユーザーポイント',
-    detailedAddress: '詳細住所',
-    pleaseEnterUserAccount: 'ユーザーアカウントを入力してください',
-    pleaseEnterRealName: '本名を入力してください',
-    pleaseEnterBirthday: '誕生日を入力してください',
-    pleaseEnterUserRemark: 'ユーザー備考を入力してください',
-    pleaseEnterUserBalance: 'ユーザー残高を入力してください',
-    pleaseEnterCommissionAmount: '手数料金額を入力してください',
-    pleaseEnterUserRemainingPoints: 'ユーザー残ポイントを入力してください',
-    pleaseEnterDetailedAddress: '詳細住所を入力してください',
-    userAccountCannotBeEmpty: 'ユーザーアカウントは空にできません',
-    userNicknameCannotBeEmpty: 'ユーザーニックネームは空にできません',
-    phoneNumberCannotBeEmpty: 'ユーザー電話番号は空にできません',
-    phoneNumber1: '電話番号',
-    selectMember: '会員を選択',
-    select: '選択',
-    modifyBalance: '残高を変更',
-    increase: '増加',
-    decrease: '減少',
-    pleaseEnterBalance: '残高を入力してください',
-    modifyPoints: 'ポイントを変更',
-    pleaseEnterPoints: 'ポイントを入力してください',
-    amountCannotBeEmpty: '金額は空にできません',
-    pointsCannotBeEmpty: 'ポイントは空にできません',
-    name1: '名前',
-    phone: '電話',
-    consigneeName: '受取人名',
-    consigneePhone: '受取人電話',
-    consigneeAddress: '受取人住所',
-    consigneeDetailedAddress: '受取人詳細住所',
-    isDefault: 'デフォルトかどうか',
-    pleaseEnterConsigneeName: '受取人名を入力してください',
-    pleaseEnterConsigneePhone: '受取人電話を入力してください',
-    consigneeNameCannotBeEmpty: '受取人名は空にできません',
-    consigneePhoneCannotBeEmpty: '受取人電話は空にできません',
-    consigneeAddressCannotBeEmpty: '受取人住所は空にできません',
-    consigneeDetailedAddressCannotBeEmpty: '受取人詳細住所は空にできません',
-    isDefaultCannotBeEmpty: 'デフォルトかどうかは空にできません',
-    pleaseEnterConsigneeProvince: '受取人所在の都道府県を入力してください',
-    desktopStatus: 'デスクトップステータス:',
-    idle: 'アイドル中',
-    dining: '食事中',
-    noTableData: 'テーブルデータなし',
-    dineInOrders: '店内注文',
-    takeoutOrders: 'テイクアウト注文',
-    selfPickupOrders: 'セルフピックアップ注文',
-    reservationOrders: '予約注文',
-    pendingOrder: '注文待ち',
-    pendingReceipt: '受け取り待ち',
-    receivedOrPickedUp: '受け取り済み/ピックアップ済み',
-    refundOrders: '返金注文',
-    reserving: '予約中',
-    cancelled: 'キャンセル済み',
-    completed: '完了',
-    wechatPayment: '微信支払い',
-    userPhone: 'ユーザー電話',
-    pleaseEnterOrderNumber: '注文番号を入力してください',
-    pleaseEnterUserName: 'ユーザー名を入力してください',
-    pleaseEnterUserPhone: 'ユーザー電話番号を入力してください',
-    pickupNumber: '取り出し番号',
-    orderNumber1: '注文番号',
-    userNamePhone: 'ユーザー名|電話番号',
-    productInfo: '商品情報',
-    reservation: '予約',
-    reservationPickupTime: '予約取り出し時間',
-    issueOrder: '注文を発行',
-    confirmRefund: '返金を確認',
-    cancelReservation: '予約をキャンセル',
-    confirmPayment: '支払いを確認',
-    orderRecords: '注文記録',
-    deleteOrder: '注文を削除',
-    orderRemark: '注文備考',
-    backendReceipt: 'バックエンド受け取り',
-    modifyToPaidStatus: '支払いステータスに変更',
-    modifyReceiptStatus: '受け取りステータスを変更',
-    confirmCancelReservation: '予約キャンセルを確認',
-    orderXls: '注文.xls',
-    receivingInfo1: '受け取り情報1',
-    consignee: '受取人',
-    contactPhone: '連絡先電話',
-    receivingAddress: '受け取り住所',
-    dishDetails: '料理詳細',
-    mealNotServed: '未提供',
-    mealServed: '提供済み',
-    userOrdering: 'ユーザー注文',
-    staffOrderingOnBehalf: 'スタッフが代わりに注文',
-    productDetails: '商品詳細',
-    reserveTable: 'テーブルを予約',
-    price: '価格',
-    quantity: '数量',
-    orderInfo: '注文情報',
-    diningPersonCount: '食事人数',
-    reservationTime: '予約時間',
-    arrivalTime: '到着時間',
-    reservationPerson: '予約者',
-    reservationPhone: '予約連絡先電話',
-    reservationStatus: '予約ステータス',
-    totalProductQuantity: '商品総数',
-    totalProductPrice: '商品総額',
-    shippingFee: '配送料',
-    pointsDeduction: 'ポイント控除',
-    orderTotalPriceCannotBeEmpty: '注文総額は空にできません',
-    actualPaymentAmountCannotBeEmpty: '実際の支払い金額は空にできません',
-    consumptionEarnedPointsCannotBeEmpty: '消費で獲得したポイントは空にできません',
-    bonusPoints: 'ボーナスポイント',
-    orderIssued: '注文が発行されました',
-    pleasePlaceAnOrderFirst: 'まず注文してください!',
-    confirmOfflineCollection: 'オフライン収集を確認',
-    assistWithOrdering: '注文をサポート',
-    confirmCollection: '収集を確認',
-    issueOrderAndPrintReceipt: '注文を発行してレシートを印刷',
-    print: '印刷',
-    receiptPrint: 'レシート印刷',
-    displayStore: '店舗を表示',
-    categoryImage: '分類画像',
-    categoryDescription: '分類説明',
-    pleaseEnterCategoryDescription: '分類説明を入力してください',
-    openStatusCannotBeEmpty: '開始ステータスは空にできません',
-    belongingStore: '所属店舗',
-    productName: '商品名',
-    commentId: 'コメントID',
-    productScore: '商品評点',
-    serviceScore: 'サービス評点',
-    commentContent: 'コメント内容',
-    commentTime: 'コメント時間',
-    adminReplyContent: '管理者の返信内容',
-    adminReplyTime: '管理者の返信時間',
-    pleaseEnterNickname: 'ニックネームを入力してください',
-    reply: '返信',
-    weight: '重み',
-    pleaseEnterWeight: '重みを入力してください',
-    imageCannotBeEmpty: '画像は空にできません',
-    weightCannotBeEmpty: '重みは空にできません',
-    image: '画像',
-    isAvailable: '利用可能かどうか',
-    salesVolume: '販売量',
-    value: '価値',
-    sellingPrice: '販売価格',
-    pleaseEnterTitle: 'タイトルを入力してください',
-    title: 'タイトル',
-    pleaseEnterValue: '価値を入力してください',
-    pleaseEnterSellingPrice: '販売価格を入力してください',
-    display: '表示',
-    hide: '非表示',
-    titleCannotBeEmpty: 'タイトルは空にできません',
-    valueCannotBeEmpty: '価値は空にできません',
-    sellingPriceCannotBeEmpty: '販売価格は空にできません',
-    icon: 'アイコン',
-    type: 'タイプ',
-    pagePath: 'ページパス',
-    page: 'ページ',
-    jumpToMiniProgram: 'ミニプログラムにジャンプ',
-    content: '内容',
-    myServiceXls: 'マイサービス.xls',
-    selectType: 'タイプを選択',
-    miniProgramAppId: 'ミニプログラムのappid',
-    pleaseSelectType: 'タイプを選択してください',
-    pleaseEnterMiniProgramAppId: 'ミニプログラムのappidを入力してください',
-    pleaseEnterPagePath: 'ページパスを入力してください',
-    pleaseEnterPhone: '電話番号を入力してください',
-    typeCannotBeEmpty: 'タイプは空にできません',
-    iconCannotBeEmpty: 'アイコンは空にできません',
-    specificationName: '仕様名',
-    specificationValue: '仕様値',
-    pleaseEnterSpecificationName: '仕様名を入力してください',
-    pleaseEnterAttributeName: '属性名を入力してください',
-    pleaseEnterSpecificationValue: '仕様値を入力してください',
-    addNewSpecification: '新しい仕様を追加',
-    specificationNameCannotBeEmpty: '仕様名は空にできません',
-    specificationValueCannotBeEmpty: '仕様値は空にできません',
-    rechargeAmountManagementXls: 'チャージ金額管理.xls',
-    productRuleValueSpecificationXls: '商品ルール値(仕様).xls',
-    withdrawalAmountCannotBeEmpty: '引き出し金額は空にできません',
-    bankCardCannotBeEmpty: '銀行カードは空にできません',
-    withdrawalAmount: '引き出し金額',
-    withdrawToBankCard: '銀行カードに引き出す',
-    pleaseEnterWithdrawalAmount: '引き出し金額を入力してください',
-    selectBankCard: '銀行カードを選択',
-    pleaseSelectStatus: 'ステータスを選択してください',
-    unreviewed: '未審査',
-    pendingArrival: '到着待ち',
-    reviewRejected: '審査拒否',
-    arrived: '到着済み',
-    withdrawalBankCard: '引き出し銀行カード',
-    bankName: '銀行名',
-    bankCardNumber: '銀行カード番号',
-    reviewRejectionReason: '審査拒否理由',
-    pleaseEnterReviewRejectionReason: '審査拒否理由を入力してください',
-    printerName: 'プリンター名',
-    terminalNumber: '端末番号',
-    terminalKey: '端末キー',
-    pleaseEnterPrinterName: 'プリンター名を入力してください',
-    configurePrinter: 'プリンターを設定',
-    printerClientId: 'プリンタークライアントID',
-    printerClientSecret: 'プリンタークライアントシークレット',
-    printerClientIdCannotBeEmpty: 'プリンタークライアントIDは空にできません',
-    printerClientSecretCannotBeEmpty: 'プリンタークライアントシークレットは空にできません',
-    pleaseEnterTerminalNumber: '端末番号を入力してください',
-    pleaseEnterTerminalKey: '端末キーを入力してください',
-    pleaseEnterBankName: '銀行名を入力してください',
-    pleaseEnterBankCardNumber: '銀行カード番号を入力してください',
-    pleaseEnterName: '名前を入力してください',
-    bankNameCannotBeEmpty: '銀行名は空にできません',
-    bankCardNumberCannotBeEmpty: '銀行カード番号は空にできません',
-    nameCannotBeEmpty: '名前は空にできません',
-    ID: 'ID',
-    pleaseEnterUserId: 'ユーザーIDを入力してください',
-    pleaseSelectUser: 'ユーザーを選択してください',
-    income: '収入',
-    amount: '金額',
-    storeId: '店舗ID',
-    typeTips: 'タイプ:1=収入,2=支出',
-    pleaseSelectDictionaryGeneration: '辞書生成を選択してください',
-    user: 'ユーザー',
-    pleaseEnterStoreId: '店舗IDを入力してください',
-    pleaseSelectTypeTips: 'タイプを選択してください:1=収入,2=支出',
-    pleaseEnterAmount: '金額を入力してください',
-    pleaseEnterUser: 'ユーザーを入力してください',
-    storeNameCannotBeEmpty: '店舗名は空にできません',
-    associatedTags: '関連タグ',
-    selectTag: 'タグを選択',
-    intervalTimeUnitHours: '間隔時間(単位:時間)',
-    pleaseEnterIntervalTimeUnitHours: '間隔時間(単位:時間)を入力してください',
-    selectEndTime: '終了時間を選択',
-    pleaseSelectTag: 'タグを選択してください',
-    intervalTimeCannotBeEmpty: '間隔時間は空にできません',
-    tagName: 'タグ名',
-    pleaseEnterTagName: 'タグ名を入力してください',
-    tagNameCannotBeEmpty: 'タグ名は空にできません',
-    storePhone: '店舗電話',
-    storeImage: '店舗画像',
-    longitude: '経度',
-    latitude: '緯度',
-    minimumOrderPrice: '最低注文金額',
-    deliveryPrice: '配送料',
-    isOpen: '営業中かどうか',
-    pleaseEnterStorePhone: '店舗電話を入力してください',
-    pleaseEnterPlaceKeyword: '場所キーワードを入力してください',
-    selectOnMap: '地図で選択',
-    pleaseSelectLocationAddress: '位置住所を選択してください',
-    storeAvatar: '店舗アバター',
-    storeGroupImages: '店舗グループ画像',
-    businessStartTime: '営業開始時間',
-    businessEndTime: '営業終了時間',
-    selectMapLocation: '地図で位置を選択',
-    mapLocationAddress: '地図の位置住所',
-    takeoutDeliveryDistance: 'テイクアウト配送距離/キロメートル',
-    announcement: 'お知らせ',
-    bindAdministrator: '管理者をバインド',
-    selectBusinessStartTime: '営業開始時間を選択',
-    selectBusinessEndTime: '営業終了時間を選択',
-    pleaseEnterMapLocationAddress: '地図の位置住所を入力してください',
-    pleaseEnterLongitude: '経度を入力してください',
-    pleaseEnterLatitude: '緯度を入力してください',
-    pleaseEnterTakeoutDeliveryDistance: 'テイクアウト配送距離をキロメートル単位で入力してください。0はテイクアウトを表しません',
-    pleaseEnterMinimumOrderPrice: '最低注文金額を入力してください',
-    pleaseEnterDeliveryPrice: '配送料を入力してください',
-    pleaseEnterAnnouncement: 'お知らせを入力してください',
-    clickToSelectAddressToGetLongitudeAndLatitude: '住所を選択して経度と緯度を取得',
-    selectUser: 'ユーザーを選択',
-    bindAdministratorForBranchManagement: '支店管理のために管理者をバインド',
-    isStoreReceiptPrintingEnabled: '店舗レシート印刷を有効にするかどうか',
-    bindPrinter: 'プリンターをバインド',
-    selectPrinter: 'プリンターを選択',
-    isCustomerReceiptPrintingEnabled: '顧客レシート印刷を有効にするかどうか',
-    isKitchenReceiptPrintingEnabled: 'キッチンレシート印刷を有効にするかどうか',
-    storePhoneCannotBeEmpty: '店舗電話は空にできません',
-    multipleImagesCannotBeEmpty: '複数の画像は空にできません',
-    detailedAddressCannotBeEmpty: '詳細住所は空にできません',
-    mapLocationAddressCannotBeEmpty: '地図の位置住所は空にできません',
-    longitudeCannotBeEmpty: '経度は空にできません',
-    latitudeCannotBeEmpty: '緯度は空にできません',
-    takeoutDeliveryDistanceTips: 'テイクアウト配送距離(単位:キロメートル)は空にできません',
-    minimumOrderPriceCannotBeEmpty: '最低注文金額は空にできません',
-    deliveryPriceCannotBeEmpty: '配送料は空にできません',
-    announcementCannotBeEmpty: 'お知らせは空にできません',
-    isOpenTips: '営業中かどうか:0=いいえ、1=はいは空にできません',
-    administratorIdCannotBeEmpty: '管理者IDは空にできません',
-    printerIdCannotBeEmpty: 'プリンターIDは空にできません',
-    businessStartTimeCannotBeEmpty: '営業開始時間は空にできません',
-    businessEndTimeCannotBeEmpty: '営業終了時間は空にできません',
-    pleaseBindStorePrinter: '店舗プリンターをバインドしてください',
-    pleaseBindCustomerPrinter: '顧客プリンターをバインドしてください',
-    pleaseBindKitchenPrinter: 'キッチンプリンターをバインドしてください',
-    storeManagementXls: '店舗管理.xls',
-    inStoreConsumption: '店内消費',
-    appointmentLabelXls: '予約ラベル.xls',
-    appointmentRuleXls: '予約ルール.xls',
-    storeMobileMerchantUserAssociationXls: '店舗モバイル商家ユーザー関連.xls'
-  },
-  market: {
-    orderNumber: '注文番号',
-    userIdAndNickname: 'ユーザーID|ニックネーム',
-    billTitle: '請求タイトル',
-    detailedFigureYuan: '詳細金額(円)',
-    paid: '支払済み',
-    unpaid: '未払い',
-    addTime: '追加日時',
-    cardName: '会員カード名',
-    pleaseEnterTheNameOfTheMembershipCard: '会員カード名を入力してください',
-    discountRatio: '割引率',
-    break: '割引',
-    validPeriod: '有効期間',
-    permanent: '永久',
-    month: '月',
-    purchasePrice: '購入価格',
-    bonusPoints: 'ボーナスポイント',
-    bonusAmount: 'ボーナス金額',
-    delete: '削除',
-    purchaseRecord: '購入記録',
-    membershipCardXls: '会員カード管理.xls',
-    basicInformation: '基本情報',
-    cardStyle: 'カードデザイン',
-    pleaseEnterTheOrder: '順序を入力してください',
-    discount: '割引あり',
-    pleaseEnterThePercentageOfDiscount: '割引率を入力してください',
-    freeGiftWhenYouOpenTheCard: 'カード開設特典',
-    balance: '残高',
-    NumberBonusPoints: 'ボーナスポイント数',
-    pleaseEnterTheNumberOfBonusPoints: 'ボーナスポイント数を入力してください',
-    bonusBalance: 'ボーナス残高',
-    pleaseEnterTheBalanceOfTheGift: 'ボーナス残高を入力してください',
-    receiveConfiguration: '受け取り設定',
-    validityPeriod: '有効期間',
-    pleaseEnterTheValidityPeriod: '有効期間を入力してください',
-    theValidityPeriodIsInMonths0MeansPermanent: '有効期間は月単位、0は永久',
-    pleaseEnterThePurchasedPrice: '購入価格を入力してください',
-    rulesForUse: '利用規約',
-    cardNameCannotBeEmpty: '会員カード名は必須です',
-    cardStyleCannotBeEmpty: 'カードデザインは必須です',
-    expiryDateCannotBeEmpty: '有効期間は必須です',
-    purchasePriceCannotBeEmpty1: '購入価格は必須です',
-    orderTotalPriceCannotBeEmpty: '注文合計金額は必須です',
-    refundAmountCannotBeEmpty: '返金額は必須です',
-    orderTotalPrice: '注文合計金額',
-    refundAmount: '返金額',
-    pleaseEnterOrderNumber: '注文番号を入力してください',
-    pleaseEnterOrderTotalPrice: '注文合計金額を入力してください',
-    actualPaymentAmountCannotBeEmpty: '実際の支払金額は必須です',
-    consumptionEarnedPointsCannotBeEmpty: '消費獲得ポイントは必須です',
-    actualPaymentAmount: '実際の支払金額',
-    pleaseEnterActualPaymentAmount: '実際の支払金額を入力してください',
-    pleaseEnterBonusPoints: 'ボーナスポイントを入力してください',
-    expressCompanyCannotBeEmpty: '配送会社は必須です',
-    expressTrackingNumberCannotBeEmpty: '配送追跡番号は必須です',
-    expressCompany: '配送会社',
-    selectExpressCompany: '配送会社を選択',
-    pleaseEnterExpressTrackingNumber: '配送追跡番号を入力してください',
-    courierNumber: '配送追跡番号',
-    tableNumber: 'テーブル番号',
-    pickupNumber: '受け取り番号',
-    address: '住所',
-    orderId: '注文ID',
-    operationRecord: '操作記録',
-    operationTime: '操作日時'
-  },
-  message: {
-    templateName: 'テンプレート名',
-    pleaseEnterTheTemplateName: 'テンプレート名を入力してください',
-    templateNumber: 'テンプレート番号',
-    templateId: 'テンプレートID',
-    type: 'タイプ',
-    templateMessage: 'テンプレートメッセージ',
-    subscribeMessage: '購読メッセージ',
-    addTime: '追加日時',
-    weChatTemplateXls: 'WeChatテンプレート.xls',
-    messageType: 'メッセージタイプ',
-    pleaseSelectType: 'タイプを選択してください',
-    pleaseSelectMessageType: 'メッセージタイプを選択してください',
-    pleaseEnterTheTemplateNumber: 'テンプレート番号を入力してください',
-    pleaseEnterTheTemplateId: 'テンプレートIDを入力してください',
-    templateNumberCannotBeEmpty: 'テンプレート番号は必須です',
-    templateNameCannotBeEmpty: 'テンプレート名は必須です',
-    messageTypeCannotBeEmpty: 'テンプレートIDは必須です',
-    templateIdCannotBeEmpty: 'メッセージタイプは必須です',
-    open: '開く'
-  },
-  mp: {
-    pleaseSelectTheWeChatOfficialAccount: 'WeChat公式アカウントを選択してください',
-    clickToLoadMore: 'クリックしてさらに読み込む',
-    thereIsNoMore: 'これ以上ありません',
-    sends: '送信(S)',
-    theNumberofGraphicMessagesIsLimitedto1: '画像メッセージは1件以内に制限されています。最初のメッセージが送信されます',
-    pleaseEnterTheMusicLink: '音楽リンクを入力してください',
-    pleaseEnterTheHighQualityMusicLink: '高品質音楽リンクを入力してください',
-    selectThePublishedGraphic: '公開済みの画像を選択',
-    selectTheGraphicintheDraftBox: '下書きから画像を選択',
-    selectTheVoice: '音声を選択',
-    text: 'テキスト',
-    graphic: '画像',
-    music: '音楽',
-    clickToPlayTheVideo: 'クリックして動画を再生',
-    videoPlayback: '動画再生',
-    voiceRecognition: '音声認識',
-    abstract: '概要',
-    name: '名前',
-    wechatAccount: 'WeChatアカウント',
-    messageEncryptionKey: 'メッセージ暗号化キー',
-    pleaseEnterName: '名前を入力してください',
-    pleaseEnterWechatAccount: 'WeChatアカウントを入力してください',
-    pleaseEnterTheAppIdOfTheWeChatOfficialAccount: 'WeChat公式アカウントのAppIDを入力してください',
-    pleaseEnterOfficialAccount: '公式アカウントのAppSecretを入力してください',
-    pleaseEnterOfficialAccountToken: '公式アカウントのトークンを入力してください',
-    pleaseEnterMessageEncryptionKey: 'メッセージ暗号化キーを入力してください',
-    pleaseEnterMiniProgramAppId: 'ミニプログラムのAppIDを入力してください',
-    pleaseEnterMiniProgramAppSecret: 'ミニプログラムのAppSecretを入力してください',
-    tip11:
-      'WeChat公式プラットフォーム(mp.weixin.qq.com)のメニュー [設定と開発 - 公式アカウント設定 - アカウント詳細] で「WeChatアカウント」を確認できます',
-    tip12:
-      'WeChat公式プラットフォーム(mp.weixin.qq.com)のメニュー [設定と開発 - 公式アカウント設定 - 基本設定] で「開発者ID(AppID)」を確認できます',
-    tip13:
-      'WeChat公式プラットフォーム(mp.weixin.qq.com)のメニュー [設定と開発 - 公式アカウント設定 - 基本設定] で「開発者パスワード(AppSecret)」を確認できます',
-    nameCannotBeEmpty: '名前は必須です',
-    officialAccountCannotBeEmpty: '公式アカウントは必須です',
-    officialAccountAppIdCannotBeEmpty: '公式アカウントのAppIDは必須です',
-    officialAccountSecretCannotBeEmpty: '公式アカウントのAppSecretは必須です',
-    officialAccountTokenCannotBeEmpty: '公式アカウントのトークンは必須です',
-    appId: 'AppID',
-    serverAddressUrl: 'サーバーアドレス(URL)',
-    qrCode: 'QRコード',
-    generateQRCode: 'QRコードを生成',
-    isMainAccount: 'メインアカウントですか?',
-    search: '検索',
-    reset: 'リセット',
-    clearApiQuota: 'APIクォータをクリア',
-    setAsMainAccount: 'メインアカウントに設定',
-    settingSucceeded: '設定成功',
-    messageType: 'メッセージタイプ',
-    matchingType: 'マッチングタイプ',
-    pleaseSelectMatchingType: 'マッチングタイプを選択してください',
-    pleaseEnterContent: '内容を入力してください',
-    keyword: 'キーワード',
-    replyMessage: '返信メッセージ',
-    requestedKeywordCannotBeEmpty: 'リクエストされたキーワードは必須です',
-    requestedKeywordMatchingCannotBeEmpty: 'リクエストされたキーワードのマッチングは必須です',
-    requestMessageType: 'リクエストメッセージタイプ',
-    cover: 'カバー',
-    tip3: 'あなたは公開方式でコンテンツを投稿しています。公開は配信回数にカウントされず、1日に複数回投稿できます。',
-    tip4: '公開されたコンテンツはユーザーにプッシュされず、公式アカウントのホームページにも表示されません。',
-    tip5: '公開後、投稿記録からリンクを取得したり、公開コンテンツをカスタムメニュー、自動返信、トピック、ページテンプレートに追加できます。',
-    replyMessageType: '返信メッセージタイプ',
-    replyContent: '返信内容',
-    officialAccount: '公式アカウント',
-    addNew: '新規追加',
-    replyOnFollow: 'フォロー時返信',
-    messageReply: 'メッセージ返信',
-    keywordReply: 'キーワード返信',
-    addNewAutoReply: '新規自動返信を追加',
-    modifyAutoReply: '自動返信を修正',
-    areYouSureToDeleteThisData: 'このデータを削除しますか?',
-    deletionSucceeded: '削除成功',
-    modificationSucceeded: '修正成功',
-    additionSucceeded: '追加成功',
-    updateitionSucceeded: '更新成功',
-    uploadLocally: 'ローカルからアップロード',
-    supportsBmpPngJpegJpgGifFormatsSizeNotExceeding2M: 'bmp/png/jpeg/jpg/gif形式をサポート、サイズは2M以下',
-    uploadError: 'アップロードエラー:',
-    uploadFailed: 'アップロード失敗:',
-    pleaseEnterTitleRequired: 'タイトルを入力してください(必須)',
-    pleaseEnterAuthor: '著者を入力してください',
-    pleaseEnterOriginalArticleAddress: '原文のアドレスを入力してください',
-    pleaseEnterAbstract: '概要を入力してください',
-    areYouSureToDeleteThisGraphic: 'この画像を削除しますか?',
-    createNewGraphic: '新規画像を作成',
-    modifyGraphic: '画像を修正',
-    modifiedContentMayNotBeSavedAreYouSureToClose: '修正内容が保存されていない可能性があります。閉じますか?',
-    publishingSucceeded: '公開成功',
-    thisOperationWillPermanentlyDeleteTheDraftAreYouSureToContinue: 'この操作で下書きが永久に削除されます。続行しますか?',
-    afterDeletionUsersCannotAccessThisPageAreYouSureToDelete: '削除後、ユーザーはこのページにアクセスできなくなります。削除しますか?',
-    image: '画像',
-    voice: '音声',
-    video: '動画',
-    clickToUpload: 'クリックしてアップロード',
-    uploadSucceeded: 'アップロード成功',
-    createNewVideo: '新規動画を作成',
-    selectVideo: '動画を選択',
-    tip0: 'MP4形式をサポート、ファイルサイズは10MB以下',
-    tips1: 'タイトルは関連する再生ページに表示されます。明確で正確なタイトルを入力してください',
-    tips2: '説明文は関連する再生ページに表示されます。簡潔で情報量のある内容を入力してください',
-    pleaseEnterTitle: 'タイトルを入力してください',
-    pleaseEnterDescription: '説明を入力してください',
-    number: '番号',
-    fileName: 'ファイル名',
-    introduction: '紹介',
-    uploadTime: 'アップロード日時',
-    download: 'ダウンロード',
-    delete: '削除',
-    description: '説明',
-    formatSupportsMp3WmaWavAmrFileSizeNotExceeding2MPlaybackLengthNotExceeding60s:
-      'mp3/wma/wav/amr形式をサポート、ファイルサイズは2MB以下、再生時間は60秒以下',
-    thisOperationWillPermanentlyDeleteTheFileAreYouSureToContinue: 'この操作でファイルが永久に削除されます。続行しますか?',
-    deleteCurrentMenu: '現在のメニューを削除',
-    menuName: 'メニュー名(CN)',
-    menuNameEn: 'メニュー名(EN)',
-    menuNameJp: 'メニュー名',
-    pleaseEnterMenuName: 'メニュー名を入力してください',
-    menuIdentifier: 'メニュー識別子',
-    pleaseEnterMenuKey: 'メニューKEYを入力してください',
-    menuContent: 'メニュー内容',
-    jumpLink: 'リンク先',
-    pleaseEnterLink: 'リンクを入力してください',
-    miniProgramAppId: 'ミニプログラムのAppID',
-    miniProgramPagePath: 'ミニプログラムのページパス',
-    pleaseEnterMiniProgramPagePathEgPagesIndex: 'ミニプログラムのページパスを入力してください(例:pages/index)',
-    miniProgramBackupWebpage: 'ミニプログラムのバックアップウェブページ:',
-    OlderVersionsOfTheClientThatDoNotSupportMiniProgramsWillOpenThisWebpage:
-      'ミニプログラムをサポートしていない古いバージョンのクライアントはこのウェブページを開きます',
-    tipsYouNeedToAssociateWithTheOfficialAccountToBindTheMiniProgramToTheWeChatMenu:
-      'ヒント:ミニプログラムをWeChatメニューにバインドするには、公式アカウントと関連付ける必要があります!',
-    selectFromMaterialLibrary: '素材ライブラリから選択',
-    selectGraphic: '画像を選択',
-    YouHaveSelectedAMultiGraphicItWillDefaultToJumpToTheFirstOne: '複数画像を選択しました。最初の画像にジャンプします',
-    jumpToWebpage: 'ウェブページにジャンプ',
-    jumpToMiniProgram: 'ミニプログラムにジャンプ',
-    clickToReply: 'クリックして返信',
-    jumpToGraphicMessage: '画像メッセージにジャンプ',
-    scanCodeToReturnResultDirectly: 'スキャンして結果を直接返す',
-    scanCodeToReply: 'スキャンして返信',
-    systemTakePhotoAndSendImage: 'システムで写真を撮って画像を送信',
-    takePhotoOrSelectFromAlbum: '写真を撮るかアルバムから選択',
-    wechatAlbum: 'WeChatアルバム',
-    selectLocation: '位置情報を選択',
-    subMenuName: 'サブメニュー名',
-    saveAndPublishMenu: 'メニューを保存して公開',
-    clearMenu: 'メニューをクリア',
-    pleaseSelectMenuConfiguration: 'メニュー設定を選択してください',
-    areYouSureToDelete: '削除しますか?',
-    areYouSureToSave: '保存しますか?',
-    clearingSucceeded: 'クリア成功',
-    userIdentifier: 'ユーザー識別子',
-    pleaseSelectMessageType: 'メッセージタイプを選択してください',
-    pleaseEnterUserIdentifier: 'ユーザー識別子を入力してください',
-    fanMessageList: 'ファンメッセージリスト',
-    sendTime: '送信日時',
-    sender: '送信者',
-    fan: 'ファン',
-    follow: 'フォロー',
-    unfollow: 'フォロー解除',
-    clickMenu: 'メニューをクリック',
-    clickMenuLink: 'メニューリンクをクリック',
-    scanCodeResult: 'スキャン結果',
-    unknownEventType: '不明なイベントタイプ',
-    link: 'リンク',
-    unknownMessageType: '不明なメッセージタイプ',
-    message: 'メッセージ',
-    timeRange: '時間範囲',
-    userIncreaseDecreaseData: 'ユーザー増減データ',
-    cumulativeUserData: '累計ユーザーデータ',
-    messageOverviewData: 'メッセージ概要データ',
-    interfaceAnalysisData: 'インターフェース分析データ',
-    newUsers: '新規ユーザー',
-    unfollowedUsers: 'フォロー解除ユーザー',
-    cumulativeUserCount: '累計ユーザー数',
-    numberOfUsersSendingMessages: 'メッセージ送信ユーザー数',
-    numberOfMessagesSentByUsers: 'ユーザー送信メッセージ数',
-    numberOfPassiveRepliesToUserMessages: 'ユーザーメッセージへの受動返信数',
-    numberOfFailures: '失敗数',
-    maximumTimeConsumed: '最大所要時間',
-    totalTimeConsumed: '総所要時間',
-    noOfficialAccountSelectedCannotStatisticData: '公式アカウントが選択されていません。データを統計できません',
-    timeIntervalShouldBeWithin7DaysPleaseReSelect: '時間間隔は7日以内で選択してください',
-    synchronize: '同期',
-    numberOfFans: 'ファン数',
-    areYouSureToSynchronizeTags: 'タグを同期しますか?',
-    tagSynchronizationSucceeded: 'タグ同期成功',
-    pleaseEnterTagName: 'タグ名を入力してください',
-    nickname: 'ニックネーム',
-    tag: 'タグ',
-    subscriptionStatus: '購読ステータス',
-    subscriptionTime: '購読日時',
-    areYouSureToSynchronizeFans: '是否确认同步粉丝?',
-    startingToSynchronizeFanInfoFromWechatOfficialAccountItTakesTimePleaseQueryLater:
-      '开始从微信公众号同步粉丝信息,同步需要一段时间,建议稍后再查询',
-    pleaseSelectTag: '请选择标签',
-    subscribed: '已订阅',
-    unsubscribed: '未订阅'
-  },
-  pay: {
-    idTenantId: 'ID(+テナントID)',
-    paymentType: '支払いタイプ(支払いチャネル)',
-    applicationId: 'アプリケーションID',
-    merchantId: '商家ID',
-    asynchronousCallbackAddress: '非同期コールバックアドレス',
-    synchronousCallbackAddress: '同期コールバックアドレス',
-    signature: '署名方式',
-    testEnvironment: 'テスト環境かどうか',
-    alipay: '支付宝支払い',
-    weChatPayment: '微信支払い',
-    payId: '支払いID',
-    weChatPaySmallProgram: '微信支払いミニプログラム',
-    weChatPayPublic: '微信支払い公式アカウント',
-    weChatPayH5: '微信支払いH5',
-    alipayH5: '支付宝H5',
-    pleaseEnterTheAppId: 'アプリケーションIDを入力してください',
-    weChatMerchantId: '微信商家ID',
-    pleaseEnterWeChatMerchantId: '微信商家IDを入力してください',
-    alipayMerchantId: '支付宝商家ID',
-    pleaseEnterTheAlipayMerchantId: '支付宝商家IDを入力してください',
-    certificateStorageType: '証明書ストレージタイプ',
-    pleaseSelectTheType: 'タイプを選択してください',
-    noteNeedCertificateOfChoiceDoNotNeedNotChoose: '注意:証明書が必要な場合は選択し、必要ない場合は選択しないでください',
-    privateKeyOrPrivateKeyCertificate: 'プライベートキーまたはプライベートキー証明書',
-    pleaseEnterThePrivateKeyOrPrivateKeyCertificate: 'プライベートキーまたはプライベートキー証明書を入力してください',
-    publicKeyOrPublicKeyCertificate: 'パブリックキーまたはパブリックキー証明書',
-    pleaseEnterThePublicKeyOrPublicKeyCertificate: 'パブリックキーまたはパブリックキー証明書を入力してください',
-    keyCertificate: 'キー証明書',
-    pleaseEnterTheKeyCertificateAdditionalCertificatesToUseSuchAsSslCertificateOrUnionPayRootLevelCertificates:
-      'キー証明書を入力してください。追加証明書としてSSL証明書や銀聯ルートレベル証明書を使用します',
-    passwordOfTheCertificate: '証明書のパスワード',
-    pleaseEnterThePasswordOfThePrivateKeyCertificateOrKeyCertificate:
-      'プライベートキー証明書またはキー証明書のパスワードを入力してください',
-    pleaseEnterTheAsynchronousCallback: '非同期コールバックを入力してください',
-    pleaseEnterTheSynchronousCallbackAddressWhichIsMostlyUsedForPageJumpAfterSuccessfulPayment:
-      '同期コールバックアドレスを入力してください。支払い成功後のページジャンプに主に使用されます',
-    pleaseSelectSignatureMethodMd5: '署名方式MD5を選択してください',
-    subappid: 'サブappid',
-    pleaseEnterTheSubAppid: 'サブappidを入力してください',
-    subMerchantId: 'サブ商家ID',
-    pleaseEnterTheSubMerchantId: 'サブ商家IDを入力してください',
-    paymentTypeCannotBeEmpty: '支払いタイプ(支払いチャネル)は空にできません',
-    paymentIdCannotBeEmpty: '支払いIDは空にできません',
-    applicationIdCannotBeEmpty: 'アプリケーションIDは空にできません',
-    signatureMethodCannotBeEmpty: '署名方式は空にできません',
-    asynchronousCallbackAddressCannotBeEmpty: '非同期コールバックアドレスは空にできません'
-  },
-  Redirect: {},
-  score: {
-    all: '全て',
-    toBePaid: '支払い待ち',
-    toBeShipped: '発送待ち',
-    toBeReceived: '受け取り待ち',
-    completed: '完了',
-    allOrders: '全ての注文',
-    orderStatus: '注文ステータス',
-    userName: 'ユーザー名',
-    pleaseEnterYourPhoneNumber: '電話番号を入力してください',
-    pleaseEnterTheOrderNumber: '注文番号を入力してください',
-    userIdNickname: 'ユーザーID|ニックネーム',
-    productInformation: '商品情報',
-    totalPointsConsumed: '消費したポイント合計',
-    totalConsumptionAmount: '消費総額',
-    paymentMethod: '支払い方法',
-    balancePayment: '残高支払い',
-    weChatPayment: '微信支払い',
-    alipayPayment: '支付宝支払い',
-    cashPayment: '現金支払い',
-    shipping: '発送',
-    more: 'もっと見る',
-    orderDetails: '注文詳細',
-    deleteOrder: '注文を削除',
-    backstageReceiving: 'バックエンド受け取り',
-    pointsMallOrdersXls: 'ポイントモール注文.xls',
-    modifyReceivingStatus: '受け取りステータスを変更',
-    receivingInformation: '受け取り情報',
-    nickname: 'ニックネーム',
-    consignee: '受取人',
-    contactPhoneNumber: '連絡先電話番号',
-    address: '住所',
-    productDetails: '商品詳細',
-    goodsPicture: '商品画像',
-    productName: '商品名',
-    orderInformation: '注文情報',
-    logisticsInformation: '物流情報',
-    orderNo: '注文番号',
-    quantity: '数量',
-    spendingPoints: '消費ポイント',
-    payment: '支払い済みかどうか',
-    whetherToShipOrNot: '発送するかどうか',
-    receiveOrNot: '受け取り済みかどうか',
-    expressCompany: '配送会社',
-    courierNumber: '配送追跡番号',
-    selectType: 'タイプを選択',
-    fillInManually: '手動で入力',
-    shippingType: '発送タイプ',
-    selectCourierCompany: '配送会社を選択',
-    pleaseEnterTheCourierSingleNumber: '配送追跡番号を入力してください',
-    pleaseSelectTheCourierCompany: '配送会社を選択してください',
-    pleaseSelectSendingStatus: '発送ステータスを選択してください',
-    pleaseSelectReceivingStatus: '受け取りステータスを選択してください',
-    productTitle: '商品タイトル',
-    pleaseEnterTheProductTitle: '商品タイトルを入力してください',
-    selectCategory: '商品カテゴリを選択',
-    productCategory: '商品カテゴリ',
-    mainPicture: 'メイン画像',
-    picture: '画像',
-    pointsConsumption: '消費ポイント',
-    price: '商品価格',
-    originalPrice: '商品元価格',
-    weight: '重み',
-    inventory: '在庫',
-    salesVolume: '販売量',
-    whetherItIsOnTheShelfOrNot: '棚に上げるかどうか',
-    up: '上架',
-    down: '下架',
-    pointsProductsXls: 'ポイント商品.xls',
-    category: '商品カテゴリ',
-    groupPicture: 'グループ画像',
-    detail: '詳細',
-    purchaseAmount: '購入金額',
-    pleaseEnterThePointsConsumed: '消費ポイントを入力してください',
-    pleaseEnterTheAmount: '金額を入力してください',
-    tips: 'ポイントと金額が両方とも0より大きい場合、この商品はポイントと価格で購入する必要があります',
-    pleaseEnterStock: '在庫を入力してください',
-    pleaseEnterAWeight: '重みを入力してください',
-    productTitleCannotBeEmpty: '商品タイトルは空にできません',
-    pleaseSelectProductCategory: '商品カテゴリを選択してください',
-    mainPictureCannotBeEmpty: 'メイン画像は空にできません',
-    groupPictureCannotBeEmpty: 'グループ画像は空にできません',
-    detailsCannotBeEmpty: '詳細は空にできません',
-    pointsConsumedCannotBeEmpty: '消費ポイントは空にできません',
-    originalPriceCannotBeEmpty: '商品元価格は空にできません',
-    inventoryCannotBeEmpty: '在庫は空にできません',
-    uploadImage: '画像をアップロード',
-    availability: '利用可能かどうか',
-    imageCannotBeEmpty: '画像は空にできません',
-    showOrNotCannotBeEmpty: '表示するかどうかは空にできません',
-    weightCannotBeEmpty: '重みは空にできません',
-    pointsMallAdvertisementMapManagementXls: 'ポイントモール広告画像管理.xls',
-    categoryName: 'カテゴリ名',
-    sortByCategory: 'カテゴリ順序',
-    enableStatus: '有効ステータス',
-    pleaseInputCategoryName: 'カテゴリ名を入力してください',
-    pleaseInputCategorySorting: 'カテゴリ順序を入力してください',
-    categoryNameCannotBeEmpty: 'カテゴリ名は空にできません',
-    openStatusCannotBeEmpty: '開始ステータスは空にできません',
-    categoryNumber: 'カテゴリ番号',
-    pointsProductClassificationXls: 'ポイント商品分類.xls'
-  },
-  system: {
-    ipQuery: 'IPクエリ',
-    pleaseEnterIpAddress: 'IPアドレスを入力してください',
-    showIpQueryResults: 'IPクエリ結果を表示',
-    ipAddressCannotBeEmpty: 'IPアドレスは空にできません',
-    querySuccess: 'クエリ成功',
-    no: '番号',
-    placeName: '場所名',
-    superiorDepartment: '上位部門',
-    pleaseSelectTheParentDepartment: '親部門を選択してください',
-    departmentName: '部門名',
-    pleaseEnterADepartmentName: '部門名を入力してください',
-    departmentStatus: '部門ステータス',
-    pleaseSelectDepartmentStatus: '部門ステータスを選択してください',
-    displaySort: '表示順序',
-    personInCharge: '担当者',
-    pleaseEnterThePersonInCharge: '担当者を入力してください',
-    contactPhoneNumber: '連絡先電話番号',
-    pleaseInputTheContactPhoneNumber: '連絡先電話番号を入力してください',
-    mailbox: 'メールボックス',
-    pleaseInputMailbox: 'メールボックスを入力してください',
-    status: 'ステータス',
-    pleaseSelectStatus: 'ステータスを選択してください',
-    parentDepartmentCannotBeEmpty: '親部門は空にできません',
-    departmentNameCannotBeEmpty: '部門名は空にできません',
-    displayOrderCannotBeEmpty: '表示順序は空にできません',
-    statusCannotBeEmpty: 'ステータスは空にできません',
-    pleaseEnterTheCorrectEmailAddress: '正しいメールアドレスを入力してください',
-    pleaseEnterTheCorrectCellPhoneNumber: '正しい携帯電話番号を入力してください',
-    topDepartment: 'トップ部門',
-    expandCollapse: '展開/折りたたみ',
-    dictionaryType: '辞書タイプ',
-    dataLabel: 'データラベル',
-    dataKeyValue: 'データキー値',
-    colorType: '色タイプ',
-    pleaseEnterParameterName: 'パラメータ名を入力してください',
-    pleaseEnterDataLabel: 'データラベルを入力してください',
-    pleaseEnterDataKeyValue: 'データキー値を入力してください',
-    pleaseEnterCSSClass: 'CSSクラスを入力してください',
-    pleaseEnterContent: '内容を入力してください',
-    dataLabelCannotBeEmpty: 'データラベルは空にできません',
-    dataKeyValueCannotBeEmpty: 'データキー値は空にできません',
-    dataOrderCannotBeEmpty: 'データ順序は空にできません',
-    default: 'デフォルト',
-    primary: 'プライマリ',
-    success: '成功',
-    information: '情報',
-    warning: '警告',
-    danger: '危険',
-    dictionaryName: '辞書名',
-    dictionaryLabel: '辞書ラベル',
-    pleaseEnterDictionaryLabel: '辞書ラベルを入力してください',
-    dataStatus: 'データステータス',
-    dictionaryCode: '辞書コード',
-    dictionaryKeyValue: '辞書キー値',
-    dictionarySort: '辞書順序',
-    dictionaryDataXls: '辞書データ.xls',
-    pleaseEnterDictionaryName: '辞書名を入力してください',
-    dictionaryNameCannotBeEmpty: '辞書名は空にできません',
-    dictionaryTypeCannotBeEmpty: '辞書タイプは空にできません',
-    dictionaryNumber: '辞書番号',
-    pleaseEnterDictionaryType: '辞書タイプを入力してください',
-    pleaseSelectDictionaryStatus: '辞書ステータスを選択してください',
-    newAdd: '新規追加',
-    export: 'エクスポート',
-    data: 'データ',
-    dictionaryTypeXls: '辞書タイプ.xls',
-    userName: 'ユーザー名',
-    loginAddress: 'ログインアドレス',
-    loginDate: 'ログイン日付',
-    pleaseEnterUserName: 'ユーザー名を入力してください',
-    pleaseEnterLoginAddress: 'ログインアドレスを入力してください',
-    logNumber: 'ログ番号',
-    operationType: '操作タイプ',
-    browser: 'ブラウザ',
-    loginResult: 'ログイン結果',
-    details: '詳細',
-    loginLogxls: 'ログインログ.xls',
-    email: 'メール',
-    password: 'パスワード',
-    SMTPserverDomainName: 'SMTPサーバードメイン名',
-    SMTPserverPort: 'SMTPサーバーポート',
-    whetherToEnableSSL: 'SSLを有効にするかどうか',
-    whetherToEnableSTARTTLS: 'STARTTLSを有効にするかどうか',
-    creationTime: '作成時間',
-    operation: '操作',
-    number: '番号',
-    cache: 'キャッシュ',
-    noCache: 'キャッシュしない',
-    cacheStatus: 'キャッシュステータス',
-    always: '常に',
-    no1: 'いいえ',
-    cache1: '「keep-alive」キャッシュによってキャッシュされます。「コンポーネント名」フィールドを必ず入力してください',
-    cache2:
-      '「キャッシュしない」を選択した場合、メニューに子メニューが1つしかない場合、メニュー自体は表示されず、直接子メニューが表示されます',
-    cache3: '「非表示」を選択した場合、ルートにはアクセスできませんが、サイドバーには表示されます',
-    cache4: "Controllerメソッドの権限文字列、例:@PreAuthorize(`@ss.hasPermission('system:user:list')`)",
-    cache5: 'アクセスするルートアドレス、例:「user」。外部アドレスが必要な場合は、「http(s)://」で始まるアドレスを使用してください',
-    cache6: '例:SystemUser',
-    pushSucceeded: 'プッシュ成功',
-    isItNecessaryToPushTheSelectedNotification: '選択した通知をプッシュしますか?',
-    sendingTime: '送信時間',
-    receivingEmail: '受信メール',
-    userId: 'ユーザーID',
-    userType: 'ユーザータイプ',
-    emailTitle: 'メールタイトル',
-    emailContent: 'メール内容',
-    emailParameters: 'メールパラメータ',
-    sendingStatus: '送信ステータス',
-    emailAccount: 'メールアカウント',
-    sendingEmailAddress: '送信メールアドレス',
-    templateNumber: 'テンプレート番号',
-    templateCode: 'テンプレートコード',
-    templateSenderName: 'テンプレート送信者名',
-    sendingReturnedMessageNumber: '送信戻りメッセージ番号',
-    sendingException: '送信例外',
-    test: 'テスト',
-    templateContent: 'テンプレート内容',
-    recipientEmail: '受信メール',
-    enterRecipientEmail: '受信メールを入力',
-    pleaseEnter: '入力してください',
-    emailCannotBeEmpty: 'メールは空にできません',
-    templateNumberCannotBeEmpty: 'テンプレート番号は空にできません',
-    templateName: 'テンプレート名',
-    templateTitle: 'テンプレートタイトル',
-    senderName: '送信者名',
-    enableStatus: '有効ステータス',
-    remarks: '備考',
-    menuName: 'メニュー名(CN)',
-    menuNameEn: 'メニュー名(EN)',
-    menuNameJp: 'メニュー名',
-    pleaseEnterMenuName: 'メニュー名を入力してください',
-    pleaseSelectMenuStatus: 'メニューステータスを選択してください',
-    refreshMenuCache: 'メニューキャッシュを更新',
-    permissionIdentity: '権限識別子',
-    componentPath: 'コンポーネントパス',
-    componentName: 'コンポーネント名',
-    browserShow: 'ブラウザを更新してください!',
-    parentMenu: '親メニュー',
-    menuType: 'メニュータイプ',
-    menuIcon: 'メニューアイコン',
-    routeAddress: 'ルートアドレス',
-    componentAddress: 'コンポーネントアドレス',
-    menuStatus: 'メニューステータス',
-    displayStatus: '表示ステータス',
-    alwaysDisplay: '常に表示',
-    pleaseEnterRouteAddress: 'ルートアドレスを入力してください',
-    pleaseEnterPermissionIdentity: '権限識別子を入力してください',
-    menuNameCannotBeEmpty: 'メニュー名は空にできません',
-    menuOrderCannotBeEmpty: 'メニュー順序は空にできません',
-    routeAddressCannotBeEmpty: 'ルートアドレスは空にできません',
-    thePathMustStartWith: 'パスは「/」で始まる必要があります',
-    thePathCannotStartWith: 'パスは「/」で始まってはいけません',
-    mainCategory: 'メインカテゴリ',
-    announcementTitle: 'お知らせタイトル',
-    announcementStatus: 'お知らせステータス',
-    announcementNumber: 'お知らせ番号',
-    coverImage: '表紙画像',
-    announcementType: 'お知らせタイプ',
-    pleaseEnterAnnouncementTitle: 'お知らせタイトルを入力してください',
-    pleaseSelectAnnouncementStatus: 'お知らせステータスを選択してください',
-    push: 'プッシュ',
-    announcementContent: 'お知らせ内容',
-    pleaseSelectAnnouncementType: 'お知らせタイプを選択してください',
-    pleaseEnterRemarks: '備考を入力してください',
-    announcementTitleCannotBeEmpty: 'お知らせタイトルは空にできません',
-    coverImageCannotBeEmpty: '表紙画像は空にできません',
-    announcementTypeCannotBeEmpty: 'お知らせタイプは空にできません',
-    announcementContentCannotBeEmpty: 'お知らせ内容は空にできません',
-    templateType: 'テンプレートタイプ',
-    templateParameters: 'テンプレートパラメータ',
-    isRead: '既読かどうか',
-    readingTime: '読了時間',
-    pleaseEnterUserId: 'ユーザーIDを入力してください',
-    pleaseSelectUserType: 'ユーザータイプを選択してください',
-    pleaseEnterTemplateCode: 'テンプレートコードを入力してください',
-    pleaseSelectTemplateType: 'テンプレートタイプを選択してください',
-    markAsRead: '既読にする',
-    markAllAsRead: '全て既読にする',
-    sender: '送信者',
-    messageContent: 'メッセージ内容',
-    read: '既読',
-    messageDetails: 'メッセージ詳細',
-    pleaseEnterTemplateName: 'テンプレート名を入力してください',
-    pleaseSelectEnableStatus: '有効ステータスを選択してください',
-    pleaseEnterSenderName: '送信者名を入力してください',
-    pleaseEnterTemplateContent: 'テンプレート内容を入力してください',
-    messageTypeCannotBeEmpty: 'メッセージタイプは空にできません',
-    enableStatusCannotBeEmpty: '有効ステータスは空にできません',
-    templateCodeCannotBeEmpty: 'テンプレートコードは空にできません',
-    templateNameCannotBeEmpty: 'テンプレート名は空にできません',
-    senderNameCannotBeEmpty: '送信者名は空にできません',
-    templateContentCannotBeEmpty: 'テンプレート内容は空にできません',
-    additionSuccessful: '追加成功',
-    ModificationSuccessful: '修正成功',
-    recipientID: '受信者ID',
-    recipient: '受信者',
-    redirectableURIAddress: 'リダイレクト可能なURIアドレス',
-    pleaseEnterRedirectableURIAddress: 'リダイレクト可能なURIアドレスを入力してください',
-    pleaseSelectRecipient: '受信者を選択してください',
-    userIdCannotBeEmpty: 'ユーザーIDは空にできません',
-    submissionAndSendingWereSuccessfulTheSendingResultPleaseReferToTheSendingLogNumber:
-      '送信が成功しました!送信結果については、送信ログ番号を参照してください:',
-    clientNumber: 'クライアント番号',
-    clientSecretKey: 'クライアントシークレットキー',
-    appName: 'アプリ名',
-    appIcon: 'アプリアイコン',
-    appDescription: 'アプリ説明',
-    validityPeriodOfAccessToken: 'アクセストークンの有効期間',
-    validityPeriodOfRefreshToken: 'リフレッシュトークンの有効期間',
-    authorizationType: '認証タイプ',
-    authorizationScope: '認証範囲',
-    automaticAuthorizationScope: '自動認証範囲',
-    redirectable: 'リダイレクト可能',
-    permissions: '権限',
-    resources: 'リソース',
-    additionalInformation: '追加情報',
-    pleaseEnterClientNumber: 'クライアント番号を入力してください',
-    pleaseEnterClientSecretKey: 'クライアントシークレットキーを入力してください',
-    pleaseEnterAppName: 'アプリ名を入力してください',
-    unitSeconds: '単位:秒',
-    pleaseEnterAuthorizationType: '認証タイプを入力してください',
-    pleaseEnterAuthorizationScope: '認証範囲を入力してください',
-    pleaseEnterRedirectable: 'リダイレクト可能を入力してください',
-    pleaseEnterPermissions: '権限を入力してください',
-    pleaseEnterResources: 'リソースを入力してください',
-    pleaseEnterAdditionalInformationJSON: '追加情報をJSON形式で入力してください',
-    clientNumberCannotBeEmpty: 'クライアント番号は空にできません',
-    clientSecretKeyCannotBeEmpty: 'クライアントシークレットキーは空にできません',
-    appNameCannotBeEmpty: 'アプリ名は空にできません',
-    appIconCannotBeEmpty: 'アプリアイコンは空にできません',
-    validityPeriodOfAccessTokenCannotBeEmpty: 'アクセストークンの有効期間は空にできません',
-    validityPeriodOfRefreshTokenCannotBeEmpty: 'リフレッシュトークンの有効期間は空にできません',
-    redirectableURIAddressCannotBeEmpty: 'リダイレクト可能なURIアドレスは空にできません',
-    authorizationTypeCannotBeEmpty: '認証タイプは空にできません',
-    whetherToForceTheUserToLogOut: 'ユーザーを強制ログアウトしますか?',
-    forceLogout: '強制ログアウト',
-    clientId: 'クライアントID',
-    accessToken: 'アクセストークン',
-    refreshToken: 'リフレッシュトークン',
-    expirationTime: '有効期限',
-    pleaseEnterClientId: 'クライアントIDを入力してください',
-    operator: '操作者',
-    operationModule: '操作モジュール',
-    operationContent: '操作内容',
-    operationTime: '操作時間',
-    businessNumber: 'ビジネス番号',
-    operatorLogXls: '操作者ログ.xls',
-    operationName: '操作名',
-    IP: 'IP',
-    pleaseEnterOperator: '操作者を入力してください',
-    pleaseEnterOperationModule: '操作モジュールを入力してください',
-    pleaseEnterOperationName: '操作名を入力してください',
-    pleaseEnterBusinessNumber: 'ビジネス番号を入力してください',
-    logPrimaryKey: 'ログ主キー',
-    linkTracing: 'リンクトレーシング',
-    operatorId: '操作者ID',
-    operatorName: '操作者名',
-    operatorIP: '操作者IP',
-    operatorUA: '操作者UA',
-    operationExtendedParameters: '操作拡張パラメータ',
-    requestURL: 'リクエストURL',
-    positionName: '役職名',
-    positionCode: '役職コード',
-    positionNumber: '役職番号',
-    positionOrder: '役職順序',
-    positionRemarks: '役職備考',
-    pleaseEnterPositionName: '役職名を入力してください',
-    pleaseEnterPositionCode: '役職コードを入力してください',
-    positionListXls: '役職リスト.xls',
-    positionTitle: '役職タイトル',
-    pleaseEnterPositionTitle: '役職タイトルを入力してください',
-    pleaseEnterPositionOrder: '役職順序を入力してください',
-    positionTitleCannotBeEmpty: '役職タイトルは空にできません',
-    positionCodeCannotBeEmpty: '役職コードは空にできません',
-    positionStatusCannotBeEmpty: '役職ステータスは空にできません',
-    positionContentCannotBeEmpty: '役職内容は空にできません',
-    roleName: 'ロール名',
-    roleIdentity: 'ロール識別子',
-    roleNumber: 'ロール番号',
-    roleType: 'ロールタイプ',
-    displayOrder: '表示順序',
-    pleaseEnterRoleName: 'ロール名を入力してください',
-    pleaseEnterRoleIdentity: 'ロール識別子を入力してください',
-    menuPermissions: 'メニュー権限',
-    dataPermissions: 'データ権限',
-    selectAllDeselectAll: '全選択/全解除:',
-    expandAllCollapseAll: '全て展開/折りたたみ:',
-    permissionScope: '権限範囲',
-    pleaseEnterDisplayOrder: '表示順序を入力してください',
-    roleNameCannotBeEmpty: 'ロール名は空にできません',
-    roleIdentityCannotBeEmpty: 'ロール識別子は空にできません',
-    remarksCannotBeEmpty: '備考は空にできません',
-    roleListXls: 'ロールリスト.xls',
-    parentChildLinkage: '親子連動(親ノードを選択すると、子ノードも自動選択されます):',
-    loadingPleaseWaitAMoment: '読み込み中、しばらくお待ちください',
-    pleaseSelectChannelCode: 'チャネルコードを選択してください',
-    smsSignatureCannotBeEmpty: 'SMS署名は空にできません',
-    channelCodeCannotBeEmpty: 'チャネルコードは空にできません',
-    theAccountOfSmsAPI: 'SMS APIのアカウント',
-    theSecretKeyOfSmsAPI: 'SMS APIのシークレットキー',
-    smsSendingCallbackURL: 'SMS送信コールバックURL',
-    pleaseEnterTheAccountOfSmsAPI: 'SMS APIのアカウントを入力してください',
-    pleaseEnterTheSecretKeyOfSmsAPI: 'SMS APIのシークレットキーを入力してください',
-    pleaseEnterSmsSendingCallbackURL: 'SMS送信コールバックURLを入力してください',
-    smsLogXls: 'SMSログ.xls',
-    smsSignature: 'SMS署名',
-    channelCode: 'チャネルコード',
-    smsSendingCallback: 'SMS送信コールバック',
-    pleaseEnterSmsSignature: 'SMS署名を入力してください',
-    phoneNumber: '電話番号',
-    smsChannel: 'SMSチャネル',
-    receivingStatus: '受信ステータス',
-    receivingTime: '受信時間',
-    smsContent: 'SMS内容',
-    templateNumberOfSmsAPI: 'SMS APIのテンプレート番号',
-    pleaseEnterTemplateNumberOfSmsAPI: 'SMS APIのテンプレート番号を入力してください',
-    smsTemplateXls: 'SMSテンプレート.xls',
-    smsType: 'SMSタイプ',
-    pleaseEnterPhoneNumber: '電話番号を入力してください',
-    pleaseSelectSmsChannel: 'SMSチャネルを選択してください',
-    pleaseEnterTemplateNumber: 'テンプレート番号を入力してください',
-    pleaseSelectSendingStatus: '送信ステータスを選択してください',
-    pleaseSelectReceivingStatus: '受信ステータスを選択してください',
-    smsTemplate: 'SMSテンプレート',
-    templateNumberOfAPI: 'APIのテンプレート番号',
-    userInformation: 'ユーザー情報',
-    smsParameters: 'SMSパラメータ',
-    APIsmsResult: 'API送信結果',
-    APIsmsNumber: 'API SMS番号',
-    APIreceivingStatus: 'API受信ステータス',
-    APIreceivingResult: 'API受信結果',
-    smsChannelNumber: 'SMSチャネル番号',
-    smsAPITemplateNumber: 'SMS APIテンプレート番号',
-    pleaseSelectSmsChannelNumber: 'SMSチャネル番号を選択してください',
-    pleaseSelectSmsType: 'SMSタイプを選択してください',
-    pleaseEnterTheTemplateNumberOfTheSmsAPI: 'SMS APIのテンプレート番号を入力してください',
-    phoneNumberCannotBeEmpty: '電話番号は空にできません',
-    smsTypeCannotBeEmpty: 'SMSタイプは空にできません',
-    theTemplateNumberOfTheSmsAPICannotBeEmpty: 'SMS APIのテンプレート番号は空にできません',
-    smsChannelNumberCannotBeEmpty: 'SMSチャネル番号は空にできません',
-    submitTips: '送信が成功しました!送信結果については、送信ログ番号を参照してください:',
-    pleaseSelectSocialPlatform: 'ソーシャルプラットフォームを選択してください',
-    pleaseEnterClientNumberTips: 'クライアント番号を入力してください。各プラットフォームのappKeyに対応します',
-    pleaseEnterClientSecretKeyTips: 'クライアントシークレットキーを入力してください。各プラットフォームのappSecretに対応します',
-    authorizedPartyWebApplicationId: '認証されたWebアプリケーションID。ある場合は入力してください',
-    socialPlatformCannotBeEmpty: 'ソーシャルプラットフォームは空にできません',
-    userTypeCannotBeEmpty: 'ユーザータイプは空にできません',
-    socialOpenid: 'ソーシャルopenid',
-    pleaseEnterSocialOpenid: 'ソーシャルopenidを入力してください',
-    social: 'ソーシャル',
-    updateTime: '更新時間',
-    socialPlatform: 'ソーシャルプラットフォーム',
-    userAvatar: 'ユーザーアバター',
-    socialToken: 'ソーシャルトークン',
-    originalTokenData: 'オリジナルトークンデータ',
-    originalUserData: 'オリジナルユーザーデータ',
-    lastAuthenticationCode: '最後の認証コード',
-    lastAuthenticationState: '最後の認証状態',
-    tenantName: 'テナント名',
-    contactPerson: '担当者',
-    tenantStatus: 'テナントステータス',
-    tenantId: 'テナントID',
-    tenantPackage: 'テナントパッケージ',
-    accountQuota: 'アカウントクォータ',
-    boundDomainName: 'バインドドメイン名',
-    pleaseEnterTenantName: 'テナント名を入力してください',
-    pleaseEnterContactPerson: '担当者を入力してください',
-    pleaseEnterContactPhoneNumber: '連絡先電話番号を入力してください',
-    pleaseSelectTenantStatus: 'テナントステータスを選択してください',
-    systemTenant: 'システムテナント',
-    tenantListXls: 'テナントリスト.xls',
-    tenantNameCannotBeEmpty: 'テナント名は空にできません',
-    tenantPackageCannotBeEmpty: 'テナントパッケージは空にできません',
-    contactPersonCannotBeEmpty: '担当者は空にできません',
-    tenantStatusCannotBeEmpty: 'テナントステータスは空にできません',
-    accountQuotaCannotBeEmpty: 'アカウントクォータは空にできません',
-    expirationTimeCannotBeEmpty: '有効期限は空にできません',
-    boundDomainNameCannotBeEmpty: 'バインドドメイン名は空にできません',
-    userNameCannotBeEmpty: 'ユーザー名は空にできません',
-    userPasswordCannotBeEmpty: 'ユーザーパスワードは空にできません',
-    userPassword: 'ユーザーパスワード',
-    pleaseSelectTenantPackage: 'テナントパッケージを選択してください',
-    loadingPleaseWaitAWhile: '読み込み中、しばらくお待ちください',
-    packageNameCannotBeEmpty: 'パッケージ名は空にできません',
-    associatedMenuNumberCannotBeEmpty: '関連メニュー番号は空にできません',
-    pleaseEnterUserPassword: 'ユーザーパスワードを入力してください',
-    pleaseEnterAccountQuota: 'アカウントクォータを入力してください',
-    pleaseSelectExpirationTime: '有効期限を選択してください',
-    pleaseEnterBoundDomainName: 'バインドドメイン名を入力してください',
-    packageName: 'パッケージ名',
-    packageNumber: 'パッケージ番号',
-    pleaseEnterPackageName: 'パッケージ名を入力してください',
-    menuPermission: 'メニュー権限',
-    department: '部門',
-    userStatus: 'ユーザーステータス',
-    userDataXls: 'ユーザーデータ.xls',
-    assignRole: 'ロールを割り当てる',
-    role: 'ロール',
-    pleaseSelectRole: 'ロールを選択してください',
-    affiliatedDepartment: '所属部門',
-    userGender: 'ユーザー性別',
-    position: '役職',
-    pleaseSelectAffiliatedDepartment: '所属部門を選択してください',
-    pleaseEnterEmail: 'メールを入力してください',
-    userNicknameCannotBeEmpty: 'ユーザーニックネームは空にできません',
-    pleaseEnterTheCorrectPhoneNumber: '正しい電話番号を入力してください',
-    modificationSucceededTheNewPasswordIs: '修正成功、新しいパスワードは:',
-    userImport: 'ユーザーインポート',
-    dragTheFileHereOr: 'ファイルをここにドラッグするか、',
-    clickToUpload: 'クリックしてアップロード',
-    whetherToUpdateExistingUserData: '既存のユーザーデータを更新しますか?',
-    onlyFilesInXlsAndXlsxFormatsAreAllowedForImport: 'インポートできるのはxls、xlsx形式のファイルのみです。',
-    downloadTemplate: 'テンプレートをダウンロード',
-    uploadFailedPleaseUploadAgain: 'アップロードに失敗しました。再度アップロードしてください!',
-    atMostOnlyOneFileCanBeUploaded: '最大1ファイルのみアップロード可能です!',
-    userImportTemplateXls: 'ユーザーインポートテンプレート.xls',
-    numberOfSuccessfulUploads: 'アップロード成功数:',
-    numberOfFailedUploads: 'アップロード失敗数:',
-    numberOfFailedUpdates: '更新失敗数:',
-    pleaseUploadTheFile: 'ファイルをアップロードしてください',
-    allHaveBeenMarkedAsReadSuccessfully: '全て既読に成功しました!',
-    batchMarkingAsReadWasSuccessful: '一括既読に成功しました!',
-    testSending: 'テスト送信'
-  },
-  public: {
-    all: '全て',
-    sort: '並び替え',
-    operate: '操作',
-    status: 'ステータス',
-    startDate: '開始日付',
-    endDate: '終了日付',
-    delete: '削除',
-    createTime: '作成時間',
-    update: '更新',
-    none: 'なし',
-    close: '閉じる',
-    normal: '正常',
-    addTime: '追加時間',
-    no: 'いいえ',
-    yes: 'はい',
-    more: 'もっと見る',
-    startTime: '開始時間',
-    endTime: '終了時間',
-    up: '上架',
-    down: '下架',
-    enable: '有効',
-    disable: '無効',
-    remark: '備考',
-    pleaseEnterNotes: '備考を入力してください',
-    expand: '展開',
-    collapse: '折りたたみ',
-    second: '秒'
-  },
-  // 残りのセクションも同様に翻訳...
-  'OAuth 2.0': 'OAuth 2.0'
-}

+ 15 - 1961
src/locales/zh-CN.ts

@@ -4,7 +4,7 @@ export default {
     selectText: '请选择',
     startTimeText: '开始时间',
     endTimeText: '结束时间',
-    login: 'ログイン',
+    login: '登录',
     required: '该项为必填项',
     loginOut: '退出系统',
     document: '项目文档',
@@ -54,41 +54,7 @@ export default {
     updateTime: '更新时间',
     copy: '复制',
     copySuccess: '复制成功',
-    copyError: '复制失败',
-    search: '搜索',
-    detail: '详情',
-    add: '新增',
-    yes: '是',
-    no: '否',
-    selectShop: '选择店铺',
-    enterProductName: '请输入商品名称',
-    selectCategory: '选择商品分类',
-    enterKeyword: '请输入关键字',
-    enterUnitName: '请输入单位名',
-    enterPrice: '请输入商品价格',
-    enterMarketPrice: '请输入市场价',
-    enterStock: '请输入库存',
-    enterProductDescription: '请输入商品简介',
-    enterPoints: '请输入获得积分',
-    addBasicInfo: '请添加基本信息',
-    selectAttribute: '请选择属性',
-    addCompleteSpec: '请添加完整的规格!',
-    addAttribute: '请添加属性!',
-    addSpec: '请添加规格',
-    confirm: '确认',
-    delete: '删除',
-    nextStep: '下一步',
-    previousStep: '上一步',
-    uploadImage: '上传图片',
-    addNewSpec: '添加新规格',
-    generateNow: '立即生成',
-    selectShopFirst: '请先选择店铺',
-    selectCategoryFirst: '请先选择分类',
-    selectSpec: '选择规格',
-    enterSpecName: '请输入规格',
-    enterSpecValue: '请输入规格值',
-    selectFreightTemplate: '选择运费模板',
-    enterFreight: '请输入邮费'
+    copyError: '复制失败'
   },
   lock: {
     lockScreen: '锁定屏幕',
@@ -147,19 +113,18 @@ export default {
     small: '小'
   },
   login: {
-    welcome: 'Tabemate Pro  オーダーシステムへようこそ',
-    message: 'Tabemate Pro  オーダーシステム',
+    welcome: '欢迎使用yshop意象点餐系统',
+    message: '欢迎使用yshop意象点餐系统',
     tenantname: '租户名称',
     username: '用户名',
     password: '密码',
-    userType: '类型',
     code: '验证码',
-    login: 'ログイン',
+    login: '登录',
     relogin: '重新登录',
     otherLogin: '其他登录方式',
     register: '注册',
     checkPassword: '确认密码',
-    remember: 'ログイン状態を保持',
+    remember: '记住我',
     hasUser: '已有账号?去登录',
     forgetPassword: '忘记密码?',
     tenantNamePlaceholder: '请输入租户名称',
@@ -175,16 +140,7 @@ export default {
     btnQRCode: '二维码登录',
     qrcode: '扫描二维码登录',
     btnRegister: '注册',
-    SmsSendMsg: '验证码已发送',
-    loadingSystem: '正在加载系统中...',
-    YSHOPSourceCode: 'YSHOP源码',
-    retrievableAfterSeconds: '秒后可重新获取',
-    thisThirdPartyApplicationRequestsTheFollowingPermissions: '此第三方应用请求获得以下权限',
-    agreeToAuthorization: '同意授权',
-    authorizationIn: '授 权 中...',
-    rejection: '拒绝',
-    accessYourPersonalInformation: '访问你的个人信息',
-    modifyYourPersonalInformation: '修改你的个人信息'
+    SmsSendMsg: '验证码已发送'
   },
   captcha: {
     verification: '请完成安全验证',
@@ -354,6 +310,7 @@ export default {
     del: '删除',
     delete: '删除',
     edit: '编辑',
+    update: '编辑',
     preview: '预览',
     more: '更多',
     sync: '同步',
@@ -367,8 +324,7 @@ export default {
     typeCreate: '字典类型新增',
     typeUpdate: '字典类型编辑',
     dataCreate: '字典数据新增',
-    dataUpdate: '字典数据编辑',
-    update: '更新'
+    dataUpdate: '字典数据编辑'
   },
   dialog: {
     dialog: '弹窗',
@@ -422,12 +378,12 @@ export default {
     },
     login: {
       backSignIn: '返回',
-      signInFormTitle: 'ログイン',
+      signInFormTitle: '登录',
       ssoFormTitle: '三方授权',
       mobileSignInFormTitle: '手机登录',
       qrSignInFormTitle: '二维码登录',
       signUpFormTitle: '注册',
-      forgetFormTitle: '找回密码',
+      forgetFormTitle: '重置密码',
       signInTitle: '开箱即用的中后台管理系统',
       signInDesc: '输入您的个人详细信息开始使用!',
       policy: '我同意xxx隐私政策',
@@ -437,8 +393,10 @@ export default {
       rememberMe: '记住我',
       forgetPassword: '忘记密码?',
       otherSignIn: '其他登录方式',
+      // notify
       loginSuccessTitle: '登录成功',
       loginSuccessDesc: '欢迎回来',
+      // placeholder
       accountPlaceholder: '请输入账号',
       passwordPlaceholder: '请输入密码',
       smsPlaceholder: '请输入验证码',
@@ -490,15 +448,7 @@ export default {
       cfPwdMsg: '请输入确认密码',
       pwdRules: '长度在 6 到 20 个字符',
       diffPwd: '两次输入密码不一致'
-    },
-    serialNumber: '序号',
-    socialPlatform: '社交平台',
-    bound: '已绑定',
-    unbound: '未绑定',
-    unbound1: '(解绑)',
-    bound1: '(绑定)',
-    boundSuccessfully: '绑定成功',
-    unboundSuccessfully: '解绑成功'
+    }
   },
   cropper: {
     selectImage: '选择图片',
@@ -514,1901 +464,5 @@ export default {
     btn_zoom_out: '缩小',
     preview: '预览'
   },
-  work: {
-    selectStore: '选择门店',
-    orderReminderOn: '订单提醒开启中',
-    orderReminderOff: '订单提醒关闭中',
-    recentOrders: '最近订单',
-    orderId: '订单号',
-    takeout: '外卖',
-    contactNumber: '联系电话',
-    pickUp: '自取',
-    pickUpNumber: '取餐号',
-    dineIn: '堂食',
-    tableNumber: '桌号',
-    numberPeople: '人数',
-    multipleDishesPleaseCheckDetails: '多份菜品,请查看详情',
-    order: '出单',
-    orderTime: '下单时间',
-    noOrderData: '暂无订单数据',
-    newOrderNotification: '新订单通知',
-    youHaveNewOrderPleaseCheckOut: '你有个新的订单哦,请注意查看!'
-  },
-  home: {
-    totalMembers: '会员总数',
-    allStores: '全门店',
-    todayOrderCount: '今日订单数',
-    orders: '单',
-    totalOrderCount: '订单总数',
-    yesterdaysOrderCount: '昨日订单数',
-    totalAmount: '总金额',
-    last7DaysOrderCount: '近七天订单数',
-    totalProductCount: '商品总数',
-    thisMonthOrderCount: '本月订单数',
-    productSalesRanking: '商品销售排行',
-    userSpendingRankingAllStores: '用户消费排行(全门店)',
-    currentStore: '当前门店',
-    productName: '商品名称',
-    salesVolume: '销量',
-    consumptionAmount: '消费金额',
-    productManagement: '商品管理',
-    memberManagement: '会员管理',
-    orderManagement: '订单管理',
-    couponManagement: '优惠券管理',
-    printerManagement: '打印机管理',
-    storeManagement: '门店管理',
-    paymentManagement: '支付管理',
-    messageManagement: '消息管理'
-  },
-  product: {
-    cost: '成本价',
-    barCode: '商品编号',
-    weight: '重量(KG)',
-    volume: '体积(m³)',
-    productName: '商品名称',
-    enterProductName: '请输入商品名称',
-    shopName: '店铺名称',
-    enterShopName: '请输入店铺名称',
-    productImage: '商品图片',
-    productPrice: '商品价格',
-    sales: '销量',
-    stock: '库存',
-    status: '状态',
-    onSale: '已上架',
-    offSale: '已下架',
-    addTime: '添加时间',
-    actions: '操作',
-    edit: '编辑',
-    delete: '删除',
-    onSaleProducts: '出售中产品',
-    pendingProducts: '待上架产品',
-    soldOutProducts: '已售罄产品',
-    confirmSale: '确定要上下架?',
-    operationSuccess: '操作成功',
-    displayShop: '展示店铺',
-    productCategory: '商品分类',
-    keyword: '关键字',
-    unitName: '单位名',
-    marketPrice: '市场价',
-    coverImage: '封面图',
-    sliderImage: '轮播图',
-    productStatus: '商品状态',
-    productDescription: '商品简介',
-    productSpec: '商品规格',
-    singleSpec: '单规格',
-    multipleSpec: '多规格',
-    selectSpec: '选择规格',
-    productAttributes: '商品属性',
-    productDetails: '商品详情',
-    marketingSettings: '营销设置',
-    getPoints: '获得积分',
-    basicInfo: '基本信息',
-    specSettings: '规格设置',
-    logisticsSettings: '物流设置',
-    freightSettings: '运费设置',
-    postage: '邮费',
-    freightTemplate: '运费模板',
-    newProduct: '是否新品',
-    yes: '是',
-    no: '否'
-  },
-  express: {
-    courierCompanyNumber: '快递公司编号',
-    pleaseEnterTheCourierCompanyNumber: '请输入快递公司编号',
-    fullNameOfCourierCompany: '快递公司全称',
-    pleaseEnterTheFullNameOfCourierCompany: '请输入快递公司全称',
-    sort: '排序',
-    pleaseEnterTheSort: '请输入排序',
-    theAbbreviationCourierCompanyEmpty: '快递公司简称不能为空',
-    fullNameCourierCompanyEmpty: '快递公司全称不能为空',
-    sortCannotEmpty: '排序不能为空',
-    pleaseEnterTheCourierBirdAppId: '请输入快递鸟appId',
-    pleaseEnterTheCourierBirdAppKey: '请输入快递鸟appKey',
-    isPaidPackage: '是否收费套餐',
-    theThirdPartyTips: 'yshop-pro系统使用的第三方快递鸟api实现了快递查询,注册地址请点击,',
-    iRegister: '我注册!',
-    courierBirdAppIdCannotBeEmpty: '快递鸟appId不能为空',
-    courierBirdAppKeyCannotBeEmpty: '快递鸟appKey不能为空',
-    ompanyCode: '公司编码',
-    pleaseEnterTheCourierCompanyCode: '请输入快递公司编码',
-    companyFullName: '公司全称',
-    pleaseEnterTheCourierCompanyFullName: '请输入快递公司全称',
-    courierCompanyCode: '快递公司编码',
-    courierCompanyFullName: '快递公司全称',
-    addTime: '添加时间',
-    courierCompanyXls: '快递公司.xls'
-  },
-  infra: {
-    logPrimaryKey: '日志主键',
-    linkTrace: '链路追踪',
-    applicationName: '应用名',
-    userInformation: '用户信息',
-    userIp: '用户 IP',
-    userUa: '用户 UA',
-    requestInformation: '请求信息',
-    requestParameters: '请求参数',
-    requestResult: '请求结果',
-    requestTime: '请求时间',
-    requestTimeConsumption: '请求耗时',
-    operationResult: '操作结果',
-    normal: '正常',
-    failed: '失败',
-    operationModule: '操作模块',
-    operationName: '操作名',
-    userId: '用户编号',
-    pleaseEnterTheUserNumber: '请输入用户编号',
-    userType: '用户类型',
-    pleaseSelectUserType: '请选择用户类型',
-    pleaseEnterTheApplicationName: '请输入应用名',
-    pleaseEnterTheExecutionTime: '请输入执行时长',
-    resultCode: '结果码',
-    pleaseEnterTheResultCode: '请输入结果码',
-    logNumber: '日志编号',
-    requestMethod: '请求方法',
-    requestAddress: '请求地址',
-    successful: '成功',
-    failure: '失败',
-    operationType: '操作类型',
-    detailed: '详细',
-    operate: '操作',
-    aPIAccessLogs_xls: 'API 访问日志.xls',
-    exceptionTime: '异常时间',
-    exceptionName: '异常名',
-    exceptionStack: '异常堆栈',
-    handlingStatus: '处理状态',
-    handler: '处理人',
-    handlingTime: '处理时间',
-    pleaseSelectTheProcessingStatus: '请选择处理状态',
-    timeOfException: '异常发生时间',
-    handled: '已处理',
-    ignored: '已忽略',
-    confirmationFlaggedAs: '确认标记为',
-    exceptionLogXls: '异常日志.xls',
-    generateJSON: '生成 JSON',
-    generateOptions: '生成 Options',
-    generateComponents: '生成组件',
-    numberOfExecutions: '第几次执行',
-    executionTime: '执行时间',
-    executionDuration: '执行时长',
-    executionResult: '执行结果',
-    successfulExecution: '执行成功',
-    confirmThatYouWantToExecuteOnceImmediately: '确认要立即执行一次',
-    open: '开启',
-    close: '关闭',
-    pause: '暂停',
-    confirmTo: '确认要',
-    timingTaskNumber: '定时任务编号为',
-    ofTheDataItem: '的数据项',
-    timedTaskExecutionLogXls: '定时任务执行日志.xls',
-    firstExecution: '第几次执行',
-    startExecutionTime: '开始执行时间',
-    endExecutionTime: '结束执行时间',
-    selectTheStartExecutionTime: '选择开始执行时间',
-    selectTheEndExecutionTime: '选择结束执行时间',
-    executeOnce: '执行一次',
-    taskDetails: '任务详细',
-    schedulingLog: '调度日志',
-    modify: '修改',
-    taskNumber: '任务编号',
-    taskName: '任务名称',
-    taskStatus: '任务状态',
-    processorName: '处理器的名字',
-    parametersOfTheProcessor: '处理器的参数',
-    executionLog: '执行日志',
-    pleaseEnterTheNameOfTheProcessor: '请输入处理器的名字',
-    pleaseSelectTheTaskStatus: '请选择任务状态',
-    pleaseEnterTheTaskName: '请输入任务名称',
-    milliseconds: '毫秒',
-    notOpened: '未开启',
-    cron: 'Cron 表达式',
-    numberOfRetries: '重试次数',
-    retryInterval: '重试间隔',
-    monitorTimeout: '监控超时时间',
-    subsequentExecutionTime: '后续执行时间',
-    pleaseEnterATaskName: '请输入任务名称',
-    pleaseEnterTheParametersOfTheProcessor: '请输入处理器的参数',
-    pleaseEnterTheNumberOfRetriesWhenSetTo0NoRetriesArePerformed: '请输入重试次数。设置为 0 时,不进行重试',
-    pleaseEnterTheRetryIntervalInMillisecondsWhenSetTo0NoIntervalIsRequired: '请输入重试间隔,单位:毫秒。设置为 0 时,无需间隔',
-    pleaseEnterTheMonitoringTimeoutInMilliseconds: '请输入监控超时时间,单位:毫秒',
-    cronExpression: 'CRON 表达式',
-    taskNameCannotBeNull: '任务名称不能为空',
-    processorNameCannotBeNull: '处理器的名字不能为空',
-    cronExpressionCannotBeNull: 'CRON 表达式不能为空',
-    retryCountCannotBeNull: '重试次数不能为空',
-    retryIntervalCannotBeNull: '重试间隔不能为空',
-    basicInformation: '基本信息',
-    modeOfOperation: '运行模式',
-    standalone: '单机',
-    cluster: '集群',
-    redisVersion: 'Redis版本 :',
-    runtimeMode: '运行模式 :',
-    ports: '端口 :',
-    numberOfClients: '客户端数 :',
-    runtimeDays: '运行时间(天) :',
-    memoryUsed: '使用内存 :',
-    cpuUsed: '使用CPU :',
-    memoryConfiguration: '内存配置 :',
-    whetherAOFIsEnabledOrNot: 'AOF是否开启 :',
-    whetherRDBSuccessfulOrNot: 'RDB是否成功 :',
-    numberOfKeys: 'Key数量 :',
-    networkIngressEgress: '网络入口/出口 :',
-    memoryUsage: '内存使用情况',
-    peak: '峰值',
-    commandStatistics: '命令统计',
-    commands: '命令',
-    memoryConsumption: '内存消耗',
-    anExceptionOccurredInProcessingTheMessage: '处理消息发生异常:',
-    messageNotProcessed: '未处理消息:',
-    systemNotification: '【系统通知】:',
-    groupSendingUserNumber: '【群发】用户编号',
-    groupNoticUserCode: '【群发】用户编号',
-    unknownMessageType: '未知的消息类型:',
-    messageReceived: '收到消息',
-    messageRecord: '消息记录',
-    sent: '发送',
-    allPeople: '所有人',
-    pleaseSelectSender: '请选择发送人',
-    closeConnection: '关闭连接',
-    openConnection: '开启连接',
-    serviceAddress: '服务地址',
-    connectionStatus: '连接状态',
-    connection: '连接',
-    messageInputBox: '消息输入框',
-    pleaseEnterMessageSend: '请输入你要发送的消息',
-    theTestPassedAndTheFileWasUploadedSuccessfullyAccessAddress: '测试通过,上传文件成功!访问地址:',
-    isItConfirmedToModifyTheConfigurationNumberOfTheDataItemIsTheMainConfiguration: '是否确认修改配置编号为',
-    theDataItemsInTheMainConfigurationOfThe: '的数据项为主配置?',
-    test: '测试',
-    masterConfiguration: '主配置',
-    no: '编号',
-    remarks: '备注',
-    configurationName: '配置名',
-    memory: '存储器',
-    pleaseEnterTheConfigurationName: '请输入配置名',
-    pleaseSelectMemory: '请选择存储器',
-    configurationNameCannotBeEmpty: '配置名不能为空',
-    memoryCannotBeEmpty: '存储器不能为空',
-    basePathCannotBeEmpty: '基础路径不能为空',
-    hostAddressCannotBeEmpty: '主机地址不能为空',
-    hostPortCannotBeEmpty: '主机端口不能为空',
-    userNameCannotBeEmpty: '用户名不能为空',
-    passwordCannotBeEmpty: '密码不能为空',
-    connectionModeCannotBeEmpty: '连接模式不能为空',
-    nodeAddressCannotBeEmpty: '节点地址不能为空',
-    storageBucketCannotBeEmpty: '存储 bucket 不能为空',
-    accessKeyCannotBeEmpty: 'accessKey 不能为空',
-    accessSecretCannotBeNull: 'accessSecret 不能为空',
-    storage: '存储',
-    customizedDomainNameCannotBeEmpty: '自定义域名不能为空',
-    basePath: '基础路径',
-    hostAddress: '主机地址',
-    hostPort: '主机端口',
-    userName: '用户名',
-    password: '密码',
-    connectionMode: '连接模式',
-    nodeAddress: '节点地址',
-    storageBucket: '存储 bucket',
-    customizedDomainName: '自定义域名',
-    pleaseEnterAConfigurationName: '请输入配置名',
-    pleaseEnterNotes: '请输入备注',
-    pleaseSelectStorage: '请选择存储器',
-    pleaseEnterTheBasePath: '请输入基础路径',
-    pleaseEnterTheHostAddress: '请输入主机地址',
-    pleaseEnterTheHostPort: '请输入主机端口',
-    pleaseEnterAPassword: '请输入密码',
-    pleaseEnterTheNodeAddress: '请输入节点地址',
-    pleaseEnterBucket: '请输入 bucket',
-    pleaseEnterACustomizedDomainName: '请输入自定义域名',
-    pleaseEnterACustomDomainName: '请输入自定义域名',
-    activeMode: '主动模式',
-    passiveMode: '被动模式',
-    pleaseEnterAccessKey: '请输入 accessKey',
-    pleaseEnterAccessSecret: '请输入 accessSecret',
-    pleaseEnterTheFilePath: '请输入文件路径',
-    pleaseEnterTheFileType: '请输入文件类型',
-    fileName: '文件名',
-    filePath: '文件路径',
-    fileSize: '文件大小',
-    fileType: '文件类型',
-    fileContent: '文件内容',
-    preview: '预览',
-    download: '下载',
-    uploadTime: '上传时间',
-    uploadFile: '上传文件',
-    dragTheFileHereOr: '将文件拖到此处,或',
-    clickUpload: '点击上传',
-    tipOnlyJpgPngGifFormatsAreAllowedToBeImported: '提示:仅允许导入 jpg、png、gif 格式文件!',
-    pleaseUploadTheFile: '请上传文件',
-    uploadFailedPleaseReUpload: '上传失败,请您重新上传!',
-    youCanOnlyUploadAMaximumOfOneFile: '最多只能上传一个文件!',
-    dataSourceName: '数据源名称',
-    dataSourceConnection: '数据源连接',
-    pleaseEnterAParameterName: '请输入参数名称',
-    pleaseEnterTheDataSourceConnection: '请输入数据源连接',
-    pleaseEnterAUserName: '请输入用户名',
-    dataSourceNameCannotBeEmpty: '数据源名称不能为空',
-    dataSourceConnectionCannotBeEmpty: '数据源连接不能为空',
-    primaryKeyNumber: '主键编号',
-    parameterConfigurationXls: '参数配置.xls',
-    parameterPrimaryKey: '参数主键',
-    parameterCategory: '参数分类',
-    parameterKeyName: '参数键名',
-    parameterKeyValue: '参数键值',
-    visibleOrNot: '是否可见',
-    parameterName: '参数名称',
-    builtInSystem: '系统内置',
-    pleaseEnterTheParameterName: '请输入参数名称',
-    pleaseEnterTheParameterKeyName: '请输入参数键名',
-    pleaseSelectSystemBuiltIn: '请选择系统内置',
-    pleaseEnterAParameterCategory: '请输入参数分类',
-    pleaseInputParameterName: '请输入参数名称',
-    pleaseInputParameterKeyName: '请输入参数键名',
-    pleaseEnterTheParameterKeyValue: '请输入参数键值',
-    pleaseEnterTheContent: '请输入内容',
-    parameterCategoryCannotBeEmpty: '参数分类不能为空',
-    parameterNameCannotBeEmpty: '参数名称不能为空',
-    parameterKeyNameCannotBeNull: '参数键名不能为空',
-    parameterKeyValueCannotBeNull: '参数键值不能为空',
-    visibleOrInvisibleCannotBeNull: '是否可见不能为空',
-    tableName: '表名称',
-    tableDescription: '表描述',
-    pleaseEnterAWarehouseName: '请输入仓库名称',
-    pleaseEnter: '请输入',
-    entityClassName: '实体类名称',
-    infraTips: '默认去除表名的前缀。如果存在重复,则需要手动添加前缀,避免 MyBatis 报 Alias 重复的问题。',
-    author: '作者',
-    fieldColumnName: '字段列名',
-    fieldDescription: '字段描述',
-    physicalType: '物理类型',
-    javaType: 'Java类型',
-    javaAttributes: 'java属性',
-    insert: '插入',
-    edit: '编辑',
-    list: '列表',
-    query: '查询',
-    queryMethod: '查询方式',
-    allowNull: '允许空',
-    displayType: '显示类型',
-    textBox: '文本框',
-    textField: '文本域',
-    dropdownBox: '下拉框',
-    radioBox: '单选框',
-    checkbox: '复选框',
-    dateControl: '日期控件',
-    imageUpload: '图片上传',
-    fileUpload: '文件上传',
-    richTextControls: '富文本控件',
-    dictionaryTypes: '字典类型',
-    examples: '示例',
-    generatedTemplates: '生成模板',
-    frontEndTypes: '前端类型',
-    generatedScenarios: '生成场景',
-    parentMenu: '上级菜单',
-    assignToASpecificMenuEgSystemManagement: '分配到指定菜单下,例如 系统管理',
-    pleaseSelectTheSystemMenu: '请选择系统菜单',
-    moduleName: '模块名',
-    moduleNameIeFirstLevelDirectoryEgSystemInfraToolEtc: '模块名,即一级目录,例如 system、infra、tool 等等',
-    businessName: '业务名',
-    businessNameIeSecondLevelDirectoryEgUserPermissionDictEtc: '业务名,即二级目录,例如 user、permission、dict 等等',
-    className: '类名称',
-    classNameInitialCapitalizedEgSysUserSysMenuSysDictDataEtc: '类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等',
-    classDescription: '类描述',
-    usedAsAClassDescriptionEgUser: '用作类描述,例如 用户',
-    customPath: '自定义路径',
-    fillInTheAbsolutePathToTheDiskIfNotItWillBeGeneratedUnderTheCurrentWebProject: '填写磁盘绝对路径,若不填写,则生成到当前Web项目下',
-    quickSelectionOfTheNearestPath: '最近路径快速选择',
-    restoreTheDefaultGeneratedBasePath: '恢复默认的生成基础路径',
-    treeTableInformation: '树表信息',
-    parentNumberField: '父编号字段',
-    theNameOfTheParentCodeFieldOfTheTreeDisplaySuchAsParentId: '树显示的父编码字段名, 如:parent_Id',
-    treeNameField: '树名称字段',
-    nameOfTheDisplayNameFieldOfTheTreeNodeEgDeptName: '树节点的显示名称字段名, 如:dept_name',
-    masterTableInformation: '主表信息',
-    associatedMasterTable: '关联的主表',
-    theNameOfTheAssociatedMasterParentTableEgSystemUser: '关联主表(父表)的表名, 如:system_user',
-    fieldsAssociatedWithChildTables: '子表关联的字段',
-    fieldsAssociatedWithTheChildTableSuchAsUserId: '子表关联的字段, 如:user_id',
-    relationship: '关联关系',
-    theRelationshipBetweenTheMasterTableAndTheChildTable: '主表与子表的关联关系',
-    oneToMany: '一对多',
-    oneToOne: '一对一',
-    fieldInformation: '字段信息',
-    generatedInformation: '生成信息',
-    importTable: '导入表',
-    importSuccessful: '导入成功',
-    dataSource: '数据源',
-    pleaseSelectADataSource: '请选择数据源',
-    pleaseEnterATableName: '请输入表名称',
-    pleaseEnterATableDescription: '请输入表描述',
-    generateCode: '生成代码',
-    entity: '实体',
-    updateTime: '更新时间',
-    areYouSureYouWantToForceSynchronizationOfTableStructure: '确认要强制同步',
-    tableStructure: '表结构吗?',
-    synchronizationSuccessful: '同步成功',
-    codePreview: '代码预览',
-    generateFileInDirectory: '生成文件目录中...',
-    loadingCode: '加载代码中...',
-    timedTaskXls: '定时任务.xls',
-  },
-  mall: {
-    orderTotalPrice: '订单总价',
-    orderNo: '订单编号',
-    actualPaymentAmount: '实际支付金额',
-    paymentResult:'支付结果',
-    scanningTheCodeForReceivingPayment:'扫码收款中...',
-    paymentSettlement:'支付结算',
-    placeAnOrder:'下单',
-    neverPlacedAnOrder:'从未下单',
-    advertisementPictureManagementXls:'广告图管理.xls',
-    newAddCashWithdrawal:'新增提现',
-    orderNumber: '取单号',
-    totalOrderPrice: '订单总价',
-    specification: '规格',
-    orderPickup: '取单',
-    numberOfDiners: '就餐人数',
-    pleaseEnterTheNumberOfPeople: '请输入人数',
-    totalAmount: '总金额',
-    goToOrder: '去下单',
-    noProducts: '暂无商品...',
-    tableTop: '桌台',
-    pleaseSelectTheSpecification: '请选择规格!',
-    pleaseSelectTheStore: '请选择门店!',
-    quantityCannotBeLessThan1: '数量不能小于1哦',
-    noProductsListed: '暂无商品挂单',
-    pleaseAddTheProductFirst: '请先加入商品!',
-    theNumberOfDinersMustBeGreaterThan0: '就餐人数必须大于0!',
-    pleaseEnterTheProductKeywordProductName: '请输入商品关键字:商品名称',
-    checkProducts: '查询商品',
-    cashier: '收银员',
-    noItemsAvailableAtThisTime: '暂无结算商品',
-    totalNumberOfItems: '总件数',
-    pendingOrders: '挂单',
-    selectProductSpecification: '选择商品规格',
-    pleaseAddAStoreOrSelectAStore: '请添加门店或者选择门店',
-    pleaseUseTheScannerBoxOrScannerGunToScanTheMemberPaymentCode: '请使用扫码盒子或者扫描枪,扫描会员付款码!',
-    scanTheCodeAndPrintTheTicket: '扫码完成并打印小票',
-    successfulPayment: '支付成功',
-    printTicket: '打印小票',
-    settleMattersAdding: '加入结算',
-    settleMattersSubmit: '提交结算',
-    pleaseChooseThePaymentMethod: '请选择支付方式',
-    cash: '现金支付',
-    balancePayment: '余额支付',
-    weChatPayment: '微信支付',
-    alipayPayment: '支付宝支付',
-    settlementInformation: '结算信息',
-    remarkInformation: '备注信息',
-    pleaseEnterNoteInformation: '请输入备注信息',
-    discountDiscount: '折扣:(折)',
-    pleaseEnterDiscount: '请输入折扣',
-    reduction$: '立减:(元)',
-    pleaseEnterTheDiscountAmount: '请输入立减金额',
-    discountAmount: '优惠金额',
-    amountDue: '应付金额',
-    name: '名称',
-    cellPhoneNumber: '手机号',
-    availableBalance: '可用余额',
-    availablePoints: '可用积分',
-    confirmReceipt: '确定收款',
-    memberInformation: '会员信息',
-    unbound: '未绑定',
-    _$: '(元)',
-    storeName: '店铺名称',
-    couponName: '优惠券名称',
-    spendHowMuchAvailable: '消费多少可用',
-    couponAmount: '优惠券金额',
-    availableType: '可用类型',
-    pickup: '自取',
-    takeOut: '外卖',
-    generalPurpose: '通用',
-    used: '已使用',
-    unused: '未使用',
-    userNickname: '用户昵称',
-    usedNot: '是否使用',
-    pickupTime: '领取时间',
-    showStores: '展示店铺',
-    selectStore: '选择店铺',
-    redeemCode: '兑换码',
-    picture: '图片',
-    howMuchToSpend: '消费多少可用',
-    startTime: '开始时间',
-    closingTime: '结束时间',
-    numberOfIssues: '发行数量',
-    pointsRequired: '所需积分',
-    limit: '限领数量',
-    instructionsForUse: '使用说明',
-    whetherItIsOnTheShelfOrNot: '是否上架',
-    pleaseEnterTheRedemptionCode: '请输入兑换码',
-    pleaseEnterTheNameOfTheCoupon: '请输入优惠券名称',
-    pleaseEnterTheAmountOfMoneySpent: '请输入消费多少可用',
-    pleaseEnterTheAmountOfTheCoupon: '请输入优惠券金额',
-    selectStartTime: '选择开始时间',
-    selectTheEndTime: '选择结束时间',
-    pleaseEnterTheNumberOfIssues: '请输入发行数量',
-    pleaseEnterTheNumberOfPointsRequired: '请输入所需积分',
-    pleaseEnterTheQuantityLimit: '请输入限领数量',
-    pleaseEnterTheInstructionsForUse: '请输入使用说明',
-    storeId0MeansGenericCantBeEmpty: '店铺id,0表示通用不能为空',
-    couponNameCannotBeEmpty: '优惠券名称不能为空',
-    consumptionOfHowMuchIsAvailableCanNotBeEmpty: '消费多少可用不能为空',
-    couponAmountCannotBeEmpty: '优惠券金额不能为空',
-    startTimeCannotBeEmpty: '开始时间不能为空',
-    endTimeCannotBeEmpty: '结束时间不能为空',
-    availableTypeCannotBeEmpty: '可用类型不能为空',
-    theNumberOfCouponsIssuedCannotBeEmpty: '发行数量不能为空',
-    limitOnNumberOfCouponsCannotBeEmpty: '限领数量不能为空',
-    descriptionOfUseCannotBeEmpty: '使用说明不能为空',
-    availableStores: '可用店铺',
-    whetherTheCouponIsOnTheShelfOrNot: '是否上架',
-    howMuchDoYouWantToSpend: '消费多少可用',
-    redemptionCode: '兑换码',
-    received: '已领',
-    endTime: '结束时间',
-    pleaseEnterAStoreName: '请输入店铺名称',
-    pleaseEnterTheCouponName: '请输入优惠券名称',
-    collectionRecord: '领取记录',
-    couponXls: '优惠券.xls',
-    tableNumber: '桌号',
-    id: 'id',
-    classification: '桌号分类',
-    tableName: '桌号名称',
-    numberOfOrders: '下单数',
-    consumptionAmount: '消费金额',
-    lastOrderTime: '上次下单时间',
-    pleaseEnterStoreName: '请输入店铺名称',
-    pleaseEnterTheNumber: '请输入编号',
-    batchAdd: '批量新增',
-    batchDownloadOrderCode: '批量下载点餐码',
-    import: '导入',
-    downloadAndImportTemplate: '下载导入模板',
-    qrCode: '二维码',
-    relatedOrders: '相关订单',
-    storesTableNumberXls: '门店 - 桌号.xls',
-    batchImportTableNumberTemplateXls: '批量导入桌号模板.xls',
-    smallProgramQrCodeCanOnlyDownloadTheOfficialOh: '小程序二维码只能下载正式的哦',
-    allOrders: '全部订单',
-    orderStatus: '订单状态',
-    all: '全部',
-    unpaid: '未支付',
-    inProgress: '制作中',
-    toBeReceived: '待收货',
-    receivedPickedUp: '已收货/已取餐',
-    refundOrder: '退款单',
-    deleted: '已删除',
-    alipay: '支付宝支付',
-    cashPayment: '现金支付',
-    userName: '用户姓名',
-    phoneNumber: '用户电话',
-    userType: '用户类型',
-    level: '等级',
-    pleaseEnterTheOrderNumber: '请输入订单号',
-    pleaseEnterYourName: '请输入用户姓名',
-    pleaseEnterYourPhoneNumber: '请输入用户电话',
-    store: '门店',
-    userIdNickname: '用户id|昵称',
-    userNamePhoneNumber: '用户姓名|电话',
-    productInformation: '商品信息',
-    actualPayment: '实际支付',
-    paymentMethod: '支付方式',
-    purchaseType: '购买类型',
-    paymentTime: '支付时间',
-    notShipped: '未发货',
-    paymentConfirmed: '确认付款',
-    orderDetails: '订单详情',
-    modifyToPaymentStatus: '修改为支付状态',
-    dineIn: '堂食',
-    order: '出单',
-    selectTableCategory: '选择桌面分类',
-    tabletopPicture: '桌面图片',
-    remarks: '备注',
-    desktopPicture: '桌面图片',
-    pleaseEnterTableName: '请输入桌位名称',
-    pleaseEnterTableNumber: '请输入桌号',
-    storeCannotBeEmpty: '门店不能为空',
-    tableNumberCannotBeEmpty: '桌号不能为空',
-    tableNameCannotBeEmpty: '桌位名称不能为空',
-    status1Enabled2DisabledCannotBeEmpty: '状态:1=启用,2=禁用不能为空',
-    tableNumberPrefix: '桌号前缀',
-    tableNumberRange: '桌号范围',
-    remark: '备注',
-    tableNumberPrefixCannotBeEmpty: '桌号前缀不能为空',
-    tableNumberStartCannotBeEmpty: '桌号开始不能为空',
-    tableNumberEndCannotBeEmpty: '桌号结束不能为空',
-    status1EqualsEnable2EqualsDisableCannotBeEmpty: '状态:1=启用,2=禁用不能为空',
-    likeY: '比如:Y',
-    miniProgramVersion: '小程序版本',
-    miniProgramQrCode: '小程序二维码',
-    h5QrCode: 'H5二维码',
-    miniProgramNotConfigured: '小程序未配置',
-    statusOneEqualsEnableTwoEqualsDisableCannotBeEmpty: '状态:1=启用,2=禁用不能为空',
-    releaseVersion: '正式版',
-    experienceVersion: '体验版',
-    developmentVersion: '开发版',
-    miniProgramQrCodeCanOnlyBeDownloadedForReleaseVersion: '小程序二维码只能下载正式的哦',
-    dragFileHereOr: '将文件拖到此处,或',
-    clickToUpload: '点击上传',
-    onlyAllowImportXlsXlsxFiles: '仅允许导入 xls、xlsx 格式文件。',
-    downloadTemplate: '下载模板',
-    pleaseUploadFile: '请上传文件',
-    uploadSuccessCount: '上传成功数量:',
-    updateSuccessCount: '更新成功数量:',
-    updateFailureCount: '更新失败数量:',
-    uploadFailedPleaseReupload: '上传失败,请您重新上传!',
-    maxOneFileCanBeUploaded: '最多只能上传一个文件!',
-    categoryName: '分类名称',
-    pleaseEnterCategoryName: '请输入分类名称',
-    categoryNumber: '分类编号',
-    personCount: '人数',
-    categorySort: '分类排序',
-    openStatus: '开启状态',
-    storeTableNumberCategoryXls: '门店桌号分类.xls',
-    pleaseEnterPersonCount: '请输入人数',
-    pleaseSelectStore: '请选择店铺',
-    categoryNameCannotBeEmpty: '分类名称不能为空',
-    personCountCannotBeEmpty: '人数不能为空',
-    categorySortCannotBeEmpty: '分类排序不能为空',
-    wechatMiniProgram: '微信小程序',
-    officialAccount: '公众号',
-    h5: 'H5',
-    pleaseEnterUserNickname: '请输入用户昵称',
-    pleaseEnterPhoneNumber: '请输入手机号码',
-    userAvatar: '用户头像',
-    userBalance: '用户余额',
-    userLoginType: '用户登陆类型',
-    detail: '详情',
-    pointsBalance: '积分余额',
-    userXls: '用户.xls',
-    userInfo: '用户信息',
-    basicInfo: '基本信息',
-    balance: '余额',
-    birthday: '生日',
-    idCardNumber: '身份证号码',
-    boundMembershipCard: '绑定的会员卡',
-    points: '积分',
-    commissionAmount: '佣金金额',
-    consecutiveSignInDays: '连续签到天数',
-    creditCard: '信用卡',
-    rakutenPay: '乐天支付',
-    loginIp: '登录ip',
-    userLevel: '等级',  // 改为更具体的键名
-    promotionId: '推广id',
-    purchaseCount: '购买次数',
-    subordinateCount: '下级人数',
-    loginType: '登陆类型',
-    registrationTime: '注册时间',
-    userOverview: '用户概况',
-    consumptionRecord: '消费记录',
-    expenseOrGain: '支出/获得',
-    expense: '支出',
-    gain: '获得',
-    unknown: '未知',
-    billTitle: '账单标题',
-    detailCategory: '明细种类',
-    detailType: '明细类型',
-    recharge: '充值',
-    rebate: '返佣',
-    consumption: '消费',
-    withdrawal: '提现',
-    refund: '退款',
-    systemAdd: '系统添加',
-    systemReduce: '系统减少',
-    subtract: '减去',
-    reward: '奖励',
-    signIn: '签到',
-    membershipCard: '会员卡',
-    detailAmountYuan: '明细数字(元)',
-    remainingYuan: '剩余(元)',
-    userAccount: '用户账户',
-    realName: '真实姓名',
-    userRemark: '用户备注',
-    userPoints: '用户积分',
-    detailedAddress: '详细地址',
-    pleaseEnterUserAccount: '请输入用户账户',
-    pleaseEnterRealName: '请输入真实姓名',
-    pleaseEnterBirthday: '请输入生日',
-    pleaseEnterUserRemark: '请输入用户备注',
-    pleaseEnterUserBalance: '请输入用户余额',
-    pleaseEnterCommissionAmount: '请输入佣金金额',
-    pleaseEnterUserRemainingPoints: '请输入用户剩余积分',
-    pleaseEnterDetailedAddress: '请输入详细地址',
-    userAccountCannotBeEmpty: '用户账户不能为空',
-    userNicknameCannotBeEmpty: '用户昵称不能为空',
-    phoneNumberCannotBeEmpty: '用户手机号码不能为空',
-    userTypeCannotBeEmpty: '用户类型不能为空',
-    phoneNumber1: '手机号码',
-    selectMember: '选择会员',
-    select: '选择',
-    modifyBalance: '修改余额',
-    increase: '增加',
-    decrease: '减少',
-    pleaseEnterBalance: '请输入余额',
-    modifyPoints: '修改积分',
-    pleaseEnterPoints: '请输入积分',
-    amountCannotBeEmpty: '金额不能为空',
-    pointsCannotBeEmpty: '积分不能为空',
-    name1: '姓名',
-    phone: '电话',
-    consigneeName: '收货人姓名',
-    consigneePhone: '收货人电话',
-    consigneeAddress: '收货人地址',
-    consigneeDetailedAddress: '收货人详细地址',
-    isDefault: '是否默认',
-    pleaseEnterConsigneeName: '请输入收货人姓名',
-    pleaseEnterConsigneePhone: '请输入收货人电话',
-    consigneeNameCannotBeEmpty: '收货人姓名不能为空',
-    consigneePhoneCannotBeEmpty: '收货人电话不能为空',
-    consigneeAddressCannotBeEmpty: '收货人地址不能为空',
-    consigneeDetailedAddressCannotBeEmpty: '收货人详细地址不能为空',
-    isDefaultCannotBeEmpty: '是否默认不能为空',
-    pleaseEnterConsigneeProvince: '请输入收货人所在省',
-    desktopStatus: '桌面状态:',
-    idle: '空闲中',
-    dining: '就餐中',
-    noTableData: '暂无桌台数据',
-    dineInOrders: '堂食订单',
-    takeoutOrders: '外卖订单',
-    selfPickupOrders: '自取订单',
-    reservationOrders: '预约订单',
-    pendingOrder: '待出单',
-    pendingReceipt: '待收货',
-    receivedOrPickedUp: '已收货/已取餐',
-    refundOrders: '退款单',
-    reserving: '预约中',
-    cancelled: '已取消',
-    completed: '已完成',
-    wechatPayment: '微信支付',
-    userPhone: '用户电话',
-    pleaseEnterOrderNumber: '请输入订单号',
-    pleaseEnterUserName: '请输入用户姓名',
-    pleaseEnterUserPhone: '请输入用户电话',
-    pickupNumber: '取餐号',
-    orderNumber1: '订单号',
-    userNamePhone: '用户姓名|电话',
-    productInfo: '商品信息',
-    reservation: '预约',
-    reservationPickupTime: '预约取餐时间',
-    issueOrder: '出单',
-    confirmRefund: '确认退款',
-    cancelReservation: '取消预约',
-    confirmPayment: '确认付款',
-    orderRecords: '订单记录',
-    deleteOrder: '删除订单',
-    orderRemark: '订单备注',
-    backendReceipt: '后台收货',
-    modifyToPaidStatus: '修改为支付状态',
-    modifyReceiptStatus: '修改收货状态',
-    confirmCancelReservation: '确定取消预约',
-    orderXls: '订单.xls',
-    receivingInfoOne: '收货信息1',
-    consignee: '收货人',
-    contactPhone: '联系电话',
-    receivingAddress: '收货地址',
-    dishDetails: '菜品明细',
-    mealNotServed: '未出餐',
-    mealServed: '已出餐',
-    userOrdering: '用户点餐',
-    staffOrderingOnBehalf: '员工帮点',
-    productDetails: '商品明细',
-    reserveTable: '预约桌面',
-    price: '价格',
-    quantity: '数量',
-    orderInfo: '订单信息',
-    diningPersonCount: '就餐人数',
-    reservationTime: '预约时间',
-    arrivalTime: '到店时间',
-    reservationPerson: '预约人',
-    reservationPhone: '预约预留电话',
-    reservationStatus: '预约状态',
-    totalProductQuantity: '商品总数',
-    totalProductPrice: '商品总价',
-    shippingFee: '支付邮费',
-    pointsDeduction: '积分抵扣',
-    orderTotalPriceCannotBeEmpty: '订单总价不能为空',
-    actualPaymentAmountCannotBeEmpty: '实际支付金额不能为空',
-    consumptionEarnedPointsCannotBeEmpty: '消费赚取积分不能为空',
-    bonusPoints: '赠送积分',
-    orderIssued: '已出单',
-    pleasePlaceAnOrderFirst: '请先点餐哦!',
-    confirmOfflineCollection: '确定下线收款',
-    assistWithOrdering: '协助点餐',
-    confirmCollection: '确认收款',
-    issueOrderAndPrintReceipt: '出单打印小票',
-    print: '打 印',
-    receiptPrint: '小票打印',
-    displayStore: '展示店铺',
-    categoryImage: '分类图片',
-    categoryDescription: '分类描述',
-    pleaseEnterCategoryDescription: '请输入分类描述',
-    openStatusCannotBeEmpty: '开启状态不能为空',
-    belongingStore: '所属门店',
-    productName: '商品名称',
-    commentId: '评论ID',
-    productScore: '商品分数',
-    serviceScore: '服务分数',
-    commentContent: '评论内容',
-    commentTime: '评论时间',
-    adminReplyContent: '管理员回复内容',
-    adminReplyTime: '管理员回复时间',
-    pleaseEnterNickname: '请输入昵称',
-    reply: '回复',
-    weight: '权重',
-    pleaseEnterWeight: '请输入权重',
-    imageCannotBeEmpty: '图片不能为空',
-    weightCannotBeEmpty: '权重不能为空',
-    image: '图片',
-    isAvailable: '是否可用',
-    salesVolume: '销量',
-    value: '价值',
-    sellingPrice: '销售价',
-    pleaseEnterTitle: '请输入标题',
-    title: '标题',
-    pleaseEnterValue: '请输入价值',
-    pleaseEnterSellingPrice: '请输入销售价',
-    display: '显示',
-    hide: '隐藏',
-    titleCannotBeEmpty: '标题不能为空',
-    valueCannotBeEmpty: '价值不能为空',
-    sellingPriceCannotBeEmpty: '销售价不能为空',
-    icon: '图标',
-    type: '类型',
-    pagePath: '页面路径',
-    page: '页面',
-    jumpToMiniProgram: '跳转小程序',
-    content: '内容',
-    myServiceXls: '我的服务.xls',
-    selectType: '选择类型',
-    miniProgramAppId: '小程序app_id',
-    pleaseSelectType: '请选择类型',
-    pleaseEnterMiniProgramAppId: '请输入小程序app_id',
-    pleaseEnterPagePath: '请输入页面路径',
-    pleaseEnterPhone: '请输入电话',
-    typeCannotBeEmpty: '类型不能为空',
-    iconCannotBeEmpty: '图标不能为空',
-    specificationName: '规格名称',
-    specificationValue: '规格值',
-    pleaseEnterSpecificationName: '请输入规格名称',
-    pleaseEnterAttributeName: '请输入属性名称',
-    pleaseEnterSpecificationValue: '请输入规格值',
-    addNewSpecification: '添加新规格',
-    specificationNameCannotBeEmpty: '规格名称不能为空',
-    specificationValueCannotBeEmpty: '规格值不能为空',
-    rechargeAmountManagementXls: '充值金额管理.xls',
-    productRuleValueSpecificationXls: '商品规则值(规格).xls',
-    withdrawalAmountCannotBeEmpty: '提现金额不能为空',
-    bankCardCannotBeEmpty: '银行卡不能为空',
-    withdrawalAmount: '提现金额',
-    withdrawToBankCard: '提现到银行卡',
-    pleaseEnterWithdrawalAmount: '请输入提现金额',
-    selectBankCard: '选择银行卡',
-    pleaseSelectStatus: '请选择状态',
-    unreviewed: '未审核',
-    pendingArrival: '待到账',
-    reviewRejected: '审核拒绝',
-    arrived: '已到账',
-    withdrawalBankCard: '提现银行卡',
-    bankName: '银行名称',
-    bankCardNumber: '银行卡号',
-    reviewRejectionReason: '审核拒绝原因',
-    review: '审核',
-    bankNameColon: '银行名称:',
-    bankCardNumberColon: '银行卡号:',
-    realNameColon: '真实姓名:',
-    phoneNumberColon: '手机号码:',
-    pleaseEnterReviewRejectionReason: '请输入审核拒绝原因',
-    printerName: '打印机名称',
-    terminalNumber: '终端号',
-    terminalKey: '终端密钥',
-    pleaseEnterPrinterName: '请输入打印机名称',
-    configurePrinter: '配置打印机',
-    printerClientId: '打印机clientId',
-    printerClientSecret: '打印机clientSecret',
-    printerClientIdCannotBeEmpty: '打印机clientId不能为空',
-    printerClientSecretCannotBeEmpty: '打印机clientSecret不能为空',
-    pleaseEnterTerminalNumber: '请输入终端号',
-    pleaseEnterTerminalKey: '请输入终端密钥',
-    pleaseEnterBankName: '请输入银行名称',
-    pleaseEnterBankCardNumber: '请输入银行卡号',
-    pleaseEnterName: '请输入姓名',
-    bankNameCannotBeEmpty: '银行名称不能为空',
-    bankCardNumberCannotBeEmpty: '银行卡号不能为空',
-    nameCannotBeEmpty: '姓名不能为空',
-    ID: 'ID',
-    pleaseEnterUserId: '请输入用户id',
-    pleaseSelectUser: '请选择用户',
-    income: '收入',
-    amount: '金额',
-    storeId: '门店ID',
-    typeTips: '类型:1=收入,2=支出',
-    pleaseSelectDictionaryGeneration: '请选择字典生成',
-    user: '用户',
-    pleaseEnterStoreId: '请输入门店ID',
-    pleaseSelectTypeTips: '请选择类型:1=收入,2=支出',
-    pleaseEnterAmount: '请输入金额',
-    pleaseEnterUser: '请输入用户',
-    storeNameCannotBeEmpty: '店铺名称不能为空',
-    associatedTags: '所属标签',
-    selectTag: '选择标签',
-    intervalTimeUnitHours: '间隔时间(单位小时)',
-    pleaseEnterIntervalTimeUnitHours: '请输入间隔时间单位小时',
-    selectEndTime: '选择结束时间',
-    pleaseSelectTag: '请选择标签',
-    intervalTimeCannotBeEmpty: '间隔时间不能为空',
-    tagName: '标签名称',
-    pleaseEnterTagName: '请输入标签名称',
-    tagNameCannotBeEmpty: '标签名称不能为空',
-    storePhone: '店铺电话',
-    storeImage: '门店图片',
-    longitude: '经度',
-    latitude: '纬度',
-    minimumOrderPrice: '起送价钱',
-    deliveryPrice: '配送价格',
-    isOpen: '是否营业',
-    pleaseEnterStorePhone: '请输入店铺电话',
-    pleaseEnterPlaceKeyword: '请输入地名关键字',
-    selectOnMap: '地图选择',
-    pleaseSelectLocationAddress: '请选择定位地址',
-    storeAvatar: '门店头像',
-    storeGroupImages: '门店组图',
-    businessStartTime: '营业开始时间',
-    businessEndTime: '营业结束时间',
-    selectMapLocation: '选择地图定位',
-    mapLocationAddress: '地图定位地址',
-    takeoutDeliveryDistance: '外卖配送距离/千米',
-    announcement: '公告',
-    bindAdministrator: '绑定管理员',
-    selectBusinessStartTime: '选择营业开始时间',
-    selectBusinessEndTime: '选择营业结束时间',
-    pleaseEnterMapLocationAddress: '请输入地图定位地址',
-    pleaseEnterLongitude: '请输入经度',
-    pleaseEnterLatitude: '请输入纬度',
-    pleaseEnterTakeoutDeliveryDistance: '请输入外卖配送距离,单位为千米。0表示不送外卖',
-    pleaseEnterMinimumOrderPrice: '请输入起送价钱',
-    pleaseEnterDeliveryPrice: '请输入配送价格',
-    pleaseEnterAnnouncement: '请输入公告',
-    clickToSelectAddressToGetLongitudeAndLatitude: '点击选择地址获取经纬度',
-    selectUser: '选择用户',
-    bindAdministratorForBranchManagement: '绑定管理员用于分店管理',
-    isStoreReceiptPrintingEnabled: '是否开启门店小票打印',
-    bindPrinter: '绑定打印机',
-    selectPrinter: '选择打印机',
-    isCustomerReceiptPrintingEnabled: '是否开启顾客小票打印',
-    isKitchenReceiptPrintingEnabled: '是否开启厨房小票打印',
-    storePhoneCannotBeEmpty: '店铺电话不能为空',
-    multipleImagesCannotBeEmpty: '多张图片不能为空',
-    detailedAddressCannotBeEmpty: '详细地址不能为空',
-    mapLocationAddressCannotBeEmpty: '地图定位地址不能为空',
-    longitudeCannotBeEmpty: '经度不能为空',
-    latitudeCannotBeEmpty: '纬度不能为空',
-    takeoutDeliveryDistanceTips: '外卖配送距离,单位为千米。0表示不送外卖不能为空',
-    minimumOrderPriceCannotBeEmpty: '起送价钱不能为空',
-    deliveryPriceCannotBeEmpty: '配送价格不能为空',
-    announcementCannotBeEmpty: '公告不能为空',
-    isOpenTips: '是否营业:0=否,1=是不能为空',
-    administratorIdCannotBeEmpty: '管理员id不能为空',
-    printerIdCannotBeEmpty: '打印机id不能为空',
-    businessStartTimeCannotBeEmpty: '营业开始时间不能为空',
-    businessEndTimeCannotBeEmpty: '营业结束时间不能为空',
-    pleaseBindStorePrinter: '请绑定门店打印机',
-    pleaseBindCustomerPrinter: '请绑定顾客打印机',
-    pleaseBindKitchenPrinter: '请绑定后厨打印机',
-    storeManagementXls: '门店管理.xls',
-    inStoreConsumption: '到店消费',
-    appointmentLabelXls: '预约标签.xls',
-    appointmentRuleXls: '预约规则.xls',
-    storeMobileMerchantUserAssociationXls: '门店移动端商家用户关联.xls'
-  },
-  market: {
-    orderNumber: '订单号',
-    userIdAndNickname: '用户id|昵称',
-    billTitle: '账单标题',
-    detailedFigureYuan: '明细数字(元)',
-    paid: '已支付',
-    unpaid: '未支付',
-    addTime: '添加时间',
-    cardName: '会员卡名称',
-    pleaseEnterTheNameOfTheMembershipCard: '请输入会员卡名称',
-    discountRatio: '折扣比例',
-    break: '折',
-    validPeriod: '有效期',
-    permanent: '永久',
-    month: '月',
-    purchasePrice: '购买的价格',
-    bonusPoints: '赠送积分',
-    bonusAmount: '赠送的金额',
-    delete: '删除',
-    purchaseRecord: '购买记录',
-    membershipCardXls: '会员卡.xls',
-    basicInformation: '基本信息',
-    cardStyle: '会员卡样式',
-    pleaseEnterTheOrder: '请输入排序',
-    discount: '是否有折扣',
-    pleaseEnterThePercentageOfDiscount: '请输入折扣比例',
-    freeGiftWhenYouOpenTheCard: '开卡赠送',
-    balance: '余额',
-    NumberBonusPoints: '赠送积分数量',
-    pleaseEnterTheNumberOfBonusPoints: '请输入赠送积分数量',
-    bonusBalance: '赠送的余额',
-    pleaseEnterTheBalanceOfTheGift: '请输入赠送的余额',
-    receiveConfiguration: '领取配置',
-    validityPeriod: '有效期',
-    pleaseEnterTheValidityPeriod: '请输入有效期',
-    theValidityPeriodIsInMonths0MeansPermanent: '有效期单位月,0-表示永久',
-    pleaseEnterThePurchasedPrice: '请输入购买的价格',
-    rulesForUse: '使用的规则',
-    cardNameCannotBeEmpty: '会员卡名称不能为空',
-    cardStyleCannotBeEmpty: '会员卡样式不能为空',
-    expiryDateCannotBeEmpty: '有效期不能为空',
-    purchasePriceCannotBeEmpty1: '购买价格不能为空',
-    orderTotalPriceCannotBeEmpty: '订单总价不能为空',
-    refundAmountCannotBeEmpty: '退款金额金额不能为空',
-    orderTotalPrice: '订单总价',
-    refundAmount: '退款金额',
-    pleaseEnterOrderNumber: '请输入订单号',
-    pleaseEnterOrderTotalPrice: '请输入订单总价',
-    actualPaymentAmountCannotBeEmpty: '实际支付金额不能为空',
-    consumptionEarnedPointsCannotBeEmpty: '消费赚取积分不能为空',
-    actualPaymentAmount: '实际支付金额',
-    pleaseEnterActualPaymentAmount: '请输入实际支付金额',
-    pleaseEnterBonusPoints: '请输入赠送积分',
-    expressCompanyCannotBeEmpty: '快递公司不能为空',
-    expressTrackingNumberCannotBeEmpty: '快递单号不能为空',
-    expressCompany: '快递公司',
-    selectExpressCompany: '选择快递公司',
-    pleaseEnterExpressTrackingNumber: '请输入快递单号',
-    courierNumber: '快递单号',
-    tableNumber: '桌号',
-    pickupNumber: '取餐号',
-    address: '地址',
-    orderId: '订单id',
-    operationRecord: '操作记录',
-    operationTime: '操作时间'
-  },
-  message: {
-    templateName: '模板名',
-    pleaseEnterTheTemplateName: '请输入模板名',
-    templateNumber: '模板编号',
-    templateId: '模板ID',
-    type: '类型',
-    templateMessage: '模板消息',
-    subscribeMessage: '订阅消息',
-    addTime: '添加时间',
-    weChatTemplateXls: '微信模板.xls',
-    messageType: '消息类型',
-    pleaseSelectType: '请选择类型',
-    pleaseSelectMessageType: '请选消息类型',
-    pleaseEnterTheTemplateNumber: '请输入模板编号',
-    pleaseEnterTheTemplateId: '请输入模板ID',
-    templateNumberCannotBeEmpty: '模板编号不能为空',
-    templateNameCannotBeEmpty: '模板名不能为空',
-    messageTypeCannotBeEmpty: '模板ID不能为空',
-    templateIdCannotBeEmpty: '消息类型不能为空',
-    open: '开启'
-  },
-  mp: {
-    pleaseSelectTheWeChatOfficialAccount:'请选择公众号',
-    clickToLoadMore:'点击加载更多',
-    thereIsNoMore:'没有更多了',
-    sends:'发送(S)',
-    theNumberofGraphicMessagesIsLimitedto1:'图文消息条数限制在 1 条以内,已默认发送第一条',
-    pleaseEnterTheMusicLink:'请输入音乐链接',
-    pleaseEnterTheHighQualityMusicLink:'请输入高质量音乐链接',
-    selectThePublishedGraphic:'选择已发布图文',
-    selectTheGraphicintheDraftBox:'选择草稿箱图文',
-    selectTheVoice:'选择语音',
-    text:'文本',
-    graphic:'图文',
-    music:'音乐',
-    clickToPlayTheVideo:'点击播放视频',
-    videoPlayback:'视频播放',
-    voiceRecognition:'语音识别',
-    abstract:'摘要',
-    name: '名称',
-    wechatAccount: '微信号',
-    messageEncryptionKey: '消息加解密密钥',
-    pleaseEnterName: '请输入名称',
-    pleaseEnterWechatAccount: '请输入微信号',
-    pleaseEnterTheAppIdOfTheWeChatOfficialAccount: '请输入公众号 appId',
-    pleaseEnterOfficialAccount: '请输入公众号 appSecret',
-    pleaseEnterOfficialAccountToken: '请输入公众号token',
-    pleaseEnterMessageEncryptionKey: '请输入消息加解密密钥',
-    pleaseEnterMiniProgramAppId: '请输入小程序 appId',
-    pleaseEnterMiniProgramAppSecret: '请输入小程序 appSecret',
-    tip11: '在微信公众平台(mp.weixin.qq.com)的菜单 [设置与开发 - 公众号设置 - 账号详情] 中能找到「微信号」',
-    tip12: '在微信公众平台(mp.weixin.qq.com)的菜单 [设置与开发 - 公众号设置 - 基本设置] 中能找到「开发者ID(AppID)」',
-    tip13: '在微信公众平台(mp.weixin.qq.com)的菜单 [设置与开发 - 公众号设置 - 基本设置] 中能找到「开发者密码(AppSecret)」',
-    nameCannotBeEmpty: '名称不能为空',
-    officialAccountCannotBeEmpty: '公众号账号不能为空',
-    officialAccountAppIdCannotBeEmpty: '公众号 appId 不能为空',
-    officialAccountSecretCannotBeEmpty: '公众号密钥不能为空',
-    officialAccountTokenCannotBeEmpty: '公众号 token 不能为空',
-    appId: 'appId',
-    serverAddressUrl: '服务器地址(URL)',
-    qrCode: '二维码',
-    generateQRCode: '生成二维码',
-    isMainAccount: '是否是主账户',
-    search: '搜索',
-    reset: '重置',
-    clearApiQuota: '清空 API 配额',
-    setAsMainAccount: '设置为主账户',
-    settingSucceeded: '设置成功',
-    messageType: '消息类型',
-    matchingType: '匹配类型',
-    pleaseSelectMatchingType: '请选择匹配类型',
-    pleaseEnterContent: '请输入内容',
-    keyword: '关键词',
-    replyMessage: '回复消息',
-    requestedKeywordCannotBeEmpty: '请求的关键字不能为空',
-    requestedKeywordMatchingCannotBeEmpty: '请求的关键字的匹配不能为空',
-    requestMessageType: '请求消息类型',
-    cover: '封面',
-    tip3: '你正在通过发布的方式发表内容。 发布不占用群发次数,一天可多次发布。',
-    tip4: '已发布内容不会推送给用户,也不会展示在公众号主页中。',
-    tip5: '发布后,你可以前往发表记录获取链接,也可以将发布内容添加到自定义菜单、自动回复、话题和页面模板中。',
-    replyMessageType: '回复消息类型',
-    replyContent: '回复内容',
-    officialAccount: '公众号',
-    addNew: '新增',
-    replyOnFollow: '关注时回复',
-    messageReply: '消息回复',
-    keywordReply: '关键词回复',
-    addNewAutoReply: '新增自动回复',
-    modifyAutoReply: '修改自动回复',
-    areYouSureToDeleteThisData: '是否确认删除此数据',
-    deletionSucceeded: '删除成功',
-    modificationSucceeded: '修改成功',
-    additionSucceeded: '新增成功',
-    updateitionSucceeded: '更新成功',
-    uploadLocally: '本地上传',
-    supportsBmpPngJpegJpgGifFormatsSizeNotExceeding2M: '支持 bmp/png/jpeg/jpg/gif 格式,大小不超过 2M',
-    uploadError: '上传出错:',
-    uploadFailed: '上传失败:',
-    pleaseEnterTitleRequired: '请输入标题(必填)',
-    pleaseEnterAuthor: '请输入作者',
-    pleaseEnterOriginalArticleAddress: '请输入原文地址',
-    pleaseEnterAbstract: '请输入摘要',
-    areYouSureToDeleteThisGraphic: '确定删除该图文吗?',
-    createNewGraphic: '新建图文',
-    modifyGraphic: '修改图文',
-    modifiedContentMayNotBeSavedAreYouSureToClose: '修改内容可能还未保存,确定关闭吗?',
-    publishingSucceeded: '发布成功',
-    thisOperationWillPermanentlyDeleteTheDraftAreYouSureToContinue: '此操作将永久删除该草稿, 是否继续?',
-    afterDeletionUsersCannotAccessThisPageAreYouSureToDelete: '删除后用户将无法访问此页面,确定删除?',
-    image: '图片',
-    voice: '语音',
-    video: '视频',
-    clickToUpload: '点击上传',
-    uploadSucceeded: '上传成功',
-    createNewVideo: '新建视频',
-    selectVideo: '选择视频',
-    tip0: '格式支持 MP4,文件大小不超过 10MB',
-    tips1: '标题将展示在相关播放页面,建议填写清晰、准确、生动的标题',
-    tips2: '介绍语将展示在相关播放页面,建议填写简洁明确、有信息量的内容',
-    pleaseEnterTitle: '请输入标题',
-    pleaseEnterDescription: '请输入描述',
-    number: '编号',
-    fileName: '文件名',
-    introduction: '介绍',
-    uploadTime: '上传时间',
-    download: '下载',
-    delete: '删除',
-    description: '描述',
-    formatSupportsMp3WmaWavAmrFileSizeNotExceeding2MPlaybackLengthNotExceeding60s:'格式支持 mp3/wma/wav/amr,文件大小不超过 2M,播放长度不超过 60s',
-    thisOperationWillPermanentlyDeleteTheFileAreYouSureToContinue: '此操作将永久删除该文件, 是否继续?',
-    deleteCurrentMenu: '删除当前菜单',
-    menuName: '菜单名称',
-    menuNameEn: '菜单名称(EN)',
-    menuNameJp: '菜单名称(JP)',
-    pleaseEnterMenuName: '请输入菜单名称',
-    menuIdentifier: '菜单标识',
-    pleaseEnterMenuKey: '请输入菜单 KEY',
-    menuContent: '菜单内容',
-    jumpLink: '跳转链接',
-    pleaseEnterLink: '请输入链接',
-    miniProgramAppId: '小程序的 appid ',
-    miniProgramPagePath: '小程序的页面路径',
-    pleaseEnterMiniProgramPagePathEgPagesIndex: '请输入小程序的页面路径,如:pages/index',
-    miniProgramBackupWebpage: '小程序的备用网页:',
-    OlderVersionsOfTheClientThatDoNotSupportMiniProgramsWillOpenThisWebpage: '不支持小程序的老版本客户端将打开本网页',
-    tipsYouNeedToAssociateWithTheOfficialAccountToBindTheMiniProgramToTheWeChatMenu:'tips:需要和公众号进行关联才可以把小程序绑定带微信菜单上哟!',
-    selectFromMaterialLibrary: '素材库选择',
-    selectGraphic: '选择图文',
-    YouHaveSelectedAMultiGraphicItWillDefaultToJumpToTheFirstOne: '您选择的是多图文,将默认跳转第一篇',
-    jumpToWebpage: '跳转网页',
-    jumpToMiniProgram: '跳转小程序',
-    clickToReply: '点击回复',
-    jumpToGraphicMessage: '跳转图文消息',
-    scanCodeToReturnResultDirectly: '扫码直接返回结果',
-    scanCodeToReply: '扫码回复',
-    systemTakePhotoAndSendImage: '系统拍照发图',
-    takePhotoOrSelectFromAlbum: '拍照或者相册',
-    wechatAlbum: '微信相册',
-    selectLocation: '选择地理位置',
-    subMenuName: '子菜单名称',
-    saveAndPublishMenu: '保存并发布菜单',
-    clearMenu: '清空菜单',
-    pleaseSelectMenuConfiguration: '请选择菜单配置',
-    areYouSureToDelete: '确定要删除吗?',
-    areYouSureToSave: '确定要保存吗?',
-    clearingSucceeded: '清空成功',
-    userIdentifier: '用户标识',
-    pleaseSelectMessageType: '请选择消息类型',
-    pleaseEnterUserIdentifier: '请输入用户标识',
-    fanMessageList: '粉丝消息列表',
-    sendTime: '发送时间',
-    sender: '发送方',
-    fan: '粉丝',
-    follow: '关注',
-    unfollow: '取消关注',
-    clickMenu: '点击菜单',
-    clickMenuLink: '点击菜单链接',
-    scanCodeResult: '扫码结果',
-    unknownEventType: '未知事件类型',
-    link: '链接',
-    unknownMessageType: '未知消息类型',
-    message: '消息',
-    timeRange: '时间范围',
-    userIncreaseDecreaseData: '用户增减数据',
-    cumulativeUserData: '累计用户数据',
-    messageOverviewData: '消息概况数据',
-    interfaceAnalysisData: '接口分析数据',
-    newUsers: '新增用户',
-    unfollowedUsers: '取消关注的用户',
-    cumulativeUserCount: '累计用户量',
-    numberOfUsersSendingMessages: '用户发送人数',
-    numberOfMessagesSentByUsers: '用户发送条数',
-    numberOfPassiveRepliesToUserMessages: '被动回复用户消息的次数',
-    numberOfFailures: '失败次数',
-    maximumTimeConsumed: '最大耗时',
-    totalTimeConsumed: '总耗时',
-    noOfficialAccountSelectedCannotStatisticData: '未选中公众号,无法统计数据',
-    timeIntervalShouldBeWithin7DaysPleaseReSelect: '时间间隔 7 天以内,请重新选择',
-    synchronize: '同步',
-    numberOfFans: '粉丝数',
-    areYouSureToSynchronizeTags: '是否确认同步标签?',
-    tagSynchronizationSucceeded: '同步标签成功',
-    pleaseEnterTagName: '请输入标签名称',
-    nickname: '昵称',
-    tag: '标签',
-    subscriptionStatus: '订阅状态',
-    subscriptionTime: '订阅时间',
-    areYouSureToSynchronizeFans: '是否确认同步粉丝?',
-    startingToSynchronizeFanInfoFromWechatOfficialAccountItTakesTimePleaseQueryLater:'开始从微信公众号同步粉丝信息,同步需要一段时间,建议稍后再查询',
-    pleaseSelectTag: '请选择标签',
-    subscribed: '已订阅',
-    unsubscribed: '未订阅'
-  },
-  pay: {
-    idTenantId: 'id(+租户ID)',
-    paymentType: '支付类型(支付渠道)',
-    applicationId: '应用id',
-    merchantId: '商户id',
-    asynchronousCallbackAddress: '异步回调地址',
-    synchronousCallbackAddress: '同步回调地址',
-    signature: '签名方式',
-    testEnvironment: '是否为测试环境',
-    alipay: '支付宝支付',
-    weChatPayment: '微信支付',
-    payId: '支付id',
-    weChatPaySmallProgram: '微信支付小程序',
-    weChatPayPublic: '微信支付公众号',
-    weChatPayH5: '微信支付H5',
-    alipayH5: '支付宝H5',
-    pleaseEnterTheAppId: '请输入应用id',
-    weChatMerchantId: '微信商户id',
-    pleaseEnterWeChatMerchantId: '请输入微信商户id',
-    alipayMerchantId: '支付宝商户id',
-    pleaseEnterTheAlipayMerchantId: '请输入支付宝商户id',
-    certificateStorageType: '证书存储类型',
-    pleaseSelectTheType: '请选择类型',
-    noteNeedCertificateOfChoiceDoNotNeedNotChoose: '注意:需要证书的选择不需要不选择',
-    privateKeyOrPrivateKeyCertificate: '私钥或私钥证书',
-    pleaseEnterThePrivateKeyOrPrivateKeyCertificate: '请输入私钥或私钥证书',
-    publicKeyOrPublicKeyCertificate: '公钥或公钥证书',
-    pleaseEnterThePublicKeyOrPublicKeyCertificate: '请输入公钥或公钥证书',
-    keyCertificate: 'key证书',
-    pleaseEnterTheKeyCertificateAdditionalCertificatesToUseSuchAsSslCertificateOrUnionPayRootLevelCertificates:'请输入key证书,附加证书使用,如SSL证书,或者银联根级证书方面',
-    passwordOfTheCertificate: '证书的密码',
-    pleaseEnterThePasswordOfThePrivateKeyCertificateOrKeyCertificate: '请输入私钥证书或key证书的密码',
-    pleaseEnterTheAsynchronousCallback: '请输入异步回调',
-    pleaseEnterTheSynchronousCallbackAddressWhichIsMostlyUsedForPageJumpAfterSuccessfulPayment:'请输入同步回调地址,大部分用于付款成功后页面转跳',
-    pleaseSelectSignatureMethodMd5: '请选择签名方式MD5',
-    subappid: '子appid',
-    pleaseEnterTheSubAppid: '请输入子appid',
-    subMerchantId: '子商户id',
-    pleaseEnterTheSubMerchantId: '请输入子商户id',
-    paymentTypeCannotBeEmpty: '支付类型(支付渠道)不能为空',
-    paymentIdCannotBeEmpty: '支付id不能为空',
-    applicationIdCannotBeEmpty: '应用id不能为空',
-    signatureMethodCannotBeEmpty: '签名方式不能为空',
-    asynchronousCallbackAddressCannotBeEmpty: '异步回调地址不能为空'
-  },
-  Redirect: {},
-  score: {
-    all: '全部',
-    toBePaid: '待支付',
-    toBeShipped: '待发货',
-    toBeReceived: '待收货',
-    completed: '已完成',
-    allOrders: '全部订单',
-    orderStatus: '订单状态',
-    userName: '用户名',
-    pleaseEnterYourPhoneNumber: '请输入电话',
-    pleaseEnterTheOrderNumber: '请输入订单号',
-    userIdNickname: '用户id|昵称',
-    productInformation: '商品信息',
-    totalPointsConsumed: '总消耗积分',
-    totalConsumptionAmount: '总消耗金额',
-    paymentMethod: '支付方式',
-    balancePayment: '余额支付',
-    weChatPayment: '微信支付',
-    alipayPayment: '支付宝支付',
-    cashPayment: '现金支付',
-    shipping: '发货',
-    more: '更多',
-    orderDetails: '订单详情',
-    deleteOrder: '删除订单',
-    backstageReceiving: '后台收货',
-    pointsMallOrdersXls: '积分商城订单.xls',
-    modifyReceivingStatus: '修改收货状态',
-    receivingInformation: '收货信息',
-    nickname: '用户昵称',
-    consignee: '收货人',
-    contactPhoneNumber: '联系电话',
-    address: '收货地址',
-    productDetails: '商品明细',
-    goodsPicture: '商品图片',
-    productName: '商品名称',
-    orderInformation: '订单信息',
-    logisticsInformation: '物流信息',
-    orderNo: '订单号',
-    quantity: '数量',
-    spendingPoints: '花费积分',
-    payment: '是否支付',
-    whetherToShipOrNot: '是否发货',
-    receiveOrNot: '是否收货',
-    expressCompany: '快递公司',
-    courierNumber: '快递单号',
-    selectType: '选择类型',
-    fillInManually: '手动填写',
-    shippingType: '发货类型',
-    selectCourierCompany: '选择快递公司',
-    pleaseEnterTheCourierSingleNumber: '请输入快递单号',
-    pleaseSelectTheCourierCompany: '请选择快递公司',
-    courierSingleNumberCanNotBeEmpty: '快递单号不能为空',
-    productTitle: '产品标题',
-    pleaseEnterTheProductTitle: '请输入产品标题',
-    selectCategory: '选择商品分类',
-    productCategory: '产品分类',
-    mainPicture: '主图',
-    picture: '图片',
-    pointsConsumption: '消耗积分',
-    price: '商品价格',
-    originalPrice: '商品原价',
-    weight: '权重',
-    inventory: '库存',
-    salesVolume: '销售量',
-    whetherItIsOnTheShelfOrNot: '是否上架',
-    up: '上架',
-    down: '下架',
-    pointsProductsXls: '积分产品.xls',
-    category: '商品分类',
-    groupPicture: '组图',
-    detail: '详情',
-    purchaseAmount: '购买金额',
-    pleaseEnterThePointsConsumed: '请输入消耗积分',
-    pleaseEnterTheAmount: '请输入金额',
-    tips: '当积分与金额都大于0表示此商品需要积分+价格购买',
-    pleaseEnterStock: '请输入库存',
-    pleaseEnterAWeight: '请输入权重',
-    productTitleCannotBeEmpty: '产品标题不能为空',
-    pleaseSelectProductCategory: '请选择商品分类',
-    mainPictureCannotBeEmpty: '主图不能为空',
-    groupPictureCannotBeEmpty: '组图不能为空',
-    detailsCannotBeEmpty: '详情不能为空',
-    pointsConsumedCannotBeEmpty: '消耗积分不能为空',
-    originalPriceCannotBeEmpty: '商品原价不能为空',
-    inventoryCannotBeEmpty: '库存不能为空',
-    uploadImage: '上传图片',
-    availability: '是否可用',
-    imageCannotBeEmpty: '图片不能为空',
-    showOrNotCannotBeEmpty: '是否显现不能为空',
-    weightCannotBeEmpty: '权重不能为空',
-    pointsMallAdvertisementMapManagementXls: '积分商城广告图管理.xls',
-    categoryName: '分类名称',
-    sortByCategory: '分类排序',
-    enableStatus: '开启状态',
-    pleaseInputCategoryName: '请输入分类名称',
-    pleaseInputCategorySorting: '请输入分类排序',
-    categoryNameCannotBeEmpty: '分类名称不能为空',
-    openStatusCannotBeEmpty: '开启状态不能为空',
-    categoryNumber: '分类编号',
-    pointsProductClassificationXls: '积分商品分类.xls'
-  },
-  system: {
-    ipQuery: 'IP 查询',
-    pleaseEnterIpAddress: '请输入 IP 地址',
-    showIpQueryResults: '展示查询 IP 结果',
-    ipAddressCannotBeEmpty: 'IP 地址不能为空',
-    querySuccess: '查询成功',
-    no: '编号',
-    placeName: '地名',
-    superiorDepartment: '上级部门',
-    pleaseSelectTheParentDepartment: '请选择上级部门',
-    departmentName: '部门名称',
-    pleaseEnterADepartmentName: '请输入部门名称',
-    departmentStatus: '部门状态',
-    pleaseSelectDepartmentStatus: '请选择部门状态',
-    displaySort: '显示排序',
-    personInCharge: '负责人',
-    pleaseEnterThePersonInCharge: '请输入负责人',
-    contactPhoneNumber: '联系电话',
-    pleaseInputTheContactPhoneNumber: '请输入联系电话',
-    mailbox: '邮箱',
-    pleaseInputMailbox: '请输入邮箱',
-    status: '状态',
-    pleaseSelectStatus: '请选择状态',
-    parentDepartmentCannotBeEmpty: '上级部门不能为空',
-    departmentNameCannotBeEmpty: '部门名称不能为空',
-    displayOrderCannotBeEmpty: '显示排序不能为空',
-    statusCannotBeEmpty: '状态不能为空',
-    pleaseEnterTheCorrectEmailAddress: '请输入正确的邮箱地址',
-    pleaseEnterTheCorrectCellPhoneNumber: '请输入正确的手机号码',
-    topDepartment: '顶级部门',
-    expandCollapse: '展开/折叠',
-    dictionaryType: '字典类型',
-    dataLabel: '数据标签',
-    dataKeyValue: '数据键值',
-    colorType: '颜色类型',
-    pleaseEnterParameterName: '请输入参数名称',
-    pleaseEnterDataLabel: '请输入数据标签',
-    pleaseEnterDataKeyValue: '请输入数据键值',
-    pleaseEnterCSSClass: '请输入CSS Class',
-    pleaseEnterContent: '请输入内容',
-    dataLabelCannotBeEmpty: '数据标签不能为空',
-    dataKeyValueCannotBeEmpty: '数据键值不能为空',
-    dataOrderCannotBeEmpty: '数据顺序不能为空',
-    default: '默认',
-    primary: '主要',
-    success: '成功',
-    information: '信息',
-    warning: '警告',
-    danger: '危险',
-    dictionaryName: '字典名称',
-    dictionaryLabel: '字典标签',
-    pleaseEnterDictionaryLabel: '请输入字典标签',
-    dataStatus: '数据状态',
-    dictionaryCode: '字典编码',
-    dictionaryKeyValue: '字典键值',
-    dictionarySort: '字典排序',
-    dictionaryDataXls: '字典数据.xls',
-    pleaseEnterDictionaryName: '请输入字典名称',
-    dictionaryNameCannotBeEmpty: '字典名称不能为空',
-    dictionaryTypeCannotBeEmpty: '字典类型不能为空',
-    dictionaryNumber: '字典编号',
-    pleaseEnterDictionaryType: '请输入字典类型',
-    pleaseSelectDictionaryStatus: '请选择字典状态',
-    newAdd: '新增',
-    export: '导出',
-    data: '数据',
-    dictionaryTypeXls: '字典类型.xls',
-    userName: '用户名称',
-    loginAddress: '登录地址',
-    loginDate: '登录日期',
-    pleaseEnterUserName: '请输入用户名称',
-    pleaseEnterLoginAddress: '请输入登录地址',
-    logNumber: '日志编号',
-    operationType: '操作类型',
-    browser: '浏览器',
-    loginResult: '登陆结果',
-    details: '详情',
-    loginLogxls: '登录日志.xls',
-    email: '邮箱',
-    password: '密码',
-    SMTPserverDomainName: 'SMTP 服务器域名',
-    SMTPserverPort: 'SMTP 服务器端口',
-    whetherToEnableSSL: '是否开启 SSL',
-    whetherToEnableSTARTTLS: '是否开启 STARTTLS',
-    creationTime: '创建时间',
-    operation: '操作',
-    number: '编号',
-    cache: '缓存',
-    noCache: '不缓存',
-    cacheStatus: '缓存状态',
-    always: '总是',
-    no1: '不是',
-    cache1: '选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段',
-    cache2: '选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单',
-    cache3: '选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问',
-    cache4: "Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)",
-    cache5: '访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头',
-    cache6: '例如说:SystemUser',
-    pushSucceeded: '推送成功',
-    isItNecessaryToPushTheSelectedNotification: '是否推送所选中通知?',
-    sendingTime: '发送时间',
-    receivingEmail: '接收邮箱',
-    userId: '用户编号',
-    userType: '用户类型',
-    emailTitle: '邮件标题',
-    emailContent: '邮件内容',
-    emailParameters: '邮箱参数',
-    sendingStatus: '发送状态',
-    emailAccount: '邮箱账号',
-    sendingEmailAddress: '发送邮箱地址',
-    templateNumber: '模板编号',
-    templateCode: '模板编码',
-    templateSenderName: '模版发送人名称',
-    sendingReturnedMessageNumber: '发送返回的消息编号',
-    sendingException: '发送异常',
-    test: '测试',
-    templateContent: '模板内容',
-    recipientEmail: '收件邮箱',
-    enterRecipientEmail: '输入收件邮箱',
-    pleaseEnter: '请输入',
-    emailCannotBeEmpty: '邮箱不能为空',
-    templateNumberCannotBeEmpty: '模版编号不能为空',
-    templateName: '模板名称',
-    templateTitle: '模板标题',
-    senderName: '发送人名称',
-    enableStatus: '开启状态',
-    remarks: '备注',
-    menuName: '菜单名称',
-    menuNameEn: '菜单名称(EN)',
-    menuNameJp: '菜单名称(JP)',
-    pleaseEnterMenuName: '请输入菜单名称',
-    pleaseSelectMenuStatus: '请选择菜单状态',
-    refreshMenuCache: '刷新菜单缓存',
-    permissionIdentity: '权限标识',
-    componentPath: '组件路径',
-    componentName: '组件名称',
-    browserShow: '即将更新缓存刷新浏览器!',
-    parentMenu: '上级菜单',
-    menuType: '菜单类型',
-    menuIcon: '菜单图标',
-    routeAddress: '路由地址',
-    componentAddress: '组件地址',
-    menuStatus: '菜单状态',
-    displayStatus: '显示状态',
-    alwaysDisplay: '总是显示',
-    pleaseEnterRouteAddress: '请输入路由地址',
-    pleaseEnterPermissionIdentity: '请输入权限标识',
-    menuNameCannotBeEmpty: '菜单名称不能为空',
-    menuOrderCannotBeEmpty: '菜单顺序不能为空',
-    routeAddressCannotBeEmpty: '路由地址不能为空',
-    thePathMustStartWith: '路径必须以 / 开头',
-    thePathCannotStartWith: '路径不能以 / 开头',
-    mainCategory: '主类目',
-    announcementTitle: '公告标题',
-    announcementStatus: '公告状态',
-    announcementNumber: '公告编号',
-    coverImage: '封面图片',
-    announcementType: '公告类型',
-    pleaseEnterAnnouncementTitle: '请输入公告标题',
-    pleaseSelectAnnouncementStatus: '请选择公告状态',
-    push: '推送',
-    announcementContent: '公告内容',
-    pleaseSelectAnnouncementType: '请选择公告类型',
-    pleaseEnterRemarks: '请输备注',
-    announcementTitleCannotBeEmpty: '公告标题不能为空',
-    coverImageCannotBeEmpty: '封面图不能为空',
-    announcementTypeCannotBeEmpty: '公告类型不能为空',
-    announcementContentCannotBeEmpty: '公告内容不能为空',
-    templateType: '模版类型',
-    templateParameters: '模版参数',
-    isRead: '是否已读',
-    readingTime: '阅读时间',
-    pleaseEnterUserId: '请输入用户编号',
-    pleaseSelectUserType: '请选择用户类型',
-    pleaseEnterTemplateCode: '请输入模板编码',
-    pleaseSelectTemplateType: '请选择模版类型',
-    markAsRead: '标记已读',
-    markAllAsRead: '全部已读',
-    sender: '发送人',
-    messageContent: '消息内容',
-    read: '已读',
-    messageDetails: '消息详情',
-    pleaseEnterTemplateName: '请输入模板名称',
-    pleaseSelectEnableStatus: '请选择开启状态',
-    pleaseEnterSenderName: '请输入发件人名称',
-    pleaseEnterTemplateContent: '请输入模板内容',
-    messageTypeCannotBeEmpty: '消息类型不能为空',
-    enableStatusCannotBeEmpty: '开启状态不能为空',
-    templateCodeCannotBeEmpty: '模板编码不能为空',
-    templateNameCannotBeEmpty: '模板名称不能为空',
-    senderNameCannotBeEmpty: '发件人姓名不能为空',
-    templateContentCannotBeEmpty: '模板内容不能为空',
-    additionSuccessful: '新增成功',
-    ModificationSuccessful: '修改成功',
-    recipientID: '接收人ID',
-    recipient: '接收人',
-    redirectableURIAddress: '可重定向的 URI 地址',
-    pleaseEnterRedirectableURIAddress: '请输入可重定向的 URI 地址',
-    pleaseSelectRecipient: '请选择接收人',
-    userIdCannotBeEmpty: '用户编号不能为空',
-    submissionAndSendingWereSuccessfulTheSendingResultPleaseReferToTheSendingLogNumber: '提交发送成功!发送结果,见发送日志编号:',
-    clientNumber: '客户端编号',
-    clientSecretKey: '客户端密钥',
-    appName: '应用名',
-    appIcon: '应用图标',
-    appDescription: '应用描述',
-    validityPeriodOfAccessToken: '访问令牌的有效期',
-    validityPeriodOfRefreshToken: '刷新令牌的有效期',
-    authorizationType: '授权类型',
-    authorizationScope: '授权范围',
-    automaticAuthorizationScope: '自动授权范围',
-    redirectable: '可重定向的',
-    permissions: '权限',
-    resources: '资源',
-    additionalInformation: '附加信息',
-    pleaseEnterClientNumber: '请输入客户端编号',
-    pleaseEnterClientSecretKey: '请输入客户端密钥',
-    pleaseEnterAppName: '请输入应用名',
-    unitSeconds: '单位:秒',
-    pleaseEnterAuthorizationType: '请输入授权类型',
-    pleaseEnterAuthorizationScope: '请输入授权范围',
-    pleaseEnterRedirectable: '请输入可重定向的',
-    pleaseEnterPermissions: '请输入权限',
-    pleaseEnterResources: '请输入资源',
-    pleaseEnterAdditionalInformationJSON: '请输入附加信息,JSON 格式数据',
-    clientNumberCannotBeEmpty: '客户端编号不能为空',
-    clientSecretKeyCannotBeEmpty: '客户端密钥不能为空',
-    appNameCannotBeEmpty: '应用名不能为空',
-    appIconCannotBeEmpty: '应用图标不能为空',
-    validityPeriodOfAccessTokenCannotBeEmpty: '访问令牌的有效期不能为空',
-    validityPeriodOfRefreshTokenCannotBeEmpty: '刷新令牌的有效期不能为空',
-    redirectableURIAddressCannotBeEmpty: '可重定向的 URI 地址不能为空',
-    authorizationTypeCannotBeEmpty: '授权类型不能为空',
-    whetherToForceTheUserToLogOut: '是否要强制退出用户',
-    forceLogout: '强退',
-    clientId: '客户端编号',
-    accessToken: '访问令牌',
-    refreshToken: '刷新令牌',
-    expirationTime: '过期时间',
-    pleaseEnterClientId: '请输入客户端编号',
-    operator: '操作人',
-    operationModule: '操作模块',
-    operationContent: '操作内容',
-    operationTime: '操作时间',
-    businessNumber: '业务编号',
-    operatorLogXls: '操作人',
-    operationName: '操作名',
-    IP: 'IP',
-    pleaseEnterOperator: '请输入操作人员',
-    pleaseEnterOperationModule: '请输入操作模块',
-    pleaseEnterOperationName: '请输入操作名',
-    pleaseEnterBusinessNumber: '请输入业务编号',
-    logPrimaryKey: '日志主键',
-    linkTracing: '链路追踪',
-    operatorId: '操作人编号',
-    operatorName: '操作人名字',
-    operatorIP: '操作人IP',
-    operatorUA: '操作人UA',
-    operationExtendedParameters: '操作拓展参数',
-    requestURL: '请求URL',
-    positionName: '岗位名称',
-    positionCode: '岗位编码',
-    positionNumber: '岗位编号',
-    positionOrder: '岗位顺序',
-    positionRemarks: '岗位备注',
-    pleaseEnterPositionName: '请输入岗位名称',
-    pleaseEnterPositionCode: '请输入岗位编码',
-    positionListXls: '岗位列表.xls',
-    positionTitle: '岗位标题',
-    pleaseEnterPositionTitle: '请输入岗位标题',
-    pleaseEnterPositionOrder: '请输入岗位顺序',
-    positionTitleCannotBeEmpty: '岗位标题不能为空',
-    positionCodeCannotBeEmpty: '岗位编码不能为空',
-    positionStatusCannotBeEmpty: '岗位状态不能为空',
-    positionContentCannotBeEmpty: '岗位内容不能为空',
-    roleName: '角色名称',
-    roleIdentity: '角色标识',
-    roleNumber: '角色编号',
-    roleType: '角色类型',
-    displayOrder: '显示顺序',
-    pleaseEnterRoleName: '请输入角色名称',
-    pleaseEnterRoleIdentity: '请输入角色标识',
-    menuPermissions: '菜单权限',
-    dataPermissions: '数据权限',
-    selectAllDeselectAll: '全选/全不选:',
-    expandAllCollapseAll: '全部展开/折叠:',
-    permissionScope: '权限范围',
-    pleaseEnterDisplayOrder: '请输入显示顺序',
-    roleNameCannotBeEmpty: '角色名称不能为空',
-    roleIdentityCannotBeEmpty: '角色标识不能为空',
-    remarksCannotBeEmpty: '备注不能为空',
-    roleListXls: '角色列表.xls',
-    parentChildLinkage: '父子联动(选中父节点,自动选择子节点):',
-    loadingPleaseWaitAMoment: '加载中,请稍后',
-    pleaseSelectChannelCode: '请选择渠道编码',
-    smsSignatureCannotBeEmpty: '短信签名不能为空',
-    channelCodeCannotBeEmpty: '渠道编码不能为空',
-    theAccountOfSmsAPICannotBeEmpty: '短信  API 的账号不能为空',
-    theAccountOfSmsAPI: '短信 API 的账号',
-    theSecretKeyOfSmsAPI: '短信 API 的密钥',
-    smsSendingCallbackURL: '短信发送回调 URL',
-    pleaseEntertheAccountOfSmsAPI: '请输入短信 API 的账号',
-    pleaseEntertheSecretKeyOfSmsAPI: '请输入短信 API 的密钥',
-    pleaseEnterSmsSendingCallbackURL: '请输入短信发送回调 URL',
-    smsLogXls: '短信日志.xls',
-    smsSignature: '短信签名',
-    channelCode: '渠道编码',
-    sms: '短信',
-    smsSendingCallback: '短信发送回调',
-    pleaseEnterSmsSignature: '请输入短信签名',
-    phoneNumber: '手机号',
-    smsChannel: '短信渠道',
-    receivingStatus: '接收状态',
-    receivingTime: '接收时间',
-    smsContent: '短信内容',
-    templateNumberOfSmsAPI: '短信 API 的模板编号',
-    pleaseEnterTemplateNumberOfSmsAPI: '请输入短信 API 的模板编号',
-    smsTemplateXls: '短信模板.xls',
-    smsType: '短信类型',
-    pleaseEnterPhoneNumber: '请输入手机号',
-    pleaseSelectSmsChannel: '请选择短信渠道',
-    pleaseEnterTemplateNumber: '请输入模板编号',
-    pleaseSelectSendingStatus: '请选择发送状态',
-    pleaseSelectReceivingStatus: '请选择接收状态',
-    smsTemplate: '短信模板',
-    templateNumberOfAPI: 'API 的模板编号',
-    userInformation: '用户信息',
-    smsParameters: '短信参数',
-    APIsmsResult: 'API 发送结果',
-    APIsmsNumber: 'API 短信编号',
-    APIrequestNumber: 'API 请求编号',
-    APIreceivingStatus: 'API 接收状态',
-    APIreceivingResult: 'API 接收结果',
-    smsChannelNumber: '短信渠道编号',
-    smsAPITemplateNumber: '短信 API 模板编号',
-    pleaseSelectSmsChannelNumber: '请选择短信渠道编号',
-    pleaseSelectSmsType: '请选择短信类型',
-    pleaseEnterSms: '请输入短信 API 的模板编号',
-    pleaseEnterTheTemplateNumberOfTheSmsAPI: '请输入短信 API 的模板编号',
-    phoneNumberCannotBeEmpty: '手机不能为空',
-    smsTypeCannotBeEmpty: '短信类型不能为空',
-    theTemplateNumberOfTheSmsAPICannotBeEmpty: '短信 API 的模板编号不能为空',
-    smsChannelNumberCannotBeEmpty: '短信渠道编号不能为空',
-    submitTips: '提交发送成功!发送结果,见发送日志编号:',
-    pleaseSelectSocialPlatform: '请选择社交平台',
-    pleaseEnterClientNumberTips: '请输入客户端编号,对应各平台的appKey',
-    pleaseEnterClientSecretKeyTips: '请输入客户端密钥,对应各平台的appSecret',
-    authorizedPartyWebApplicationTips: '授权方的网页应用 ID,有则填',
-    socialPlatformCannotBeEmpty: '社交平台不能为空',
-    userTypeCannotBeEmpty: '用户类型不能为空',
-    socialOpenid: '社交 openid',
-    pleaseEnterSocialOpenid: '请输入社交 openid',
-    social: '社交',
-    updateTime: '更新时间',
-    socialPlatform: '社交平台',
-    userAvatar: '用户头像',
-    socialToken: '社交 token',
-    originalTokenData: '原始 Token 数据',
-    originalUserData: '原始 User 数据',
-    lastAuthenticationCode: '最后一次的认证 code',
-    lastAuthenticationState: '最后一次的认证 state',
-    tenantName: '租户名',
-    contactPerson: '联系人',
-    tenantStatus: '租户状态',
-    tenantId: '租户编号',
-    tenantPackage: '租户套餐',
-    accountQuota: '账号额度',
-    boundDomainName: '绑定域名',
-    pleaseEnterTenantName: '请输入租户名',
-    pleaseEnterContactPerson: '请输入联系人',
-    pleaseEnterContactPhoneNumber: '请输入联系手机',
-    pleaseSelectTenantStatus: '请选择租户状态',
-    systemTenant: '系统租户',
-    tenantListXls: '租户列表.xls',
-    tenantNameCannotBeEmpty: '租户名不能为空',
-    tenantPackageCannotBeEmpty: '租户套餐不能为空',
-    contactPersonCannotBeEmpty: '联系人不能为空',
-    tenantStatusCannotBeEmpty: '租户状态不能为空',
-    accountQuotaCannotBeEmpty: '账号额度不能为空',
-    expirationTimeCannotBeEmpty: '过期时间不能为空',
-    boundDomainNameCannotBeEmpty: '绑定域名不能为空',
-    userNameCannotBeEmpty: '用户名称不能为空',
-    userPasswordCannotBeEmpty: '用户密码不能为空',
-    userPassword: '用户密码',
-    pleaseSelectTenantPackage: '请选择租户套餐',
-    loadingPleaseWaitAWhile: '加载中,请稍候',
-    packageNameCannotBeEmpty: '套餐名不能为空',
-    associatedMenuNumberCannotBeEmpty: '关联的菜单编号不能为空',
-    pleaseEnterUserPassword: '请输入用户密码',
-    pleaseEnterAccountQuota: '请输入账号额度',
-    pleaseSelectExpirationTime: '请选择过期时间',
-    pleaseEnterBoundDomainName: '请输入绑定域名',
-    packageName: '套餐名',
-    packageNumber: '套餐编号',
-    pleaseEnterPackageName: '请输入套餐名',
-    menuPermission: '菜单权限',
-    department: '部门',
-    userStatus: '用户状态',
-    userDataXls: '用户数据.xls',
-    assignRole: '分配角色',
-    role: '角色',
-    pleaseSelectRole: '请选择角色',
-    affiliatedDepartment: '归属部门',
-    userGender: '用户性别',
-    position: '岗位',
-    pleaseSelectAffiliatedDepartment: '请选择归属部门',
-    pleaseEnterEmail: '请输入邮箱',
-    userNicknameCannotBeEmpty: '用户昵称不能为空',
-    pleaseEnterTheCorrectPhoneNumber: '请输入正确的手机号码',
-    modificationSucceededTheNewPasswordIs: '修改成功,新密码是:',
-    userImport: '用户导入',
-    dragTheFileHereOr: '将文件拖到此处,或',
-    clickToUpload: '点击上传',
-    whetherToUpdateExistingUserData: '是否更新已经存在的用户数据',
-    onlyFilesInXlsAndXlsxFormatsAreAllowedForImport: '仅允许导入 xls、xlsx 格式文件。',
-    downloadTemplate: '下载模板',
-    uploadFailedPleaseUploadAgain: '上传失败,请您重新上传!',
-    atMostOnlyOneFileCanBeUploaded: '最多只能上传一个文件!',
-    userImportTemplateXls: '用户导入模版.xls',
-    numberOfSuccessfulUploads: '上传成功数量:',
-    numberOfFailedUploads: '上传成功数量:',
-    numberOfFailedUpdates: '更新失败数量:',
-    pleaseUploadTheFile: '请上传文件',
-    allHaveBeenMarkedAsReadSuccessfully:'全部已读成功!',
-    batchMarkingAsReadWasSuccessful:'批量已读成功!',
-    testSending:'测试发送',
-    update: '更新/修改'
-  },
-  public: {
-    all: '全部',
-    sort: '排序',
-    operate: '操作',
-    status: '状态',
-    startDate: '开始日期',
-    endDate: '结束日期',
-    delete: '删除',
-    createTime: '创建时间',
-    none: '无',
-    close: '关闭',
-    normal: '正常',
-    addTime: '添加时间',
-    no: '否',
-    yes: '是',
-    more: '更多',
-    startTime: '开始时间',
-    endTime: '结束时间',
-    up: '上架',
-    down: '下架',
-    enable: '启用',
-    disable: '禁用',
-    remark: '备注',
-    pleaseEnterNotes: '请输入备注',
-    expand: '展开',
-    collapse: '折叠',
-    scord: '秒',
-    update: '更新'
-  },
-  'OAuth 2.0': 'OAuth 2.0', // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
-  update: {
-    update: '更新'
-  },
-  dict: {
-    typeUpdate: '字典类型编辑',
-    dataUpdate: '字典数据编辑',
-    update: '更新'
-  }
+  'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
 }

+ 1 - 13
src/main.ts

@@ -43,12 +43,6 @@ import VueUeditorWrap from 'vue-ueditor-wrap'
 
 import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患
 
-// 导入全局图片组件
-import AppImage from '@/components/common/AppImage.vue'
-
-// 导入图片处理指令
-import { setupImageDirective } from '@/directives/image'
-
 // 创建实例
 const setupAll = async () => {
   const app = createApp(App)
@@ -68,12 +62,6 @@ const setupAll = async () => {
 
   setupAuth(app)
 
-  // 注册全局图片组件
-  app.component('AppImage', AppImage)
-
-  // 注册图片处理指令
-  setupImageDirective(app)
-
   await router.isReady()
 
   app.use(VueDOMPurifyHTML)
@@ -83,4 +71,4 @@ const setupAll = async () => {
 
 setupAll()
 
-Logger.prettyPrimary(`Tabemate Pro  オーダーシステムへようこそ`)
+Logger.prettyPrimary(`欢迎使用`, import.meta.env.VITE_APP_TITLE)

+ 9 - 12
src/permission.ts

@@ -21,20 +21,17 @@ const createI18nOptions = async (): Promise<I18nOptions> => {
   })
 
   return {
-    legacy: false, // 是否使用 Vue I18n Legacy API,false 表示使用 Composition API
-    locale: locale.lang, // 当前语言
-    fallbackLocale: locale.lang, // 回退语言,当前语言的翻译没有找到时会使用这个语言
-    // globalInjection: true,
+    legacy: false,
+    locale: locale.lang,
+    fallbackLocale: locale.lang,
     messages: {
-      [locale.lang]: message // 语言包信息
+      [locale.lang]: message
     },
-    availableLocales: localeMap.map((v) => v.lang), // 可用的语言列表
-    sync: true, // 是否将根组件的语言环境与 Vue 实例同步
-    silentTranslationWarn: false, // 是否禁止翻译警告,true 表示禁止
-    missingWarn: true, // 是否在缺少翻译时发出警告,false 表示不警告
-    silentFallbackWarn: false, // 是否禁止 fallback 时的警告,true 表示禁止
-    fallbackWarn: false, // 是否在 fallback 时发出警告,false 表示不警告
-    warnHtmlMessage: false // 是否在 HTML 消息中发出警告,false 表示不警告
+    availableLocales: localeMap.map((v) => v.lang),
+    sync: true,
+    silentTranslationWarn: true,
+    missingWarn: false,
+    silentFallbackWarn: true
   }
 }
 

+ 1 - 11
src/router/index.ts

@@ -40,7 +40,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
     children: [
       {
         path: '/redirect/:path(.*)',
-        name: 'RedirectChild',
+        name: 'Redirect1',
         component: () => import('@/views/Redirect/Redirect.vue'),
         meta: {}
       }
@@ -184,16 +184,6 @@ const remainingRouter: AppRouteRecordRaw[] = [
       noTagsView: true
     }
   },
-  {
-    path: '/register',
-    component: () => import('@/views/Login/Register.vue'),
-    name: 'Register',
-    meta: {
-      hidden: true,
-      title: t('router.register'),
-      noTagsView: true
-    }
-  },
   {
     path: '/sso',
     component: () => import('@/views/Login/Login.vue'),

+ 11 - 11
src/store/index.ts

@@ -63,32 +63,32 @@ export const useAppStore = defineStore('app', {
       fixedHeader: true, // 固定toolheader
       footer: true, // 显示页脚
       greyMode: false, // 是否开始灰色模式,用于特殊悼念日
-      fixedMenu: wsCache.get('fixedMenu') || false, // 是否固定菜单
+      fixedMenu: true, // 是否固定菜单
 
-      layout: wsCache.get(CACHE_KEY.LAYOUT) || 'classic', // layout布局
+      layout: 'cutMenu', // layout布局
       isDark: wsCache.get(CACHE_KEY.IS_DARK) || false, // 是否是暗黑模式
       currentSize: wsCache.get('default') || 'default', // 组件尺寸
       theme: wsCache.get(CACHE_KEY.THEME) || {
         // 主题色
         elColorPrimary: '#409eff',
         // 左侧菜单边框颜色
-        leftMenuBorderColor: 'inherit',
+        leftMenuBorderColor: '#eee',
         // 左侧菜单背景颜色
-        leftMenuBgColor: '#001529',
+        leftMenuBgColor: '#fff',
         // 左侧菜单浅色背景颜色
-        leftMenuBgLightColor: '#0f2438',
+        leftMenuBgLightColor: '#fff',
         // 左侧菜单选中背景颜色
-        leftMenuBgActiveColor: 'var(--el-color-primary)',
+        leftMenuBgActiveColor: 'RGBA(64,158,255,0.1)',
         // 左侧菜单收起选中背景颜色
-        leftMenuCollapseBgActiveColor: 'var(--el-color-primary)',
+        leftMenuCollapseBgActiveColor: 'RGBA(64,158,255,0.1)',
         // 左侧菜单字体颜色
-        leftMenuTextColor: '#bfcbd9',
+        leftMenuTextColor: '#333',
         // 左侧菜单选中字体颜色
-        leftMenuTextActiveColor: '#fff',
+        leftMenuTextActiveColor: 'var(--el-color-primary)',
         // logo字体颜色
-        logoTitleTextColor: '#fff',
+        logoTitleTextColor: 'inherit',
         // logo边框颜色
-        logoBorderColor: 'inherit',
+        logoBorderColor: '#eee',
         // 头部背景颜色
         topHeaderBgColor: '#fff',
         // 头部字体颜色

+ 0 - 1
src/store/modules/dict.ts

@@ -41,7 +41,6 @@ export const useDictStore = defineStore('dict', {
   actions: {
     async setDictMap() {
       const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE)
-      console.log("🚀 ~ setDictMap ~ dictMap:", dictMap)
       if (dictMap) {
         this.dictMap = dictMap
         this.isSetDict = true

+ 0 - 6
src/store/modules/locale.ts

@@ -2,7 +2,6 @@ import { defineStore } from 'pinia'
 import { store } from '../index'
 import zhCn from 'element-plus/es/locale/lang/zh-cn'
 import en from 'element-plus/es/locale/lang/en'
-import ja from 'element-plus/es/locale/lang/ja'
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 import { LocaleDropdownType } from '@/types/localeDropdown'
 
@@ -10,7 +9,6 @@ const { wsCache } = useCache()
 
 const elLocaleMap = {
   'zh-CN': zhCn,
-  ja: ja, // 注册日语
   en: en
 }
 interface LocaleState {
@@ -34,10 +32,6 @@ export const useLocaleStore = defineStore('locales', {
         {
           lang: 'en',
           name: 'English'
-        },
-        {
-          lang: 'ja',
-          name: '日本語'
         }
       ]
     }

+ 1 - 2
src/store/modules/lock.ts

@@ -38,8 +38,7 @@ export const usePermissionStore = defineStore('permission', {
         if (wsCache.get(CACHE_KEY.ROLE_ROUTERS)) {
           res = wsCache.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[]
         }
-        const lang = wsCache.get(CACHE_KEY.LANG)
-        const routerMap: AppRouteRecordRaw[] = generateRoute(res,lang)
+        const routerMap: AppRouteRecordRaw[] = generateRoute(res)
         // 动态路由,404一定要放到最后面
         this.addRouters = routerMap.concat([
           {

+ 3 - 4
src/store/modules/simpleWorkflow.ts

@@ -54,14 +54,13 @@ export const useUserStore = defineStore('admin-user', {
         return null
       }
       let userInfo = wsCache.get(CACHE_KEY.USER)
-      // if (!userInfo) {
-      userInfo = await getInfo()
-      // }
+      if (!userInfo) {
+        userInfo = await getInfo()
+      }
       this.permissions = userInfo.permissions
       this.roles = userInfo.roles
       this.user = userInfo.user
       this.isSetUser = true
-      console.log("🚀 ~ setUserInfoAction ~ userInfo.menus:", userInfo.menus)
       wsCache.set(CACHE_KEY.USER, userInfo)
       wsCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus)
     },

+ 1 - 1
src/styles/FormCreate/fonts/fontello.woff

@@ -1,4 +1,4 @@
-@use './variables.scss' as *;
+@import './variables.scss';
 // 导出变量
 :export {
   namespace: $namespace;

+ 1 - 1
src/styles/index.scss

@@ -1,5 +1,5 @@
-@use './FormCreate/index.scss';
 @import './var.css';
+@import './FormCreate/index.scss';
 @import 'element-plus/theme-chalk/dark/css-vars.css';
 
 .reset-margin [class*='el-icon'] + span {

+ 0 - 1
src/styles/theme.scss

@@ -63,5 +63,4 @@ html,
 body {
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
-  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
 }

+ 0 - 86
src/styles/variables.scss

@@ -1,86 +0,0 @@
-/**
- * 图片URL处理工具
- * 将远程图片URL转换为本地路径
- *
- * @author 系统开发团队
- * @date 2023-05-15
- * @version 1.0.0
- * @description
- *   该工具用于处理图片URL,支持将远程图片URL转换为本地路径。
- *   主要用于开发环境中,可以通过环境变量控制是否启用本地图片映射。
- *   简化处理逻辑:只处理以 /admin-api/ 开头的路径,本地路径和http/https URL不处理。
- */
-import { getMappedImagePath } from '@/config/image-mapping'
-
-/**
- * 转换图片URL为本地路径
- * @param url 原始图片URL
- * @returns 转换后的URL
- *
- * @example
- * // 返回原始URL(未启用本地映射)
- * convertImageUrl('http://example.com/image.jpg')
- *
- * @example
- * // 返回本地路径(启用本地映射)
- * convertImageUrl('/admin-api/infra/file/1/get/image.jpg')
- * // 返回: 'https://api.ifoodme.com/admin-api/infra/file/1/get/image.jpg'
- */
-export const convertImageUrl = (url: string): string => {
-  if (!url) return ''
-
-  // 判断是否启用本地图片映射
-  const useLocalMapping = import.meta.env.VITE_USE_LOCAL_IMAGES === 'true'
-  if (!useLocalMapping) return url
-
-  // 首先检查是否有特定的映射配置
-  const mappedPath = getMappedImagePath(url)
-  if (mappedPath) {
-    return mappedPath
-  }
-
-  // 如果是http或https开头的URL,不处理
-  if (url.startsWith('http://') || url.startsWith('https://')) {
-    return url
-  }
-
-  // 如果是本地路径(不以/admin-api/开头),不处理
-  if (!url.startsWith('/admin-api/')) {
-    return url
-  }
-
-  // 处理以/admin-api/开头的路径
-  // 在原来的URL基础上追加localImageBase前缀
-  const localImageBase = import.meta.env.VITE_LOCAL_IMAGE_BASE || 'https://api.ifoodme.com'
-
-  // 不替换前缀,而是追加前缀
-  return `${localImageBase}${url}`
-}
-
-/**
- * 检查URL是否为图片
- * @param url 要检查的URL
- * @returns 是否为图片URL
- *
- * @example
- * isImageUrl('image.jpg') // 返回: true
- * isImageUrl('document.pdf') // 返回: false
- */
-export const isImageUrl = (url: string): boolean => {
-  if (!url) return false
-  return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url)
-}
-
-/**
- * 获取图片文件名
- * @param url 图片URL
- * @returns 文件名
- *
- * @example
- * getImageFileName('http://example.com/images/photo.jpg') // 返回: 'photo.jpg'
- */
-export const getImageFileName = (url: string): string => {
-  if (!url) return ''
-  const parts = url.split('/')
-  return parts[parts.length - 1]
-}

+ 20 - 20
src/utils/index.ts

@@ -61,30 +61,20 @@ export const getRawRoute = (route: RouteLocationNormalized): RouteLocationNormal
 }
 
 // 后端控制路由生成
-export const generateRoute = (routes: AppCustomRouteRecordRaw[], lang): AppRouteRecordRaw[] => {
+export const generateRoute = (routes: AppCustomRouteRecordRaw[]): AppRouteRecordRaw[] => {
   const res: AppRouteRecordRaw[] = []
   const modulesRoutesKeys = Object.keys(modules)
   for (const route of routes) {
     // 1. 生成 meta 菜单元数据
-    let title = route.nameEn
-    switch (lang) {
-      case 'zh-CN':
-        title = route.name
-        break
-      case 'en':
-        title = route.nameEn
-        break
-      case 'ja':
-        title = route.nameJp
-        break
-    }
-
     const meta = {
-      title: title,
+      title: route.name,
       icon: route.icon,
       hidden: !route.visible,
       noCache: !route.keepAlive,
-      alwaysShow: route.children && route.children.length === 1 && (route.alwaysShow !== undefined ? route.alwaysShow : true)
+      alwaysShow:
+        route.children &&
+        route.children.length === 1 &&
+        (route.alwaysShow !== undefined ? route.alwaysShow : true)
     } as any
     // 特殊逻辑:如果后端配置的 MenuDO.component 包含 ?,则表示需要传递参数
     // 此时,我们需要解析参数,并且将参数放到 meta.query 中
@@ -99,7 +89,10 @@ export const generateRoute = (routes: AppCustomRouteRecordRaw[], lang): AppRoute
     // 路由地址转首字母大写驼峰,作为路由名称,适配keepAlive
     let data: AppRouteRecordRaw = {
       path: route.path.indexOf('?') > -1 ? route.path.split('?')[0] : route.path,
-      name: route.componentName && route.componentName.length > 0 ? route.componentName : toCamelCase(route.path, true),
+      name:
+        route.componentName && route.componentName.length > 0
+          ? route.componentName
+          : toCamelCase(route.path, true),
       redirect: route.redirect,
       meta: meta
     }
@@ -112,7 +105,10 @@ export const generateRoute = (routes: AppCustomRouteRecordRaw[], lang): AppRoute
       meta.alwaysShow = true
       const childrenData: AppRouteRecordRaw = {
         path: '',
-        name: route.componentName && route.componentName.length > 0 ? route.componentName : toCamelCase(route.path, true),
+        name:
+          route.componentName && route.componentName.length > 0
+            ? route.componentName
+            : toCamelCase(route.path, true),
         redirect: route.redirect,
         meta: meta
       }
@@ -145,7 +141,7 @@ export const generateRoute = (routes: AppCustomRouteRecordRaw[], lang): AppRoute
         data.component = modules[modulesRoutesKeys[index]]
       }
       if (route.children) {
-        data.children = generateRoute(route.children, lang)
+        data.children = generateRoute(route.children)
       }
     }
     res.push(data as AppRouteRecordRaw)
@@ -222,7 +218,11 @@ const promoteRouteLevel = (route: AppRouteRecordRaw) => {
 }
 
 // 添加所有子菜单
-const addToChildren = (routes: RouteRecordNormalized[], children: AppRouteRecordRaw[], routeModule: AppRouteRecordRaw) => {
+const addToChildren = (
+  routes: RouteRecordNormalized[],
+  children: AppRouteRecordRaw[],
+  routeModule: AppRouteRecordRaw
+) => {
   for (let index = 0; index < children.length; index++) {
     const child = children[index]
     const route = routes.find((item) => item.name === child.name)

+ 22 - 22
src/utils/tree.ts

@@ -6,16 +6,16 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div  class="acea-row row-between-wrapper">
-                <span>{{t('home.totalMembers')}}</span> 
-                <el-tag type="success">{{t('home.allStores')}}</el-tag>
+                <span>会员总数</span>
+                <el-tag type="success">全门店</el-tag>
               </div>
             </template>
             <div class="content" v-if="count">
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.userCount" :duration="2600" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{t('home.todayOrderCount')}}</span>
-                <span>{{ count.todayCount }} {{t('home.orders')}}</span>
+                <span class="content-time">今日订单数</span>
+                <span>{{ count.todayCount }} </span>
               </div>
             </div>
           </el-card>
@@ -24,7 +24,7 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div class="acea-row row-between-wrapper">
-                <span>{{t('home.totalOrderCount')}}</span>
+                <span>订单总数</span>
                 <el-tag type="success">{{countName}}</el-tag>
               </div>
             </template>
@@ -32,8 +32,8 @@
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.orderCount" :duration="3000" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{t('home.yesterdaysOrderCount')}}</span>
-                <span>{{ count.proCount }} {{t('home.orders')}}</span>
+                <span class="content-time">昨日订单数</span>
+                <span>{{ count.proCount }} </span>
               </div>
             </div>
           </el-card>
@@ -42,7 +42,7 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div  class="acea-row row-between-wrapper">
-                <span>{{t('home.totalAmount')}}</span>
+                <span>总金额</span>
                 <el-tag type="success">{{countName}}</el-tag>
               </div>
             </template>
@@ -50,8 +50,8 @@
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.priceCount" :duration="3200" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{t('home.last7DaysOrderCount')}}</span>
-                <span>{{ count.lastWeekCount }} {{t('home.orders')}}</span>
+                <span class="content-time">近七天订单数</span>
+                <span>{{ count.lastWeekCount }} </span>
               </div>
             </div>
           </el-card>
@@ -60,7 +60,7 @@
           <el-card :bordered="false" dis-hover :padding="12">
             <template #header>
               <div class="acea-row row-between-wrapper">
-                <span>{{t('home.totalProductCount')}}</span>
+                <span>商品总数</span>
                 <el-tag type="success">{{countName}}</el-tag>
               </div>
             </template>
@@ -68,8 +68,8 @@
               <span class="content-number spBlock mb15"><count-to :start-val="0" :end-val="count.goodsCount" :duration="3600" class="card-panel-num" /></span>
               <el-divider />
               <div class="acea-row row-between-wrapper">
-                <span class="content-time">{{t('home.thisMonthOrderCount')}}</span>
-                <span>{{ count.monthCount }} {{t('home.orders')}}</span>
+                <span class="content-time">本月订单数</span>
+                <span>{{ count.monthCount }} </span>
               </div>
             </div>
           </el-card>
@@ -83,14 +83,14 @@
           <el-card shadow="never" class="mt-10px">
             <template #header>
               <div style="font-weight:bold">
-                {{t('home.productSalesRanking')}}({{countName}})
+                  商品销售排行({{countName}})
               </div>
             </template>
             <el-skeleton :loading="loading" animated>
               <el-table :data="count.productTopVO" style="width: 100%">
                 <el-table-column prop="id" label="ID" />
-                <el-table-column prop="goodsName" :label="t('home.productName')" />
-                <el-table-column prop="saleNum" :label="t('home.salesVolume')" />
+                <el-table-column prop="goodsName" label="商品名称" />
+                <el-table-column prop="saleNum" label="销量" />
               </el-table>
             </el-skeleton>
           </el-card>
@@ -99,14 +99,14 @@
           <el-card shadow="never" class="mt-10px">
             <template #header>
               <div style="font-weight:bold">
-                {{t('home.userSpendingRankingAllStores')}}
+                 用户消费排行(全门店)
               </div>
             </template>
             <el-skeleton :loading="loading" animated>
               <el-table :data="count.userTopVO" style="width: 100%">
                 <el-table-column prop="id" label="ID" />
-                <el-table-column prop="nickname" :label="t('login.username')" />
-                <el-table-column prop="price" :label="t('home.consumptionAmount')" />
+                <el-table-column prop="nickname" label="用户名" />
+                <el-table-column prop="price" label="消费金额" />
               </el-table>
             </el-skeleton>
           </el-card>
@@ -125,8 +125,8 @@ import avatarImg from '@/assets/imgs/avatar.gif'
 const userStore = useUserStore()
 const avatar = userStore.getUser.avatar ? userStore.getUser.avatar : avatarImg
 const shopId = userStore.getUser.shopId
+const countName = ref('全门店')
 const { t } = useI18n()
-const countName = ref(t('home.allStores'))
 const count = ref({
         todayPrice: 0,
         todayCount: 0,
@@ -170,7 +170,7 @@ const getList = async () => {
 /** 初始化 **/
 onMounted(() => {
   if(shopId > 0) {
-    countName.value = t('home.currentStore')
+    countName.value = '当前门店'
   }
   getData()
   getList()
@@ -297,7 +297,7 @@ onMounted(() => {
   }
 }
 .baseInfo {
-  :deep(.el-card__header) {
+  ::v-deep .el-card__header {
     padding: 15px 20px !important;
   }
 }

+ 10 - 9
src/views/Home/Index2.vue

@@ -5,7 +5,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/product/store-product' }">
                <Icon icon="ep:goods" style="color: #69c0ff" :size="35" />
-              <p>{{t('home.productManagement')}}</p>
+              <p>商品管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -13,7 +13,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/member/user' }">
               <Icon icon="ep:user" style="color: #95de64" :size="35" />
-              <p>{{t('home.memberManagement')}}</p>
+              <p>会员管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -21,7 +21,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/order/store-order' }">
               <Icon icon="ep:list" style="color: #ff9c6e" :size="35" />
-              <p>{{t('home.orderManagement')}}</p>
+              <p>订单管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -29,7 +29,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/mall/coupons' }">
               <Icon icon="ep:ticket" style="color: #b37feb" :size="35" />
-              <p>{{t('home.couponManagement')}}</p>
+              <p>优惠券管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -37,7 +37,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/shop/web-print' }">
                <Icon icon="ep:postcard" style="color: #ffd666" :size="35" />
-              <p>{{t('home.printerManagement')}}</p>
+              <p>打印机管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -45,7 +45,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/shop/shop' }" >
                <Icon icon="ep:notebook" style="color: #5cdbd3" :size="35" />
-              <p>{{t('home.storeManagement')}}</p>
+              <p>门店管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -53,7 +53,7 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/pay/merchant-details' }">
               <Icon icon="ep:money" style="color: #ff85c0" :size="35" />
-              <p>{{t('home.paymentManagement')}}</p>
+              <p>支付管理</p>
             </router-link>
           </el-card>
         </el-col>
@@ -61,18 +61,19 @@
           <el-card :bordered="false">
             <router-link :to="{ path: '/message/wechat-templateo' }">
               <Icon icon="ep:message" style="color: #ffc069" :size="35" />
-              <p>{{t('home.messageManagement')}}</p>
+              <p>消息管理</p>
             </router-link>
           </el-card>
         </el-col>
       </el-row>
     </div>
+    <!-- <PanelGroupT2 /> -->
 </template>
 <script setup lang="ts">
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+// import PanelGroupT2 from './Index2.vue'
 
 const { wsCache } = useCache()
-const { t } = useI18n()
 
 
 const grid =ref({

+ 0 - 3
src/views/Home/echarts-data.ts

@@ -306,6 +306,3 @@ export const wordOptions = {
     }
   ]
 }
-
-
-

+ 8 - 7
src/views/Home/types.ts

@@ -10,7 +10,7 @@
         <!-- 左上角的 logo + 系统标题 -->
         <div class="flex items-center relative text-white">
           <img alt="" class="w-48px h-48px mr-10px" src="@/assets/imgs/logo.png" />
-          <span class="text-20px font-bold">Tabemate Pro  オーダーシステム</span>
+          <span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
         </div>
         <!-- 左边的背景图 + 欢迎语 -->
         <div class="flex justify-center items-center h-[calc(100%-60px)]">
@@ -20,7 +20,7 @@
             tag="div"
           >
             <img key="1" alt="" class="w-500px" src="@/assets/imgs/login_bg.png" />
-            <div key="2" class="text-3xl text-white" style="text-align: center;">Tabemate Pro  オーダーシステムへようこそ</div>
+            <div key="2" class="text-3xl text-white" style="text-align: center;">{{ t('login.welcome') }}</div>
             <!-- <div key="3" class="mt-5 font-normal text-white text-14px">
               {{ t('login.message') }}
             </div> -->
@@ -30,9 +30,9 @@
       <div class="flex-1 p-30px <sm:p-10px dark:bg-v-dark relative">
         <!-- 右上角的主题、语言选择 -->
         <div class="flex justify-between items-center text-white @2xl:justify-end @xl:justify-end">
-          <div class="flex items-center @2xl:hidden xl:hidden">
-            <img alt="" class="w-48px h-48px mr-10px @gl:hidden" src="@/assets/imgs/logo.png" />
-            <span class="text-20px font-bold c-black">Tabemate Pro  オーダーシステム</span>
+          <div class="flex items-center @2xl:hidden @xl:hidden">
+            <img alt="" class="w-48px h-48px mr-10px" src="@/assets/imgs/logo.png" />
+            <span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
           </div>
           <div class="flex justify-end items-center space-x-10px">
             <!-- <ThemeSwitch /> -->
@@ -62,7 +62,7 @@
   </div>
 </template>
 <script lang="ts" name="Login" setup>
-// import { underlineToHump } from '@/utils'
+import { underlineToHump } from '@/utils'
 
 import { useDesign } from '@/hooks/web/useDesign'
 import { useAppStore } from '@/store/modules/app'
@@ -71,7 +71,8 @@ import { useAppStore } from '@/store/modules/app'
 
 import { LoginForm } from './components'
 // import { LoginForm, MobileForm, QrCodeForm, RegisterForm, SSOLoginVue } from './components'
-// const { t } = useI18n()
+
+const { t } = useI18n()
 const appStore = useAppStore()
 const { getPrefixCls } = useDesign()
 const prefixCls = getPrefixCls('login')

+ 0 - 88
src/views/Login/Register.vue

@@ -1,88 +0,0 @@
-<template>
-  <div :class="prefixCls" class="h-[100%] relative <xl:bg-v-dark <sm:px-10px <xl:px-10px <md:px-10px">
-    <div class="relative h-full flex mx-auto">
-      <div :class="`${prefixCls}__left flex-1 bg-gray-500 bg-opacity-20 relative p-30px <xl:hidden`">
-        <!-- 左上角的 logo + 系统标题 -->
-        <div class="flex items-center relative text-white">
-          <img alt="" class="w-48px h-48px mr-10px" src="@/assets/imgs/logo.png" />
-          <span class="text-20px font-bold">Tabemate Pro オーダーシステム</span>
-        </div>
-        <!-- 左边的背景图 + 欢迎语 -->
-        <div class="flex justify-center items-center h-[calc(100%-60px)]">
-          <TransitionGroup appear enter-active-class="animate__animated animate__bounceInLeft" tag="div">
-            <img key="1" alt="" class="w-500px" src="@/assets/imgs/login_bg.png" />
-            <div key="2" class="text-3xl text-white" style="text-align: center">Tabemate Pro オーダーシステムへようこそ</div>
-            <!-- <div key="3" class="mt-5 font-normal text-white text-14px">
-              {{ t('login.message') }}
-            </div> -->
-          </TransitionGroup>
-        </div>
-      </div>
-      <div class="flex-1 p-30px <sm:p-10px dark:bg-v-dark relative">
-        <!-- 右上角的主题、语言选择 -->
-        <div class="flex justify-between items-center text-white @2xl:justify-end @xl:justify-end">
-          <div class="flex items-center @2xl:hidden xl:hidden">
-            <img alt="" class="w-48px h-48px mr-10px @gl:hidden" src="@/assets/imgs/logo.png" />
-            <span class="text-20px font-bold c-black">Tabemate Pro オーダーシステム</span>
-          </div>
-          <div class="flex justify-end items-center space-x-10px">
-            <!-- <ThemeSwitch /> -->
-            <!-- <LocaleDropdown class="<xl:text-white dark:text-white" /> -->
-          </div>
-        </div>
-        <!-- 右边的登录界面 -->
-        <Transition appear enter-active-class="animate__animated animate__bounceInRight">
-          <div class="h-full flex items-center m-auto w-[100%] @2xl:max-w-500px @xl:max-w-500px @md:max-w-500px @lg:max-w-500px">
-            <!-- 账号登录 -->
-            <!-- <LoginForm class="p-20px h-auto m-auto <xl:(rounded-3xl light:bg-white)" /> -->
-            <!-- 手机登录 -->
-            <!-- <MobileForm class="p-20px h-auto m-auto <xl:(rounded-3xl light:bg-white)" />
-             二维码登录 -->
-            <!-- <QrCodeForm class="p-20px h-auto m-auto <xl:(rounded-3xl light:bg-white)" />
-             注册 -->
-            <RegisterForm class="p-20px h-auto m-auto <xl:(rounded-3xl light:bg-white)" />
-            <!-- 三方登录 -->
-            <!-- <SSOLoginVue class="p-20px h-auto m-auto <xl:(rounded-3xl light:bg-white)" /> -->
-          </div>
-        </Transition>
-      </div>
-    </div>
-  </div>
-</template>
-<script lang="ts" name="Login" setup>
-
-import { useDesign } from '@/hooks/web/useDesign'
-import { useAppStore } from '@/store/modules/app'
-//import { ThemeSwitch } from '@/layout/components/ThemeSwitch'
-//import { LocaleDropdown } from '@/layout/components/LocaleDropdown'
-
-import { RegisterForm } from './components'
-// import { LoginForm, MobileForm, QrCodeForm, RegisterForm, SSOLoginVue } from './components'
-
-// const { t } = useI18n()
-const appStore = useAppStore()
-const { getPrefixCls } = useDesign()
-const prefixCls = getPrefixCls('login')
-appStore.setIsDark(false)
-</script>
-
-<style lang="scss" scoped>
-$prefix-cls: #{$namespace}-login;
-
-.#{$prefix-cls} {
-  &__left {
-    &::before {
-      position: absolute;
-      top: 0;
-      left: 0;
-      z-index: -1;
-      width: 100%;
-      height: 100%;
-      background-image: url('@/assets/svgs/login-bg.svg');
-      background-position: center;
-      background-repeat: no-repeat;
-      content: '';
-    }
-  }
-}
-</style>

+ 1 - 1
src/views/Login/SocialLogin.vue

@@ -289,7 +289,7 @@ const handleLogin = async (params) => {
     }
     loading.value = ElLoading.service({
       lock: true,
-      text: t('login.loadingSystem'),
+      text: '正在加载系统中...',
       background: 'rgba(0, 0, 0, 0.7)'
     })
     if (loginData.loginForm.rememberMe) {

+ 33 - 18
src/views/Login/components/LoginForm.vue

@@ -15,13 +15,8 @@
           <LoginFormTitle style="width: 100%" />
         </el-form-item>
       </el-col>
-      <el-col v-if="locale" :span="24" style="padding-left: 10px; padding-right: 10px">
-        <el-form-item>
-          <LocaleSelect />
-        </el-form-item>
-      </el-col>
       <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
-        <el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">
+       <el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">
           <el-input
             v-model="loginData.loginForm.tenantName"
             :placeholder="t('login.tenantNamePlaceholder')"
@@ -33,7 +28,11 @@
       </el-col>
       <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
         <el-form-item prop="username">
-          <el-input v-model="loginData.loginForm.username" :placeholder="t('login.usernamePlaceholder')" :prefix-icon="iconAvatar" />
+          <el-input
+            v-model="loginData.loginForm.username"
+            :placeholder="t('login.usernamePlaceholder')"
+            :prefix-icon="iconAvatar"
+          />
         </el-form-item>
       </el-col>
       <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
@@ -48,7 +47,10 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" style="padding-left: 10px; padding-right: 10px; margin-top: -20px; margin-bottom: -20px">
+      <el-col
+        :span="24"
+        style="padding-left: 10px; padding-right: 10px; margin-top: -20px; margin-bottom: -20px"
+      >
         <el-form-item>
           <el-row justify="space-between" style="width: 100%">
             <el-col :span="6">
@@ -61,10 +63,23 @@
       </el-col>
       <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
         <el-form-item>
-          <XButton :loading="loginLoading" :title="t('login.login')" class="w-[100%]" type="primary" @click="getCode()" />
+          <XButton
+            :loading="loginLoading"
+            :title="t('login.login')"
+            class="w-[100%]"
+            type="primary"
+            @click="getCode()"
+          />
         </el-form-item>
       </el-col>
-      <Verify ref="verify" :captchaType="captchaType" :imgSize="{ width: '400px', height: '200px' }" mode="pop" @success="handleLogin" />
+      <Verify
+        ref="verify"
+        :captchaType="captchaType"
+        :imgSize="{ width: '400px', height: '200px' }"
+        mode="pop"
+        @success="handleLogin"
+      />
+   
     </el-row>
   </el-form>
 </template>
@@ -79,8 +94,7 @@ import * as authUtil from '@/utils/auth'
 import { usePermissionStore } from '@/store/modules/permission'
 import * as LoginApi from '@/api/login'
 import { LoginStateEnum, useFormValid, useLoginState } from './useLogin'
-import { LocaleSelect } from '@/layout/components/LocaleDropdown'
-import { useAppStore } from '@/store/modules/app'
+
 const { t } = useI18n()
 //const message = useMessage()
 const iconAvatar = useIcon({ icon: 'ep:avatar' })
@@ -94,8 +108,7 @@ const redirect = ref<string>('')
 const loginLoading = ref(false)
 const verify = ref()
 const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字
-const appStore = useAppStore()
-const locale = computed(() => appStore.getLocale)
+
 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN)
 
 const LoginRules = {
@@ -111,17 +124,19 @@ const loginData = reactive({
     tenantName: 'yshop',
     //username: 'yshop002',
     //password: '123456789',
-    username: '',
-    password: '',
+    username: 'admin',
+    password: 'admin123',
     captchaVerification: '',
     rememberMe: false
   }
 })
 
+
+
 // 获取验证码
 const getCode = async () => {
   // 情况一,未开启:则直接登录
-  console.log('oginData.captchaEnable:', loginData.captchaEnable)
+  console.log('oginData.captchaEnable:',loginData.captchaEnable)
   if (loginData.captchaEnable === 'false') {
     await handleLogin({})
   } else {
@@ -166,7 +181,7 @@ const handleLogin = async (params) => {
     }
     ElLoading.service({
       lock: true,
-      text: t('login.loadingSystem'),
+      text: '正在加载系统中...',
       background: 'rgba(0, 0, 0, 0.7)'
     })
     if (loginData.loginForm.rememberMe) {

+ 3 - 3
src/views/Login/components/LoginFormTitle.vue

@@ -58,7 +58,7 @@
                     {{ t('login.getSmsCode') }}
                   </span>
                   <span v-if="mobileCodeTimer > 0" class="getMobileCode" style="cursor: pointer">
-                    {{ mobileCodeTimer }}{{t('login.retrievableAfterSeconds')}}
+                    {{ mobileCodeTimer }}秒后可重新获取
                   </span>
                 </template>
               </el-input>
@@ -133,7 +133,7 @@ const loginData = reactive({
   },
   loginForm: {
     uuid: '',
-    tenantName: t('login.YSHOPSourceCode'),
+    tenantName: 'YSHOP源码',
     mobileNumber: '',
     code: ''
   }
@@ -188,7 +188,7 @@ const signIn = async () => {
   if (!data) return
   ElLoading.service({
     lock: true,
-    text: t('login.loadingSystem'),
+    text: '正在加载系统中...',
     background: 'rgba(0, 0, 0, 0.7)'
   })
   loginLoading.value = true

+ 122 - 177
src/views/Login/components/QrCodeForm.vue

@@ -1,197 +1,142 @@
 <template>
-  <el-form
+  <Form
     v-show="getShow"
-    ref="formLogin"
-    :model="registerData.registerForm"
-    :rules="RegisterRules"
-    class="login-form"
+    :rules="rules"
+    :schema="schema"
+    class="dark:(border-1 border-[var(--el-border-color)] border-solid)"
+    hide-required-asterisk
     label-position="top"
-    label-width="120px"
     size="large"
+    @register="register"
   >
-    <el-row>
-      <el-col :span="24">
-        <el-form-item>
-          <LoginFormTitle />
-        </el-form-item>
-      </el-col>
-      <el-col v-if="locale" :span="24">
-        <el-form-item>
-          <LocaleSelect />
-        </el-form-item>
-      </el-col>
-      <!-- <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
-        <el-form-item v-if="registerData.tenantEnable === 'true'" prop="tenantName">
-          <el-input
-            v-model="registerData.registerForm.tenantName"
-            :placeholder="t('login.tenantNamePlaceholder')"
-            :prefix-icon="iconHouse"
-            type="primary"
-            link
-          />
-        </el-form-item>
-      </el-col> -->
-      <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
-        <el-form-item prop="mobile">
-          <el-input v-model="registerData.registerForm.mobile" :placeholder="t('login.mobileNumber')" :prefix-icon="iconAvatar" />
-        </el-form-item>
-      </el-col>
-      <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
-        <el-form-item prop="password">
-          <el-input v-model="registerData.registerForm.password" :placeholder="t('login.password')" :prefix-icon="iconAvatar" />
-        </el-form-item>
-      </el-col>
-      <!-- <el-col :span="24" style="padding-left: 10px; padding-right: 10px; margin-top: -20px; margin-bottom: -20px">
-        <el-form-item>
-          <el-row justify="space-between" style="width: 100%">
-            <el-col :span="6">
-              <el-checkbox v-model="registerData.registerForm">
-                {{ t('login.register') }}
-              </el-checkbox>
-            </el-col>
-          </el-row>
-        </el-form-item>
-      </el-col> -->
-      <el-col :span="24" style="padding-left: 10px; padding-right: 10px">
-        <el-form-item>
-          <XButton :loading="loginLoading" :title="t('login.login')" class="w-[100%]" type="primary" @click="register()" />
-        </el-form-item>
-      </el-col>
-      <!-- <Verify ref="verify" :captchaType="captchaType" :imgSize="{ width: '400px', height: '200px' }" mode="pop" @success="handleLogin" /> -->
-    </el-row>
-  </el-form>
+    <template #title>
+      <LoginFormTitle style="width: 100%" />
+    </template>
+
+    <template #code="form">
+      <div class="w-[100%] flex">
+        <el-input v-model="form['code']" :placeholder="t('login.codePlaceholder')" />
+      </div>
+    </template>
+
+    <template #register>
+      <div class="w-[100%]">
+        <XButton
+          :loading="loading"
+          :title="t('login.register')"
+          class="w-[100%]"
+          type="primary"
+          @click="loginRegister()"
+        />
+      </div>
+      <div class="mt-15px w-[100%]">
+        <XButton :title="t('login.hasUser')" class="w-[100%]" @click="handleBackLogin()" />
+      </div>
+    </template>
+  </Form>
 </template>
-<script lang="ts" name="LoginForm" setup>
-import { ElLoading } from 'element-plus'
+<script lang="ts" setup>
+import type { FormRules } from 'element-plus'
+
+import { useForm } from '@/hooks/web/useForm'
+import { useValidator } from '@/hooks/web/useValidator'
 import LoginFormTitle from './LoginFormTitle.vue'
-import type { RouteLocationNormalizedLoaded } from 'vue-router'
+import { LoginStateEnum, useLoginState } from './useLogin'
+import { FormSchema } from '@/types/form'
 
-import { useIcon } from '@/hooks/web/useIcon'
+defineOptions({ name: 'RegisterForm' })
 
-import * as authUtil from '@/utils/auth'
-import { usePermissionStore } from '@/store/modules/permission'
-import * as LoginApi from '@/api/login'
-import { LoginStateEnum, useFormValid, useLoginState } from './useLogin'
-import { LocaleSelect } from '@/layout/components/LocaleDropdown'
-import { useAppStore } from '@/store/modules/app'
 const { t } = useI18n()
-//const message = useMessage()
-const iconAvatar = useIcon({ icon: 'ep:avatar' })
-// const iconLock = useIcon({ icon: 'ep:lock' })
-const formLogin = ref()
-const { validForm } = useFormValid(formLogin)
-const { getLoginState, setLoginState } = useLoginState()
-const { currentRoute, push } = useRouter()
-const permissionStore = usePermissionStore()
-const redirect = ref<string>('')
-const loginLoading = ref(false)
-// const verify = ref()
-// const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字
-const appStore = useAppStore()
-const locale = computed(() => appStore.getLocale)
-const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN)
-
-const RegisterRules = {
-  mobile: [required],
-  password: [required]
-}
-const registerData = reactive({
-  isShowPassword: false,
-  captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
-  tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
-  registerForm: {
-    mobile: '',
-    password: ''
-  }
-})
+const { required } = useValidator()
+const { register, elFormRef } = useForm()
+const { handleBackLogin, getLoginState } = useLoginState()
+const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER)
 
-// 获取验证码
-// const getCode = async () => {
-//   // 情况一,未开启:则直接登录
-//   console.log('oginData.captchaEnable:', registerData.captchaEnable)
-//   if (registerData.captchaEnable === 'false') {
-//     // await register({
-//     // })
-//   } else {
-//     // 情况二,已开启:则展示验证码;只有完成验证码的情况,才进行登录
-//     // 弹出验证码
-//     // verify.value.show()
-//   }
-// }
-//获取租户ID
-const getTenantId = async () => {
-  // if (registerData.tenantEnable === 'true') {
-  //   const res = await LoginApi.getTenantIdByName(registerData.registerForm.tenantName)
-  //   authUtil.setTenantId(res)
-  // }
-}
-// 记住我
-const getCookie = () => {
-  // const loginForm = authUtil.getLoginForm()
-  // if (loginForm) {
-  //   registerData.registerForm = {
-  //     ...registerData.registerForm,
-  //     password: loginForm.password ? loginForm.password : registerData.registerForm.password,
-  //   }
-  // }
-}
-// 注册
-const register = async () => {
-  loginLoading.value = true
-  try {
-    await getTenantId()
-    const data = await validForm()
-    if (!data) {
-      return
+const schema = reactive<FormSchema[]>([
+  {
+    field: 'title',
+    colProps: {
+      span: 24
+    }
+  },
+  {
+    field: 'username',
+    label: t('login.username'),
+    value: '',
+    component: 'Input',
+    colProps: {
+      span: 24
+    },
+    componentProps: {
+      placeholder: t('login.usernamePlaceholder')
     }
-    // registerData.registerForm.captchaVerification = params.captchaVerification
-    const res = await LoginApi.register(registerData.registerForm)
-    if (!res) {
-      return
+  },
+  {
+    field: 'password',
+    label: t('login.password'),
+    value: '',
+    component: 'InputPassword',
+    colProps: {
+      span: 24
+    },
+    componentProps: {
+      style: {
+        width: '100%'
+      },
+      strength: true,
+      placeholder: t('login.passwordPlaceholder')
     }
-    ElLoading.service({
-      lock: true,
-      text: t('login.loadingSystem'),
-      background: 'rgba(0, 0, 0, 0.7)'
-    })
-    // if (registerData.registerForm) {
-    //   authUtil.setLoginForm(registerData.registerForm)
-    // } else {
-    //   authUtil.removeLoginForm()
-    // }
-    authUtil.setToken(res)
-    if (!redirect.value) {
-      redirect.value = '/'
+  },
+  {
+    field: 'check_password',
+    label: t('login.checkPassword'),
+    value: '',
+    component: 'InputPassword',
+    colProps: {
+      span: 24
+    },
+    componentProps: {
+      style: {
+        width: '100%'
+      },
+      strength: true,
+      placeholder: t('login.passwordPlaceholder')
     }
-    // 判断是否为SSO登录
-    if (redirect.value.indexOf('sso') !== -1) {
-      window.location.href = window.location.href.replace('/login?redirect=', '')
-    } else {
-      push({ path: redirect.value || permissionStore.addRouters[0].path })
+  },
+  {
+    field: 'code',
+    label: t('login.code'),
+    colProps: {
+      span: 24
+    }
+  },
+  {
+    field: 'register',
+    colProps: {
+      span: 24
     }
-  } catch {
-    loginLoading.value = false
-  } finally {
-    setTimeout(() => {
-      const loadingInstance = ElLoading.service()
-      loadingInstance.close()
-    }, 400)
   }
+])
+
+const rules: FormRules = {
+  username: [required()],
+  password: [required()],
+  check_password: [required()],
+  code: [required()]
 }
 
-watch(
-  () => currentRoute.value,
-  (route: RouteLocationNormalizedLoaded) => {
-    if (route.name === 'register') {
-      setLoginState(LoginStateEnum.REGISTER)
-      // init()
+const loading = ref(false)
+
+const loginRegister = async () => {
+  const formRef = unref(elFormRef)
+  formRef?.validate(async (valid) => {
+    if (valid) {
+      try {
+        loading.value = true
+      } finally {
+        loading.value = false
+      }
     }
-  },
-  { immediate: true }
-)
-onMounted(() => {
-  getCookie()
-})
+  })
+}
 </script>
-
-<style lang="scss" scoped></style>

+ 7 - 8
src/views/Login/components/SSOLogin.vue

@@ -8,7 +8,7 @@
     <div>
       <el-form :model="formData" class="login-form">
         <!-- 授权范围的选择 -->
-        {{t('login.thisThirdPartyApplicationRequestsTheFollowingPermissions')}}
+        此第三方应用请求获得以下权限:
         <el-form-item prop="scopes">
           <el-checkbox-group v-model="formData.scopes">
             <el-checkbox
@@ -29,10 +29,10 @@
             type="primary"
             @click.prevent="handleAuthorize(true)"
           >
-            <span v-if="!formLoading">{{t('login.agreeToAuthorization')}}</span>
-            <span v-else>{{t('login.authorizationIn')}}</span>
+            <span v-if="!formLoading">同意授权</span>
+            <span v-else>授 权 中...</span>
           </el-button>
-          <el-button class="w-3/10" @click.prevent="handleAuthorize(false)">{{t('login.rejection')}}</el-button>
+          <el-button class="w-3/10" @click.prevent="handleAuthorize(false)">拒绝</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -43,7 +43,6 @@ import LoginFormTitle from './LoginFormTitle.vue'
 import * as OAuth2Api from '@/api/login/oauth2'
 import { LoginStateEnum, useLoginState } from './useLogin'
 import type { RouteLocationNormalizedLoaded } from 'vue-router'
-const { t } = useI18n()
 
 defineOptions({ name: 'SSOLogin' })
 
@@ -178,9 +177,9 @@ const formatScope = (scope) => {
   // 这里仅仅是一个 demo,可以考虑录入到字典数据中,例如说字典类型 "system_oauth2_scope",它的每个 scope 都是一条字典数据。
   switch (scope) {
     case 'user.read':
-      return t('login.accessYourPersonalInformation')
+      return '访问你的个人信息'
     case 'user.write':
-      return t('login.modifyYourPersonalInformation')
+      return '修改你的个人信息'
     default:
       return scope
   }
@@ -192,7 +191,7 @@ watch(
   (route: RouteLocationNormalizedLoaded) => {
     if (route.name === 'SSOLogin') {
       setLoginState(LoginStateEnum.SSO)
-      init() 
+      init()
     }
   },
   { immediate: true }

+ 1 - 3
src/views/Login/components/index.ts

@@ -4,7 +4,7 @@
       ref="cropperRef"
       :btnProps="{ preIcon: 'ant-design:cloud-upload-outlined' }"
       :showBtn="false"
-      :value="convertImageUrl(img)"
+      :value="img"
       width="120px"
       @change="handelUpload"
     />
@@ -15,8 +15,6 @@ import { propTypes } from '@/utils/propTypes'
 import { uploadAvatar } from '@/api/system/user/profile'
 import { CropperAvatar } from '@/components/Cropper'
 import { useUserStore } from '@/store/modules/user'
-import { convertImageUrl } from '@/utils/image-helper'
-const { t } = useI18n()
 
 
 defineOptions({ name: 'UserAvatar' })

+ 9 - 10
src/views/Profile/components/UserSocial.vue

@@ -1,21 +1,21 @@
 <template>
   <el-table :data="socialUsers" :show-header="false">
-    <el-table-column fixed="left" :title="t('profile.serialNumber')" type="seq" width="60" />
-    <el-table-column align="left" :label="t('profile.socialPlatform')" width="120">
+    <el-table-column fixed="left" title="序号" type="seq" width="60" />
+    <el-table-column align="left" label="社交平台" width="120">
       <template #default="{ row }">
         <img :src="row.img" alt="" class="h-5 align-middle" />
         <p class="mr-5">{{ row.title }}</p>
       </template>
     </el-table-column>
-    <el-table-column align="center" :label="t('public.operate')">
+    <el-table-column align="center" label="操作">
       <template #default="{ row }">
         <template v-if="row.openid">
-          {{t('profile.bound')}}
-          <XTextButton class="mr-5" :title="t('profile.bound')" type="primary" @click="unbind(row)" />
+          已绑定
+          <XTextButton class="mr-5" title="(解绑)" type="primary" @click="unbind(row)" />
         </template>
         <template v-else>
-          {{t('profile.unbound')}}
-          <XTextButton class="mr-5" :title="t('profile.bound1')" type="primary" @click="bind(row)" />
+          未绑定
+          <XTextButton class="mr-5" title="(绑定)" type="primary" @click="bind(row)" />
         </template>
       </template>
     </el-table-column>
@@ -25,7 +25,6 @@
 import { SystemUserSocialTypeEnum } from '@/utils/constants'
 import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 import { socialAuthRedirect, socialBind, socialUnbind } from '@/api/system/user/socialUser'
-const { t } = useI18n()
 
 defineOptions({ name: 'UserSocial' })
 defineProps<{
@@ -65,7 +64,7 @@ const bindSocial = () => {
     return
   }
   socialBind(type, code, state).then(() => {
-    message.success(t('profile.boundSuccessfully'))
+    message.success('绑定成功')
     emit('update:activeName', 'userSocial')
   })
 }
@@ -89,7 +88,7 @@ const unbind = async (row) => {
   if (res) {
     row.openid = undefined
   }
-  message.success(t('profile.unboundSuccessfully'))
+  message.success('解绑成功')
 }
 
 onMounted(async () => {

+ 11 - 11
src/views/Profile/components/index.ts

@@ -7,19 +7,19 @@
       label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item :label="t('express.courierCompanyNumber')" prop="code">
-        <el-input v-model="formData.code" :placeholder="t('express.pleaseEnterTheCourierCompanyNumber')" />
+      <el-form-item label="快递公司编号" prop="code">
+        <el-input v-model="formData.code" placeholder="请输入快递公司编号" />
       </el-form-item>
-      <el-form-item :label="t('express.fullNameOfCourierCompany')" prop="name">
-        <el-input v-model="formData.name" :placeholder="t('express.pleaseEnterTheFullNameOfCourierCompany')" />
+      <el-form-item label="快递公司全称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入快递公司全称" />
       </el-form-item>
-      <el-form-item :label="t('express.sort')" prop="sort">
-        <el-input v-model="formData.sort" :placeholder="t('express.pleaseEnterTheSort')" />
+      <el-form-item label="排序" prop="sort">
+        <el-input type="number" v-model="formData.sort" placeholder="请输入排序" />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{t('common.confirm')}}</el-button>
-      <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
 </template>
@@ -40,9 +40,9 @@ const formData = ref({
   sort: undefined
 })
 const formRules = reactive({
-  code: [{ required: true, message: t('express.theAbbreviationCourierCompanyEmpty'), trigger: 'blur' }],
-  name: [{ required: true, message: t('express.fullNameCourierCompanyEmpty'), trigger: 'blur' }],
-  sort: [{ required: true, message: t('express.sortCannotEmpty'), trigger: 'blur' }]
+  code: [{ required: true, message: '快递公司简称不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: '快递公司全称不能为空', trigger: 'blur' }],
+  sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 111 - 0
src/views/express/ExpressForm2.vue

@@ -0,0 +1,111 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="120px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="快递公司编号" prop="code">
+        <el-input v-model="formData.code" placeholder="请输入快递公司编号" />
+      </el-form-item>
+      <el-form-item label="快递公司全称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入快递公司全称" />
+      </el-form-item>
+      <el-form-item label="排序" prop="sort">
+        <el-input type="number" v-model="formData.sort" placeholder="请输入排序" />
+      </el-form-item>
+      <el-form-item label="是否启用" prop="isMain">
+          <el-radio-group v-model="formData.isMain">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import * as ExpressApi from '@/api/express'
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  code: undefined,
+  name: undefined,
+  sort: undefined
+})
+const formRules = reactive({
+  code: [{ required: true, message: '快递公司简称不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: '快递公司全称不能为空', trigger: 'blur' }],
+  sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = '同城快递'
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await ExpressApi.getExpress(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  if (!formRef) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as ExpressApi.ExpressVO
+    if (formType.value === 'create') {
+      data.type = 1
+      await ExpressApi.createExpress(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await ExpressApi.updateExpress(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    code: undefined,
+    name: undefined,
+    sort: undefined,
+    isMain: 0
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 27 - 21
src/views/express/ExpressSet.vue

@@ -1,5 +1,5 @@
 <template>
-   <div>
+<ContentWrap>
     <el-form
       ref="formRef"
       :model="formData"
@@ -7,28 +7,30 @@
       label-width="120px"
       v-loading="formLoading"
     >
-      <el-form-item label="appId" prop="eBusinessID">
-        <el-input v-model="formData.ebusinessID" :placeholder="t('express.pleaseEnterTheCourierBirdAppId')" />
+      <el-form-item label="key" prop="key">
+        <el-input v-model="formData.key" type="password"  class="!w-240px" placeholder="请输入快递key" />
       </el-form-item>
-      <el-form-item label="appKey" prop="apiKey">
-        <el-input v-model="formData.apiKey" type="password" :placeholder="t('express.pleaseEnterTheCourierBirdAppKey')" />
+      <el-form-item label="customer" prop="customer">
+        <el-input v-model="formData.customer" type="password" class="!w-240px" placeholder="请输入快递customery" />
       </el-form-item>
-      <el-form-item :label="t('express.isPaidPackage')" prop="isFree">
-        <el-radio-group v-model="formData.isFree">
-          <el-radio :label="false">{{t('common.yes')}}</el-radio>
-          <el-radio :label="true">{{t('common.no')}}</el-radio>
-        </el-radio-group>
+      <el-form-item label="secret" prop="secret">
+        <el-input v-model="formData.secret" type="password" class="!w-240px" placeholder="请输入快递secret" />
       </el-form-item>
-      <el-form-item label=" " prop="">
-        <el-button @click="submitForm" type="primary">{{t('common.confirm')}}</el-button>
-        <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+      <el-form-item label="回调地址" prop="callBackUrl">
+        <el-input v-model="formData.callBackUrl"  class="!w-340px" placeholder="请输入快递回调地址" />
+      </el-form-item>
+      <el-form-item label="是否正式环境" prop="env">
+          <el-radio-group v-model="formData.env">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
       </el-form-item>
       <el-form-item label=" " prop="">
-        <span><span style="color: red;">{{t('express.theThirdPartyTips')}}</span>
-          <a href="http://www.kdniao.com/reg?from=cbb-yx " style="color:blue">{{t('express.iRegister')}}</a></span>
+        <el-button @click="submitForm" type="primary">确 定</el-button>
+        <el-button @click="dialogVisible = false">取 消</el-button>
       </el-form-item>
     </el-form>
-    </div>
+  </ContentWrap>
 </template>
 <script setup lang="ts">
 import * as ExpressApi from '@/api/express'
@@ -41,14 +43,18 @@ const dialogVisible = ref(true) // 弹窗的是否展示
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 // const formType = ref('') // 表单的类型:create - 新增;update - 修改
 const formData = ref({
-  ebusinessID: "",
-  apiKey: "",
-  isFree: true
+  key: "",
+  customer: "",
+  secret: "",
+  env:0,
+  callBackUrl: ''
 
 })
 const formRules = reactive({
-  appId: [{ required: true, message: t('express.courierBirdAppIdCannotBeEmpty'), trigger: 'blur' }],
-  appKey: [{ required: true, message: t('express.courierBirdAppKeyCannotBeEmpty'), trigger: 'blur' }]
+  key: [{ required: true, message: '快递key不能为空', trigger: 'blur' }],
+  customer: [{ required: true, message: '快递customer不能为空', trigger: 'blur' }],
+  secret: [{ required: true, message: '快递secret不能为空', trigger: 'blur' }],
+  callBackUrl: [{ required: true, message: '回调地址不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 

+ 18 - 26
src/views/express/index.vue

@@ -8,43 +8,34 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item :label="t('express.ompanyCode')" prop="code">
+      <el-form-item label="公司编码" prop="code">
         <el-input
           v-model="queryParams.code"
-          :placeholder="t('express.pleaseEnterTheCourierCompanyCode')"
+          placeholder="请输入快递公司编码"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item :label="t('express.companyFullName')" prop="name">
+      <el-form-item label="公司全称" prop="name">
         <el-input
           v-model="queryParams.name"
-          :placeholder="t('express.pleaseEnterTheCourierCompanyFullName')"
+          placeholder="请输入快递公司全称"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
         <el-button
           type="primary"
           plain
           @click="openForm('create')"
           v-hasPermi="['order:express:create']"
         >
-          <Icon icon="ep:plus" class="mr-5px" /> {{t('action.add')}}
-        </el-button>
-        <el-button
-          type="success"
-          plain
-          @click="handleExport"
-          :loading="exportLoading"
-          v-hasPermi="['order:express:export']"
-        >
-          <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
         </el-button>
       </el-form-item>
     </el-form>
@@ -53,17 +44,17 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column :label="t('express.ompanyCode')" align="center" prop="id" />
-      <el-table-column :label="t('express.courierCompanyCode')" align="center" prop="code" />
-      <el-table-column :label="t('express.courierCompanyFullName')" align="center" prop="name" />
-      <el-table-column :label="t('express.sort')" align="center" prop="sort" />
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="快递公司编码" align="center" prop="code" />
+      <el-table-column label="快递公司全称" align="center" prop="name" />
+      <el-table-column label="排序" align="center" prop="sort" />
       <el-table-column
-        :label="t('express.addTime')"
+        label="添加时间"
         align="center"
         prop="createTime"
         :formatter="dateFormatter"
       />
-      <el-table-column :label="t('public.operate')" align="center">
+      <el-table-column label="操作" align="center">
         <template #default="scope">
           <el-button
             link
@@ -71,7 +62,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['order:express:update']"
           >
-            {{t('action.edit')}}
+            编辑
           </el-button>
           <el-button
             link
@@ -79,7 +70,7 @@
             @click="handleDelete(scope.row.id)"
             v-hasPermi="['order:express:delete']"
           >
-            {{t('action.delete')}}
+            删除
           </el-button>
         </template>
       </el-table-column>
@@ -112,7 +103,8 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   code: null,
-  name: null
+  name: null,
+  type: 0
 })
 const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中
@@ -168,7 +160,7 @@ const handleExport = async () => {
     // 发起导出
     exportLoading.value = true
     const data = await ExpressApi.exportExpress(queryParams)
-    download.excel(data, t('express.courierCompanyXls'))
+    download.excel(data, '快递公司.xls')
   } catch {
   } finally {
     exportLoading.value = false

+ 165 - 0
src/views/express/index2.vue

@@ -0,0 +1,165 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+     
+      <el-form-item>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 刷新</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['order:express:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="id" align="center" prop="id" />
+      <el-table-column label="快递公司编码" align="center" prop="code" />
+      <el-table-column label="快递公司全称" align="center" prop="name" />
+      <el-table-column label="是否启用" align="center" prop="isMain">
+        <template #default="scope">
+          <div v-if="scope.row.isMain == 1">
+            启用
+          </div>
+          <div v-else>
+            不启用
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="添加时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+      />
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['order:express:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['order:express:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <ExpressForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts" name="Express">
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import * as ExpressApi from '@/api/express'
+import ExpressForm from './ExpressForm2.vue'
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const total = ref(0) // 列表的总页数
+const list = ref([]) // 列表的数据
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  code: null,
+  name: null,
+  type: 1
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await ExpressApi.getExpressPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await ExpressApi.deleteExpress(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await ExpressApi.exportExpress(queryParams)
+    download.excel(data, '快递公司.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

Деякі файли не було показано, через те що забагато файлів було змінено