lrf 1 年間 前
コミット
f171fffe49

+ 171 - 26
package-lock.json

@@ -10,6 +10,7 @@
       "dependencies": {
         "@element-plus/icons-vue": "^2.3.1",
         "@vueuse/core": "^10.7.2",
+        "@vueuse/integrations": "^10.9.0",
         "axios": "^1.6.7",
         "element-plus": "^2.5.6",
         "lodash-es": "^4.17.21",
@@ -17,6 +18,7 @@
         "path-browserify": "^1.0.1",
         "path-to-regexp": "^6.2.1",
         "pinia": "^2.1.7",
+        "universal-cookie": "^7.1.0",
         "vue": "^3.4.15",
         "vue-i18n": "^9.9.1",
         "vue-router": "^4.2.5"
@@ -985,6 +987,11 @@
         "node": ">=10.13.0"
       }
     },
+    "node_modules/@types/cookie": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/@types/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
+    },
     "node_modules/@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
@@ -1156,14 +1163,14 @@
       "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw=="
     },
     "node_modules/@vueuse/core": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.7.2.tgz",
-      "integrity": "sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==",
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.9.0.tgz",
+      "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==",
       "dependencies": {
         "@types/web-bluetooth": "^0.0.20",
-        "@vueuse/metadata": "10.7.2",
-        "@vueuse/shared": "10.7.2",
-        "vue-demi": ">=0.14.6"
+        "@vueuse/metadata": "10.9.0",
+        "@vueuse/shared": "10.9.0",
+        "vue-demi": ">=0.14.7"
       }
     },
     "node_modules/@vueuse/core/node_modules/vue-demi": {
@@ -1188,17 +1195,101 @@
         }
       }
     },
+    "node_modules/@vueuse/integrations": {
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-10.9.0.tgz",
+      "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==",
+      "dependencies": {
+        "@vueuse/core": "10.9.0",
+        "@vueuse/shared": "10.9.0",
+        "vue-demi": ">=0.14.7"
+      },
+      "peerDependencies": {
+        "async-validator": "*",
+        "axios": "*",
+        "change-case": "*",
+        "drauu": "*",
+        "focus-trap": "*",
+        "fuse.js": "*",
+        "idb-keyval": "*",
+        "jwt-decode": "*",
+        "nprogress": "*",
+        "qrcode": "*",
+        "sortablejs": "*",
+        "universal-cookie": "*"
+      },
+      "peerDependenciesMeta": {
+        "async-validator": {
+          "optional": true
+        },
+        "axios": {
+          "optional": true
+        },
+        "change-case": {
+          "optional": true
+        },
+        "drauu": {
+          "optional": true
+        },
+        "focus-trap": {
+          "optional": true
+        },
+        "fuse.js": {
+          "optional": true
+        },
+        "idb-keyval": {
+          "optional": true
+        },
+        "jwt-decode": {
+          "optional": true
+        },
+        "nprogress": {
+          "optional": true
+        },
+        "qrcode": {
+          "optional": true
+        },
+        "sortablejs": {
+          "optional": true
+        },
+        "universal-cookie": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/integrations/node_modules/vue-demi": {
+      "version": "0.14.7",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
+      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vueuse/metadata": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.7.2.tgz",
-      "integrity": "sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ=="
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.9.0.tgz",
+      "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA=="
     },
     "node_modules/@vueuse/shared": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.7.2.tgz",
-      "integrity": "sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==",
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.9.0.tgz",
+      "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==",
       "dependencies": {
-        "vue-demi": ">=0.14.6"
+        "vue-demi": ">=0.14.7"
       }
     },
     "node_modules/@vueuse/shared/node_modules/vue-demi": {
@@ -1675,6 +1766,14 @@
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "dev": true
     },
+    "node_modules/cookie": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
     "node_modules/copy-descriptor": {
       "version": "0.1.1",
       "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
@@ -5274,6 +5373,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/universal-cookie": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/universal-cookie/-/universal-cookie-7.1.0.tgz",
+      "integrity": "sha512-LCLHwP0whxTqkBYMptW1dzNS0xxIVJmU6c51N5CfPNheVxuJW7fVxPa6MUGX7boUSyOlpMveBO96hMs5Gee6Fg==",
+      "dependencies": {
+        "@types/cookie": "^0.6.0",
+        "cookie": "^0.6.0"
+      }
+    },
     "node_modules/universalify": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
@@ -6366,6 +6474,11 @@
       "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
       "dev": true
     },
+    "@types/cookie": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/@types/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
+    },
     "@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
@@ -6524,14 +6637,32 @@
       "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw=="
     },
     "@vueuse/core": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.7.2.tgz",
-      "integrity": "sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==",
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.9.0.tgz",
+      "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==",
       "requires": {
         "@types/web-bluetooth": "^0.0.20",
-        "@vueuse/metadata": "10.7.2",
-        "@vueuse/shared": "10.7.2",
-        "vue-demi": ">=0.14.6"
+        "@vueuse/metadata": "10.9.0",
+        "@vueuse/shared": "10.9.0",
+        "vue-demi": ">=0.14.7"
+      },
+      "dependencies": {
+        "vue-demi": {
+          "version": "0.14.7",
+          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
+          "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+          "requires": {}
+        }
+      }
+    },
+    "@vueuse/integrations": {
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-10.9.0.tgz",
+      "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==",
+      "requires": {
+        "@vueuse/core": "10.9.0",
+        "@vueuse/shared": "10.9.0",
+        "vue-demi": ">=0.14.7"
       },
       "dependencies": {
         "vue-demi": {
@@ -6543,16 +6674,16 @@
       }
     },
     "@vueuse/metadata": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.7.2.tgz",
-      "integrity": "sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ=="
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.9.0.tgz",
+      "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA=="
     },
     "@vueuse/shared": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.7.2.tgz",
-      "integrity": "sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==",
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.9.0.tgz",
+      "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==",
       "requires": {
-        "vue-demi": ">=0.14.6"
+        "vue-demi": ">=0.14.7"
       },
       "dependencies": {
         "vue-demi": {
@@ -6920,6 +7051,11 @@
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "dev": true
     },
+    "cookie": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz",
+      "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
+    },
     "copy-descriptor": {
       "version": "0.1.1",
       "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
@@ -9754,6 +9890,15 @@
         "set-value": "^2.0.1"
       }
     },
+    "universal-cookie": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/universal-cookie/-/universal-cookie-7.1.0.tgz",
+      "integrity": "sha512-LCLHwP0whxTqkBYMptW1dzNS0xxIVJmU6c51N5CfPNheVxuJW7fVxPa6MUGX7boUSyOlpMveBO96hMs5Gee6Fg==",
+      "requires": {
+        "@types/cookie": "^0.6.0",
+        "cookie": "^0.6.0"
+      }
+    },
     "universalify": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",

+ 2 - 0
package.json

@@ -13,6 +13,7 @@
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",
     "@vueuse/core": "^10.7.2",
+    "@vueuse/integrations": "^10.9.0",
     "axios": "^1.6.7",
     "element-plus": "^2.5.6",
     "lodash-es": "^4.17.21",
@@ -20,6 +21,7 @@
     "path-browserify": "^1.0.1",
     "path-to-regexp": "^6.2.1",
     "pinia": "^2.1.7",
+    "universal-cookie": "^7.1.0",
     "vue": "^3.4.15",
     "vue-i18n": "^9.9.1",
     "vue-router": "^4.2.5"

+ 2 - 2
src/components/LangSelect/index.vue

@@ -9,7 +9,7 @@ const { locale } = useI18n()
 function handleLanguageChange(lang) {
   locale.value = lang
   appStore.changeLanguage(lang)
-  if (lang === 'en') {
+  if (lang === 'en-us') {
     ElMessage.success('Switch Language Successful!')
   } else {
     ElMessage.success('切换语言成功!')
@@ -25,7 +25,7 @@ function handleLanguageChange(lang) {
     <template #dropdown>
       <el-dropdown-menu>
         <el-dropdown-item :disabled="appStore.language === 'zh-cn'" command="zh-cn">中文</el-dropdown-item>
-        <el-dropdown-item :disabled="appStore.language === 'en'" command="en"> English</el-dropdown-item>
+        <el-dropdown-item :disabled="appStore.language === 'en-us'" command="en-us"> English</el-dropdown-item>
       </el-dropdown-menu>
     </template>
   </el-dropdown>

+ 1 - 1
src/lang/index.js

@@ -8,7 +8,7 @@ const messages = {
   'zh-cn': {
     ...zhCnLocale
   },
-  en: {
+  'en-us': {
     ...enLocale
   }
 }

+ 19 - 0
src/lang/package/en/common.js

@@ -0,0 +1,19 @@
+export default {
+  opera: '操作',
+  add: '添加',
+  update: '修改',
+  delete: '删除',
+  delete_confirm: '您确定删除该数据?',
+  search: '查询',
+  view: '查看',
+  save: '保存',
+  submit: '提交',
+  is_use_abled: '启用',
+  is_use_disabled: '禁用',
+  yes: '是',
+  no: '否',
+  no_method: '功能暂未开放',
+  warning: '注意',
+  confirm: '确定',
+  cancel: '取消'
+}

+ 50 - 1
src/lang/package/en/pages.js

@@ -1,6 +1,55 @@
 export default {
   menus: {
+    dialogTitle: '菜单信息',
+    is_default: '是否默认',
     name: '菜单名称',
-    parent_name: '父级菜单'
+    namePh: '请填写菜单名称',
+    route_name: '路由名称',
+    route_namePh: '请填写路由名称',
+    i18n_code: '国际化编码',
+    i18n_codePh: '请填写国际化编码并确保与国际化文件中的编码一致',
+    parentName: '父级菜单',
+    icon: '图标',
+    iconPh: '请选择图标',
+    order_num: '顺序',
+    path: '路由地址',
+    pathPh: '请填写路由地址',
+    component: '组件地址',
+    componentPh: '请填写组件地址',
+    type: '菜单类型',
+    typePh: '请选择菜单类型',
+    is_use: '状态',
+    remark: '备注',
+    remarkPh: '请输入备注',
+    addNext: '添加下一级',
+    baseInfo: '基本信息',
+    configInfo: '功能列表',
+    config_zh: '功能说明',
+    config_code: '功能编码',
+    add_config: '添加功能'
+  },
+  role: {
+    dialogTitle: '角色信息',
+    name: '角色名称',
+    namePh: '请填写角色名称',
+    code: '角色代码',
+    codePh: '请填写角色代码',
+    brief: '简介',
+    menu: '权限配置',
+    is_use: '是否启用'
+  },
+  admin: {
+    dialogTitle: '用户信息',
+    account: '账号',
+    nick_name: '名称',
+    role: '角色',
+    is_super: '是否是超级管理员',
+    is_use: '是否启用',
+    bind: '绑定用户',
+    rp: '重置密码',
+    rpConfirm: '您确定要重置密码?',
+    changeToAbled: '您确定要启用该用户?',
+    changeToDisabled: '您确定要禁用该用户?',
+    password: '密码'
   }
 }

+ 8 - 3
src/store/modules/app.js

@@ -1,16 +1,19 @@
 import defaultSettings from '@/settings'
 import { useStorage } from '@vueuse/core'
-
+import { useCookies } from '@vueuse/integrations/useCookies'
 // 导入 Element Plus 中英文语言包
 import zhCn from 'element-plus/es/locale/lang/zh-cn'
 import en from 'element-plus/es/locale/lang/en'
+const cookies = useCookies()
 
 // setup
 export const useAppStore = defineStore('app', () => {
   // state
   const device = useStorage('device', 'desktop')
   const size = useStorage('size', defaultSettings.size)
-  const language = useStorage('language', defaultSettings.language)
+  let lang = cookies.get('locale')
+  if(!lang) lang = defaultSettings.language
+  const language = useStorage('language', lang)
   const sidebarStatus = useStorage('sidebarStatus', 'closed')
 
   const sidebar = reactive({
@@ -22,7 +25,7 @@ export const useAppStore = defineStore('app', () => {
    * 根据语言标识读取对应的语言包
    */
   const locale = computed(() => {
-    if (language?.value == 'en') {
+    if (language?.value == 'en-us') {
       return en
     } else {
       return zhCn
@@ -63,6 +66,8 @@ export const useAppStore = defineStore('app', () => {
    */
   function changeLanguage(val) {
     language.value = val
+    // cookie切换
+    cookies.set('locale', val, { path: '/' })
   }
   /**
    * 混合模式顶部切换

+ 2 - 1
src/utils/axios-wrapper.js

@@ -76,7 +76,8 @@ export class AxiosWrapper {
     try {
       let returnData
       const axios = Axios.create({
-        baseURL: this.baseUrl
+        baseURL: this.baseUrl,
+        withCredentials: true
       })
       // if (util.token && util.token !== null) axios.defaults.headers.common.Authorization = util.token;
       const token = localStorage.getItem('token')

+ 1 - 1
src/views/user/admin/index.vue

@@ -72,7 +72,7 @@ const opera = [
 const buttonFields = [{ label: t('common.add'), method: 'add' }]
 const searchForm = ref({})
 const search = async (query = { skip: 0, limit }) => {
-  const info = { skip: query.skip, limit: query.limit, ...searchForm.value, is_del: '0' }
+  const info = { skip: query.skip, limit: query.limit, ...searchForm.value }
   const res = await store.query(info)
   if (res.errcode == '0') {
     data.value = res.data